[英]Java trouble with SocketChannel connections
這是一個課堂作業,因此我需要的不僅僅是提示。
我有一個在四台虛擬linux計算機上運行的進程。 每個進程都與其兩個鄰居進行通信。 每個過程使用
server = ServerSocketChannel.open()
server.configureBlocking(false)
server.socket().bind(new InetSocketAddress(port))
server.register(selector, SelectionKey.OP_ACCEPT)
在啟動時,進程A不會嘗試連接任何人。 流程B確實
SocketChannel SC = SocketChannel.open()
SC.configureBlocking( false )
SC.connect(new INetSocketAddress( A-machine, A-port )
SC.register( selector, SC.validOps())
進程C與B相同; 和D與C。
接下來,我調用selector.select並遍歷任何selectedKeys。 當我看到key.isValid()和&key.isAcceptable()都為真時,我認為一個套接字正在嘗試連接到我,我打電話
SocketChannel client = server.accept()
client.configureBlocking(false)
client.register(selector, client.validOps() )
當我看到key.isValid()&& key.isConnectable()都為真時,我認為服務器可供我連接。 我打電話
SocketChannel connectingChannel = (SocketChannel)key.channel()
connectingChannel.finishConnect()
當我看到key.isValid()&& key.isReadable()時,我讀了一條收到的消息。
當我按順序啟動過程時,此過程就很久了:A,B,C,D。如果我僅啟動B,則在finishConnect語句上失敗。
我閱讀了文檔,其中isConnectable測試了此密鑰的通道是否已完成其套接字連接操作或未能完成其套接字連接操作。 isConnectable如何正確,在finishConnect上出現故障?
我們在finishConnect周圍進行了一次try / catch。 在catch內,我們在當前的SelectionKey上調用了cancel,然后調用了嘗試進行連接的方法(原始問題描述中的第二個片段):
SocketChannel SC = SocketChannel.open()
SC.configureBlocking( false )
SC.connect(new INetSocketAddress( A-machine, A-port )
SC.register( selector, SC.validOps())
預期我們將必須執行此操作,因此添加了代碼來存儲SC與A機和A端口之間的關系,因此重試時將具有它們。 因此,在取消之前的陷阱中,我們使用了發生故障的SocketChannel查找我們將需要的必要的A機和A端口數據。
最終,服務器啟動,此連接成功建立。
我知道這是一個答案,而不是一個提示,但這是我們的任務:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.