我有两个Java应用程序之间的套接字tcp连接。当一侧关闭插座时,另一侧保持打开状态。但我希望它被关闭。我也等不及看它是否可用,然后关闭它。我想要某种方式从一侧完全关闭它。 我能做什么?是否可以关闭客户端和服务器端的Java套接字?
回答
TCP不能像这样工作。即使TCP堆栈知道另一端关闭它,操作系统也不会释放资源,即文件描述符和端口,直到应用程序明确关闭套接字或死亡。在从对等端收到FIN时,从内核到用户应用程序没有回调。操作系统向对方确认,但在发送其FIN数据包之前等待应用程序调用close()
。看看TCP state transition diagram - 你在被动关闭框。
检测这种情况的一种方法是在不为每个套接字指定线程的情况下使用select/poll/epoll/kqueue
函数系列。被动关闭的套接字将被标记为可读,读取尝试将返回EOF。
希望这会有所帮助。
如果您仍然从您的套接字读取数据,那么您将在关闭时检测-1。
如果您不再读取套接字,请继续并关闭它。
如果它们都不是这些,你可能有一个线程等待一个事件。这不是您想要处理数千个端口的方式! Java会开始在Windows的大约3000个线程中获取pukey - 在Linux中更少(我不知道为什么)。
确保您使用的是NIO。使用单个线程来管理您的所有端口(连接池)。它应该只抓取线程中的数据,并将其转发到队列中。在那一点上,我想我会有一个线程池将数据从队列中取出并处理它,因为实际处理来自端口的数据需要一些时间。
将线程连接到每个端口将不起作用,并且是需要NIO的最大原因。另外,将某种“关闭”消息作为触发关闭端口的流的一部分可能会使事情工作更快 - 但仍然需要处理-1来覆盖破碎流的情况
通常的解决方案是让对方知道你要在关闭连接之前关闭连接。例如,在SMTP协议的情况下,服务器在关闭连接之前将发送'221 Bye'。
尽管这是一个很好的优化,但它不会处理丢失的连接,并最终会堆积开放的端口。在有数千个端口打开的系统中这是不可接受的,但它确实减少了“我可以关闭此端口”扫描的频率。 – 2010-01-30 01:31:04
- 1. Netty - 是否关闭客户端的套接字关闭服务器的通道
- 2. 同时关闭服务器和客户端套接字连接
- 3. Java套接字 - 关闭到服务器套接字的telnet客户端连接
- 4. Java套接字客户端/服务器
- 5. java:关闭客户端套接字重置服务器套接字
- 6. 关于检查客户端是否从服务器套接字
- 7. 由于关闭套接字,服务器回复客户端消息失败 - Java客户端 - 服务器示例
- 8. C套接字服务器,Java套接字客户端:阻塞!
- 9. Python套接字客户端到Java套接字服务器
- 10. php套接字服务器检查客户端是否连接
- 11. 无法连接Java套接字服务器和客户端
- 12. PHP套接字服务器/客户端
- 13. Python服务器客户端套接字
- 14. 客户端服务器udp套接字
- 15. Java客户端/服务器套接字端口分配
- 16. java套接字服务器和套接字客户端之间的连接
- 17. 异步客户端套接字关闭?
- 18. 是否可以在同一台机器上运行套接字服务器和套接字客户端?
- 19. 接受客户端的Java服务器套接字
- 20. 服务器异步套接字 - 检测客户端的关闭连接?
- 21. 客户端java是否可以在服务器上工作?
- 22. Android客户端PC服务器java套接字连接失败
- 23. Java客户端/ Ruby服务器套接字连接
- 24. Java双向套接字连接(服务器/客户端)
- 25. 是MVVM的客户端和MVC的服务器可以接受?
- 26. 的Java套接字客户端 - 服务器应用程序
- 27. 带有VB.NET客户端的Java套接字服务器?
- 28. 客户端 - 服务器消息交换 - Java中的套接字
- 29. 符合HTTP 1.1服务器和客户端连接半关闭
- 30. 关闭ServerSocket - 如何正确检查客户端套接字是否关闭?
TCP状态转换图链接给出了404 – 2015-06-12 14:11:03