-1
fun main(args: Array<String>) {
val selector = Selector.open()
val sc = SocketChannel.open()
sc.configureBlocking(false)
sc.connect(InetSocketAddress(1234))
val key = sc.register(selector, SelectionKey.OP_CONNECT)
println("key=$key")
key.attach(ClientAttachment())
writeThread(sc)
while (selector.isOpen) {
if (selector.select() == 0) continue
val keys = selector.selectedKeys().iterator()
while (keys.hasNext()) {
val key = keys.next()
println("key=$key")
println("ac=${key.attachment()}")
keys.remove()
if (key.isConnectable) {
val c = key.channel() as SocketChannel
while (!c.finishConnect()) {
Thread.sleep(100)
}
println("連接服務器成功")
c.register(selector, SelectionKey.OP_READ)
} else if (key.isReadable) {
handleRead(key)
}
}
}
}
我創建一個SocketChannel,並將其註冊到選擇器,然後將一個對象附加到該鍵。有沒有關於java nio中的selectionKey.attachment()的任何錯誤?
當我收到第一個OP_CONNECT事件時,我可以成功獲取附件。 但在下一個OP_READ事件中,attachment()返回null?
爲什麼?
您可能希望包含一個標記,指明您正在使用的語言。 – matt
我打印的關鍵,它表明關鍵是一樣的。 – Tony
哪條線似乎會導致問題? –