1 Socket.setSoTimeout(int)
设置读超时,如果在timeout时间没有读取到一个字节,那么抛出IOException,并且关闭socket。github代码
从抓包中可以看到在超时后发送了RST,告知服务端关闭连接。
2 Socket.setSoLinger(boolean,int)
设置是否等待缓冲区中的数据全部发送成功后再关闭socket,以及等待的时间。
3 Socket.setTcpNoDelay(boolean)
设置是否启用Nagle算法,默认true。Nagle会把200ms内的小数据包合并后一起发送,以此来减少网络拥塞。但是也增加了小数据包交互的时间。
4 Socket.setSendBufferSize(int)
设置发送缓冲区大小
5 Socket.setReceiveBufferSize(int)
设置接收缓冲区大小
6 Socket.setReuseAddress(boolean)
如果socket的状态是time_wait,那么这个socket就可以bind,不需要等待socket 完全关闭。但是如果不设置这个参数,那么会抛出Already bound异常。
7 Socket.setKeepAlive(boolean)
如果设置为true,那么双方在2小时内没有通信的话,会发送一个探测报文,如果没有收到响应或者响应为RST,那么会关闭连接。如果响应为ACK,那么保持连接。在测试中服务器(jekyll)在20s内没有接收到客户端的请求就已经关闭连接了。