- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我创建了AsynchronousServerSocketChannel,一切都很好,直到我想要关闭服务器套接字套接字。我在客户端上创建 AsynchronousSocketChannel 并使用特殊消息调用函数来关闭服务器和所有套接字 channel ,服务器已关闭但最终 block 从未执行为什么?
检查代码:
public void openServerSocket(int sport) {
port = sport;
policyFile = createPolicy(new String[]{"*:"+port});
try {
//group = AsynchronousChannelGroup.withThreadPool(Executors.newSingleThreadExecutor());
//group.awaitTermination(1, TimeUnit.SECONDS);
server = AsynchronousServerSocketChannel.open();
server.bind(new InetSocketAddress(sport));
server.accept(null, this);
while(isOpen) {
//System.out.println("running server socket");
}
}catch(Exception ex) {
this.message = ex.getMessage();
System.out.println("Server: " + ex.getMessage());
}finally {
System.out.println("Finall serversocket closing!");
for(SocketHandler sh : sockets) {
sh.close();
}
if(server != null) {
try {
server.close();
server = null;
}catch(Exception ex2) {
this.message = ex2.getMessage();
}
}
sockets.clear();
sockets = null;
//this.message = "server socket closed";
System.out.println("server socket down");
}
}
@Override
public void completed(AsynchronousSocketChannel socket, Void attachment) {
System.out.println("new connection");
SocketHandler sh = new SocketHandler(socket, this);
server.accept(null, this);
}
@Override
public void failed(Throwable exc, Void attachment) {
System.out.println("Server Failed accept:" + exc.getMessage());
}
public void closeServerSocket() {
System.out.println("Closing server socket! " + server);
this.isOpen = false;
}
所以函数 closeServerSocket 被调用,我将 false 设置为变量 isOpen ,它继续循环,但是当我将 false 设置为 isOpen var 时, while 仍在循环,finally 从未执行?
最佳答案
这看起来像是多个线程之间的通信问题。从代码中我猜测您的 while(isOpen) 循环与类的 closeServerSocket() 方法在不同的线程中运行。要验证这一点,请将 Thread.currentThread()
添加到您的打印语句中。
如果是这种情况,您可以通过将 isOpen
声明为 volatile
来补救这种情况。如果没有 volatile
,则无法保证任何其他线程是否以及何时会看到写入的值。使用 volatile
可以保证(我对 happens-before 的解释)访问变量的线程稍后(根据挂钟时间)将看到更改后的值。
您可能更喜欢AtomicBoolean
,而不是 volatile
。
关于java - AsynchronousServerSocketChannel 最终 block 从未执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23291426/
使用 AsynchronousServerSocketChannel 实现监听器。我打开 channel ,绑定(bind)到端口并开始接受连接。我能够收听和阅读消息。关闭 channel 后的问题事
在 my previous Question我问如何实现正确的多线程服务器。我得到了编程“正常关闭”的回复,我尝试这样做。然而,这并没有奏效。我在客户端仍然有处于 TIME_WAIT 状态的打开套接字
我必须实现一个应该接受更多连接的服务器。没有任何深入的想法,我决定使用新的 JAVA NIO.2 类。 我目前的做法是: final Semaphore wait = new Semaphore(1)
我有一个小型服务器设置,我在其中尝试使用基于事件的连接套接字,以便在每个传入连接上调用处理程序。它适用于第一个连接,但在第一个连接之后不再接受新连接。 为了简单起见,我只是在客户端连接进来时关闭它。另
我想使用 Java 7 和 NIO 2 编写一个异步服务器。 但是我应该如何使用AsynchronousServerSocketChannel ? 例如如果我开始: final Asynchronou
我创建了AsynchronousServerSocketChannel,一切都很好,直到我想要关闭服务器套接字套接字。我在客户端上创建 AsynchronousSocketChannel 并使用特殊消
我正在尝试创建一个具有异步通信模型的服务器并希望绑定(bind)多个端口,但是当我调用多个绑定(bind)方法时它会抛出错误“AlreadyBoundException”。有什么办法可以做到这一点?这
INTERNET 上所有在 NIO2 上可用的源/示例都没有 TLS/SSL 支持, java.nio.channels.AsynchronousSocketChanneljava.nio.chann
已关闭。这个问题是 off-topic 。目前不接受答案。 想要改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 已关闭10 年前。 Improve th
我是一名优秀的程序员,十分优秀!