java - Java 中的非阻塞套接字写入与阻塞套接字写入

标签 java sockets networking tcp nio

为什么有人更喜欢阻塞写而不是非阻塞写?我的理解是,如果你想确保另一方在 write 方法返回后得到 TCP 数据包,你只会想要阻止写入,但我什至不确定这是可能的。您将不得不刷新,而刷新将不得不刷新底层操作系统写入套接字缓冲区。那么非阻塞套接字写有什么缺点吗?就性能而言,拥有一个大的底层写套接字缓冲区是不是一个坏主意?我的理解是,底层套接字写入缓冲区越小,当底层套接字缓冲区已满且 isWritable() 返回 false 时,您就越有可能遇到缓慢/错误的客户端,并且必须在应用程序级别丢弃/排队数据包。

最佳答案

My understanding is that you would only want blocking write if you want to make sure the other side got the TCP packet once the write method returned

你的理解有误。它并不能确保这一点。

阻塞写入阻塞,直到所有数据都已传输到套接字发送缓冲区,数据从那里异步传输到网络。如果reader慢了,他的socket receive buffer会被填满,最终会导致你的socket send buffer被填满,从而导致blocking write阻塞,阻塞整个线程。非阻塞 I/O 为您提供了一种检测和处理这种情况的方法。

关于java - Java 中的非阻塞套接字写入与阻塞套接字写入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8086930/

相关文章:

java - 新线程已创建,但未运行 (java)

java - java 和 nmap 中的套接字

Azure Vnet 专用 IP 范围

c++ - 如何获取 IP 地址(IPv4 为 NULL,但 IPv6 存在),内容详情

java - 外部文件中的嵌套/内部类

java - GWT 射频 : How to share the same code in client and server

java - 单个文件中多个顶级 Java 类的用例?

java - Android Java访问手机前置Flash

C# Socket BeginReceive/EndReceive 捕获多条消息

ios - 在后台继续 NSURLConnection 请求的最合适方法