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)
}
}
}
}
Ich erstelle einen SocketChannel und registriere ihn in einem Selektor und lege dann ein Objekt an den Schlüssel an.gibt es einen Fehler über selectionKey.attachment() in Java nio?
Wenn ich das erste OP_CONNECT-Ereignis erhalte, kann ich den Anhang erfolgreich erhalten. , aber die Anlage() gibt beim nächsten OP_READ-Ereignis null zurück?
warum?
Möglicherweise möchten Sie ein Tag einfügen, das die von Ihnen verwendete Sprache angibt. – matt
Ich drucke den Schlüssel, es zeigt, dass der Schlüssel der gleiche ist. – Tony
Welche Zeile scheint das Problem zu verursachen? –