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を作成し、それをセレクタに登録し、Objectをキーにアタッチします。java nioのselectionKey.attachment()に関するバグはありますか?
最初のOP_CONNECTイベントを受け取ったときに、正常に添付ファイルを取得できます。 次のOP_READイベントで、attachment()はnullを返しますか?
なぜですか?
使用している言語を示すタグを含めることができます。 – matt
私は鍵を印刷します、それは鍵が同じものであることを示します。 – Tony
問題を引き起こしているラインはどれですか? –