预览加载中,请您耐心等待几秒...
1/6
2/6
3/6
4/6
5/6
6/6

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

Java套接字Socket编程--TCP参数 在Java的Socket中,主要包含了以下可设置的TCP参数。 属性说明默认值SO_TIMEOUT对ServerSocket来说表示等待连接的最长空等待时间;对Socket来说表示读数据最长空等待时间。0TCP_NODELAY是否一有数据就马上发送。falseSO_LINGER优雅地关闭套接字,或者立刻关闭。-1SO_SNDBUF发送数据的缓冲区大小。8KSO_RCVBUF接收数据的缓冲区大小。8KSO_KEEPALIVE是否启用心跳机制。falseSO_REUSEADDR是否地址重用。falseBACKLOG服务端处理线程全忙后,允许多少个新请求进入等待。50 BACKLOG BACKLOG用于构造服务端套接字ServerSocket对象,标识当服务器请求处理线程全满时,用于临时存放已完成三次握手的请求的队列的最大长度。如果未设置或所设置的值小于1,Java将使用默认值50。 ServerSocketserverSocket=newServerSocket(8080,100); TCP_NODELAY 在TCP/IP协议中,无论发送多少数据,总是要在数据前面加上协议头,同时,对方接收到数据,也需要发送ACK表示确认。为了尽可能的利用网络带宽,TCP总是希望尽可能的发送足够大的数据。这里就涉及到一个名为Nagle的算法,该算法的目的就是为了尽可能发送大块数据,避免网络中充斥着许多小数据块。 TCP_NODELAY选项,就是用于启用或关于Nagle算法。如果要求高实时性,有数据发送时就马上发送,就将该选项设置为true关闭Nagle算法;如果要减少发送次数减少网络交互,就设置为false等累积一定大小后再发送。默认为false。 Socket中操作该属性的方法如下: voidsetTcpNoDelay(booleanon) 启用/禁用TCP_NODELAY(启用/禁用Nagle算法)。 booleangetTcpNoDelay() 测试是否启用TCP_NODELAY。 关于Nagle算法介绍,请参考附录部分。 SO_TIMEOUT 对于服务端套接字ServerSocket来说,SO_TIMEOUT表示服务端accept方法空等待客户端连接的最长时间;对于客户端套接字Socket来说,SO_TIMEOUT表示输入流读取数据read方法的最长等待时间。一旦超过设置的SO_TIMEOUT,程度将抛出超时异常。 ServerSocket/Socket中操作该属性的方法如下: intgetSoTimeout() 返回SO_TIMEOUT的设置。 voidsetSoTimeout(inttimeout) 启用/禁用带有指定超时值的SO_TIMEOUT,以毫秒为单位。 使用示例: ServerSocketserverSocket=newServerSocket(8080); serverSocket.setSoTimeout(30000); SocketclientSocket=serverSocket.accept(); clientSocket.setSoTimeout(20000); SO_LINGER 当调用closesocket关闭套接字时,SO_LINGER将决定系统如何处理残存在套接字发送队列中的数据。处理方式无非两种:丢弃或者将数据继续发送至对端,优雅关闭连接。事实上,SO_LINGER并不被推荐使用,大多数情况下我们推荐使用默认的关闭方式(即下方表格中的第一种情况)。 下方代码段显示linger结构语法,表格为不同参数情况下的套接字行为。 typedefstructlinger{ u_shortl_onoff;//开关,零或者非零 u_shortl_linger;//优雅关闭最长时限 }linger; 各字段与对应行为如下表所示。 l_onoffl_lingerclosesocket行为发送队列底层行为零忽略立即返回。保持直至发送完成。系统接管套接字并保证将数据发送至对端。非零零立即返回。立即放弃。直接发送RST包,自身立即复位,不用经过2MSL状态。对端收到复位错误号。非零非零阻塞直到l_linger时间超时或数据发送完成。(套接字必须设置为阻塞)在超时时间段内保持尝试发送,若超时则立即放弃。超时则同第二种情况,若发送完成则皆大欢喜。 Socket中操作该属性的方法如下: voidsetSoLinger(booleanon,intlinger) 启用/禁用具有指定逗留时间(以秒为单位)的SO_LINGER。Linger最大取值为65535。 intgetSoLinger() 返回SO_LINGER的设置。默认值为-1。 由于getSoLinger()方法返回的-1没有太