Java网络编程之传输控制协议 - 编程入门网
超时问题,而不应该因此延迟速度。
⑴SO_KEEPALIVE套接字操作 Keepalive(保持活动)套接字选项是很有争议的,一些开发者认为使用它会 很强大。在默认情况下,两个连接的套接字之间没有数据发送,除非应用程序有 需要发送的数据。这意味着在长期存活的进程中空闲地的接字可能几分钟、几小 时、甚至于几天不会提交数据。但是,假设某个客户端崩溃了,并且连接终结序 号没有发送给TCP服务器。贵重的资源(例如CPU时间和内存)将会浪费在哪个永 远不会响应的客户端上。如果允许keepalive套接字选项,套接字的另一端可以 探测以验证它是否仍然是活动的。但是,应用程序不能控制keepalive探测器的 发送频率。为了激活keepalive,需要调用Socket.setSoKeepAlive(boolean)方 法,参数的值为"true"("false"值将禁止它)。例如,为了在某个套接字上允 许keepalive,可能使用下面的代码: // 激活SO_KEEPALIVE someSocket.setSoKeepAlive(true); 尽管keepalive的好处并不多,但是很多开发者提倡在更高层次的应用程序代 码中控制超时设置和死的套接字。同时需要记住,keepalive不允许你为探测套 接字终点(endpoint)指定一个值。我们建议开发者使用的另一种比keepalive 更好的解决方案是修改超时设置套接字选项。 ⑵SO_RCVBUF套接字操作 接收缓冲区套接字选项控制用于接收数据的缓冲区。你可以通过调用方法改 变它的大小。例如,为了把缓冲区大小改变为4096,可以使用下面的代码: // 修改缓冲区大小 someSocket.setReceiveBufferSize(4096); 注意:修改接收缓冲区大小的请求不能保证改变成功。例如,有些操作系统 可能不允许修改这个套接字选项,并忽略对该值的任何改变。你可以调用 Socket. getReceiveBufferSize()方法得到当前缓冲区的大小。使用缓冲的更好 的选择是使用BufferedInputStream/BufferedReader。 ⑶ SO_SNDBUF套接字操作 发送缓冲区套接字选项控制用于发送数据的缓冲区的大小。通过调用 Socket.setSendBufferSize(int)方法,你能够试图改变缓冲区的大小,但是改 变缓冲区大小的请求可能被操作系统拒绝。 // 把发送缓冲区的大小改为4096字节 someSocket.setSendBufferSize(4096); 为了得到当前发送缓冲区的大小,你可以调用Socket.getSendBufferSize() 方法,它返回一个整型值。 // 得到默认的大小 int size = someSocket.getSendBufferSize(); 使用DatagramSocket类时改变缓冲区大小可能更有效。当对写进行缓冲的时 候,更好的选择是使用BufferedOutputStream和BufferedWriter。 Java网络编程之传输控制协议(6)时间:2010-12-16 天极 陶刚⑷ SO_LINGER套接字操作 当某个TCP套接字连接被关闭的时候,可能还有一些数据在队列中等待发送但 是还没有被发送(特别是在IP数据报在传输过程中丢失了,必须重新发送的情况 下)。Linger(拖延)套接字选项控制未发送的数据可能发送的时间总和,过了 这个时间以后数据就会被完全删除。通过使用Socket.setSoLinger(boolean onFlag, int duration)方法完全激活/禁止linger选项、或者修改linger的持续 时间都是可以的。 // 激活linger,持续50秒 someSocket.setSoLinger( true, 50 ); ⑸ TCP_NODELAY套接字操作 这个套接字选项是一个标记,它的状态控制着是否激活Nagle算法(RFC 896 )。因为TCP数据是使用IP数据报在网络上发送的,因此每个包都有一定位数的 开销(例如IP和TCP头部信息)。如果在某个时刻每个包中只发送了少量的字节 ,头部信息的大小将远远超过数据的大小。在局域网中,发送的额外的数据可能 不会很多,但是在Internet上,成百、成千、甚至于成百万地客户端可能通过某 个路由器发送这种数据包,加起来显著地增加了带宽的消耗。 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |