关于Java NIO2。
假设我们有以下内容来监听客户端请求......
asyncServerSocketChannel.accept(null, new CompletionHandler <AsynchronousSocketChannel, Object>() {
@Override
public void completed(final AsynchronousSocketChannel asyncSocketChannel, Object attachment) {
// Put the execution of the Completeion handler on another thread so that
// we don't block another channel being accepted.
executer.submit(new Runnable() {
public void run() {
handle(asyncSocketChannel);
}
});
// call another.
asyncServerSocketChannel.accept(null, this);
}
@Override
public void failed(Throwable exc, Object attachment) {
// TODO Auto-generated method stub
}
});
此代码将接受一个客户端连接处理它,然后接受另一个。为了与服务器通信,客户端打开一个 AsyncSocketChannel 并触发消息。然后调用完成处理程序 completed() 方法。
但是,这意味着如果客户端想要在同一个 AsyncSocket 实例上发送另一条消息,它就不能。
它必须创建另一个 AsycnSocket 实例——我相信这意味着另一个 TCP 连接——这会影响性能。
任何想法如何解决这个问题?
或者以另一种方式提出问题,任何想法如何使相同的 asyncSocketChannel 接收多个 CompleteionHandler completed() 事件?
编辑:我的处理代码是这样的......
public void handle(AsynchronousSocketChannel asyncSocketChannel) {
ByteBuffer readBuffer = ByteBuffer.allocate(100);
try {
// read a message from the client, timeout after 10 seconds
Future<Integer> futureReadResult = asyncSocketChannel.read(readBuffer);
futureReadResult.get(10, TimeUnit.SECONDS);
String receivedMessage = new String(readBuffer.array());
// some logic based on the message here...
// after the logic is a return message to client
ByteBuffer returnMessage = ByteBuffer.wrap((RESPONSE_FINISHED_REQUEST + " " + client
+ ", " + RESPONSE_COUNTER_EQUALS + value).getBytes());
Future<Integer> futureWriteResult = asyncSocketChannel.write(returnMessage);
futureWriteResult.get(10, TimeUnit.SECONDS);
} ...
这就是我的服务器从异步通道读取消息并返回答案。客户端阻塞,直到它得到答案。但这没关系。我不在乎客户端是否阻塞。
完成后,客户端尝试在同一异步通道上发送另一条消息,但它不起作用。