繁体   English   中英

关闭由ServerSocketChannel.accept()检索的SocketChannel

[英]Closing a SocketChannel retrieved by ServerSocketChannel.accept()

我在守护进程线程上有一个计时器,该线程不断将数据写入SocketChannel 在主类中,我没有此套接字通道的对象引用,但是有此套接字通道连接到的ServerSocket的引用。 所以我这样做是为了关闭频道。

socketChannel = serverSocket.accept();
socketChannel.close();

但是,守护进程线程的套接字通道关闭会带来延迟。 尽管它们都引用相同的套接字通道,但是即使在调用上述close()直到几毫秒之后,计时器任务也会写入此套接字通道。

请提出如何确保关闭完成的建议。 这是一个非阻塞通道。

您的代码没有意义。 该代码根本不“引用相同的套接字通道”,因此也就不会关闭它:它接受一个新的套接字并关闭它,这也没有意义,至少对创建该代码的客户端来说没有意义。该新连接,并且可能期望对其进行某些服务,而不是立即关闭。

您只需要安排对现有通道的引用即可用于需要关闭它的代码。 这是Programming 101,根本不是网络问题。

您需要同步。 在这些线程之间共享一些对象。 然后,您可以执行以下操作:主线程:

synchronized(object){
    socketChannel = serverSocketChannel.accept()
    socketChannel.close(). 
}

守护程序线程:

synchronized(object){
    timerTask.write(socketChannel, data)
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM