gpt4 book ai didi

java - 我应该如何使用 AsynchronousServerSocketChannel 来接受连接?

转载 作者:IT老高 更新时间:2023-10-28 21:01:42 25 4
gpt4 key购买 nike

我想使用 Java 7 和 NIO 2 编写一个异步服务器。

但是我应该如何使用AsynchronousServerSocketChannel ?

例如如果我开始:

final AsynchronousServerSocketChannel server = 
AsynchronousServerSocketChannel.open().bind(
new InetSocketAddress(port));

然后当我执行server.accept() 时,程序终止,因为该调用是异步。如果我将该代码置于无限循环中,则会引发 AcceptPendingException

关于如何使用 AsynchronousServerSocketChannel 编写简单的异步服务器有什么建议吗?

这是我的完整示例(类似于 JavaDoc 中的示例):

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.channels.AsynchronousServerSocketChannel;
import java.nio.channels.AsynchronousSocketChannel;
import java.nio.channels.CompletionHandler;

public class AsyncServer {

public static void main(String[] args) {
int port = 8060;
try {
final AsynchronousServerSocketChannel server =
AsynchronousServerSocketChannel.open().bind(
new InetSocketAddress(port));

System.out.println("Server listening on " + port);

server.accept("Client connection",
new CompletionHandler<AsynchronousSocketChannel, Object>() {
public void completed(AsynchronousSocketChannel ch, Object att) {
System.out.println("Accepted a connection");

// accept the next connection
server.accept("Client connection", this);

// handle this connection
//TODO handle(ch);
}

public void failed(Throwable exc, Object att) {
System.out.println("Failed to accept connection");
}
});
} catch (IOException e) {
e.printStackTrace();
}
}
}

最佳答案

您在正确的轨道上,从完成的回调中调用 accept() 以接受更多连接应该可以工作。

防止线程终止的一种简单(但丑陋)的方法是简单地循环直到线程被中断。

// yes, sleep() is evil, but sometimes I don't care
while (true) {
Thread.sleep(1000);
}

更简洁的方法是使用 AsynchronousChannelGroup。例如:

AsynchronousChannelGroup group = AsynchronousChannelGroup.withThreadPool(Executors
.newSingleThreadExecutor());
AsynchronousServerSocketChannel server = AsynchronousServerSocketChannel.open(group).bind(
new InetSocketAddress(port));

// (insert server.accept() logic here)

// wait until group.shutdown()/shutdownNow(), or the thread is interrupted:
group.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS);

您可以调整线程的处理方式,参见 AsynchronousChannelGroup API docs了解更多信息。

关于java - 我应该如何使用 AsynchronousServerSocketChannel 来接受连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8940747/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com