嗨我試圖實現一個簡單的Java NIO服務器;它使用選擇器註冊socketChannel。因此,我希望聽取客戶的意見併發回一些迴應。在向選擇器註冊socketChannel之後,即使客戶端(非NIO)發送了一些數據,服務器也無法讀取;生成的密鑰仍在迭代中。NIO服務器無法收聽客戶端
詳細視圖:服務器端:
**First thread**:
公共無效的run(){ 而(真){
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
serverSocketChannel.configureBlocking(true);
serverSocketChannel.socket().bind(inetAdressOfServer);
SocketChannel clientChannel = serverSocketChannel.accept();
new Listener("").addSocketChannel(clientChannel);
}}
**Second Thread**:
static Selector selector = Selector.open();
public boolean addSocketChannel(SocketChannel clientChannel) {
SelectionKey key = clientSocketChannel.register(selector, selector.OP_READ|SelectionKey.OP_WRITE);
key.attach(new ChannelCallback(clientSocketChannel));
return key.isValid();
}
public void run() {
Set keysSet = selector.keys();
Iterator i = keysSet.iterator();
while (i.hasNext()) {
SelectionKey key = (SelectionKey) i.next();
}
if (key.isReadable()) {
//read and do something
}
}
Client Side:
Socket socket = new Socket(serverIP, serverPort);
DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
dos.writeBytes(str + "\n");
注意:當在單線程中完成,同樣的程序工作,但當以上述方式實施時,不會聽取客戶的意見。 請幫我解決這個問題。
我每時每刻都在想,人們仍然會用迭代器的6年Java-1.4寫作風格。舊的Java書籍和教程仍然如此廣泛?這讓我很難過。 – 2009-05-25 18:42:20