-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
哪条线似乎会导致问题? –