* @see 如服务器端一直运行着,而客户端不停的重复运行,就会发现默认分配的端口是连续分配的
* @see 即使客户端程序已经退出了,系统也没有立即重复使用先前的端口
* @see socket = new Socket(host, port);
* @see ---------------------------------------------------------------------------------------------------
* @see 不过,可以通过下面的方式显式的设定客户端的IP和Port
* @see socket = new Socket(host, port, InetAddress.getByName("127.0.0.1"), 8765);
* @see ---------------------------------------------------------------------------------------------------
*/
socket = new Socket();
/**
* 设置Socket属性
*/
//true表示关闭Socket的缓冲,立即发送数据..其默认值为false
//若Socket的底层实现不支持TCP_NODELAY选项,则会抛出SocketException
socket.setTcpNoDelay(true);
//表示是否允许重用Socket所绑定的本地地址
socket.setReuseAddress(true);
//表示接收数据时的等待超时时间,单位毫秒..其默认值为0,表示会无限等待,永远不会超时
//当通过Socket的输入流读数据时,如果还没有数据,就会等待
//超时后会抛出SocketTimeoutException,且抛出该异常后Socket仍然是连接的,可以尝试再次读数据
socket.setSoTimeout(30000);
//表示当执行Socket.close()时,是否立即关闭底层的Socket
//这里设置为当Socket关闭后,底层Socket延迟5秒后再关闭,而5秒后所有未发送完的剩余数据也会被丢弃
//默认情况下,执行Socket.close()方法,该方法会立即返回,但底层的Socket实际上并不立即关闭
//它会延迟一段时间,直到发送完所有剩余的数据,才会真正关闭Socket,断开连接
//Tips:当程序通过输出流写数据时,仅仅表示程序向网络提交了一批数据,由网络负责输送到接收方
//Tips:当程序关闭Socket,有可能这批数据还在网络上传输,还未到达接收方
//Tips:这里所说的"未发送完的剩余数据"就是指这种还在网络上传输,未被接收方接收的数据
socket.setSoLinger(true, 5);
//表示发送数据的缓冲区的大小
socket.setSendBufferSize(1024);
socket.setReceiveBufferSize(1024);
//表示对于长时间处于空闲状态(连接的两端没有互相传送数据)的Socket,是否要自动把它关闭,true为是
//其默认值为false,表示TCP不会监视连接是否有效,不活动的客户端可能会永久存在下去,而不会注意到服务器已经崩溃
socket.setKeepAlive(true);
//表示是否支持发送一个字节的TCP紧急数据,socket.sendUrgentData(data)用于发送一个字节的TCP紧急数据
//其默认为false,即接收方收到紧急数据时不作任何处理,直接将其丢弃..若用户希望发送紧急数据,则应设其为true
//设为true后,接收方会把收到的紧急数据与普通数据放在同样的队列中
socket.setOOBInline(true);
//该方法用于设置服务类型,以下代码请求高可靠性和最小延迟传输服务(把0x04与0x10进行位或运算)
//Socket类用4个整数表示服务类型
//0x02:低成本(二进制的倒数第二位为1)
//0x04:高可靠性(二进制的倒数第三位为1)
//0x08:最高吞吐量(二进制的倒数第四位为1)
//0x10:最小延迟(二进制的倒数第五位为1)
socket.setTrafficClass(0x04 | 0x10);
//该方法用于设定连接时间,延迟,带宽的相对重要性(该方法的三个参数表示网络传输数据的3项指标)
//connectionTime--该参数表示用最少时间建立连接
//latency---------该参数表示最小延迟
//bandwidth-------该参数表示最高带宽
//可以为这些参数赋予任意整数值,这些整数之间的相对大小就决定了相应参数的相对重要性
//如这里设置的就是---最高带宽最重要,其次是最小连接时间,最后是最小延迟
socket.setPerformancePreferences(2, 1, 3);
/**
* 连接服务端
*/
//客户端的Socket构造方法请求与服务器连接时,可能要等待一段时间
//默认的Socket构造方法会一直等待下去,直到连接成功,或者出现异常
//若欲设定这个等待时间,就要像下面这样使用不带参数的Socket构造方法,单位是毫秒
//若超过下面设置的30秒等待建立连接的超时时间,则会抛出SocketTimeoutException