socket关闭
- 在使用socket通信时, 如果服务端关闭socket, 客户端会继续发送完毕数据, 但是服务端接受数据时抛出socket已经关闭的异常.
- 在socket通信时, 如果客户端没有关闭socket, 客户端直接退出, 服务端会抛出Connection reset异常.
- 在socket通信时, 如果客户端关闭socket,或者输出流, 这时处于半关闭状态, 服务端接受到EOF。
Socket 设置选项
- TCP_NODELAY : 其实是设置是否使用延迟发送机制
- SO_RESUSEADDR : socket的close()方法是否立即释放本地端口.
- SO_TIMEOUT: 接受数据等待的最大时间. 毫秒
- SO_LINGER: 默认情况 socket的close 会立即返回, 但底层的socket实际不会立即关闭, 是发送完所有数据才关闭. 如果socket.setSoLinger(true,3600), socket会阻塞3600秒返回或者发送完所有数据关闭底层连接后返回
- SO_RCVBUF: 接受缓冲区, 缓冲区较大可以减少数据传输的次数, 提高效率.
- SO_SNDBUF: 同上
- SO_KEEPALIVE: 为true时,底层的TCP如果超过2小时没有和服务端通信过, 会发送数据包给服务端, 服务端如果未响应则会持续11分钟的尝试, 直到收到响应为止.如果12分钟未收到回应, 关闭本地socket.; 默认false
- OOBINLINE :true-> 表示支持一个字节的紧急数据, socket的sendUrgentData(int data) 用于发送紧急数据, 默认为false-> 丢弃紧急数据.
Socket服务类型设置
IP规定4中服务类型, 用来描述服务的质量.
- 低成本0x02
- 高可靠 0x 04
- 最高吞吐量 0x08
- 最小延迟 0x10 tips: 这四中可以组合使用, 通过|
Socket socket = ...; socket.setTrafficClass(0x 04);
Socket设置 连接时间, 延迟, 带宽 相对重要性
setPerformancePreferences(int connectionTime, int latency, int bandwidth)
这三个参数如题,可以随意的进行赋值,他们之间的相对大小表示相对的重要性.
ServerSocket 选项
SO_TIMEOUT: 表示等待客户连接的超时时间. accept()等待客户连接的时间, 毫秒值
SO_REUSEADDR: 和socket的SO_RESUEADDR 选项相同, 如果网络上有数据向旧ServerSocket传输数据, 是否允许新的ServerSocket绑定到旧的ServerSocket同样的端口.
Tips: 当服务器程序关闭时, 默认底层端口还会被占用一段时间, 当服务重启时,导致端口被占用. 设置为true后, 端口可以被立刻重用.
SelectableChannel 的register() 和 Selector 的select()
都会操纵Selector对象的共享资源all-keys集合, 如果select()阻塞, 它拿着all-keys的内置锁, register()方法也会阻塞...... 因此在register()注册事件时,不允许在select()上阻塞.
DatagramSocket 的选项
SO_TIMEOUT: 表示接受数据报时的等待超时时间
SO_RCVBUF: 表示接受数据的缓冲区的大小. UDP接受数据后,如果缓冲区满, 再次到达的数据会被丢弃.
SO_SNDBUF: 发送数据缓冲区的大小, 很多网络都限定了这个的最大值, 超过该值所作的修改无效.
SO_REUSEADDR 选项对于UDP并非TCP的含义, 它决定着多个DatagramSocket 是否可以同时绑定到相同的IP地址和端口.到达该端口的数据报会复制到所有的DatagramSocket.
SO_BROADCAST 选项 决定是否允许对网络广播地址收发数据报。默认为true.
IP服务类型
设置服务类型: setTrafficClass(int transferClass)
低成本 0x02 ;
高可靠性: 0x04;
最高吞吐量: 0x08;
最小延迟: 0x10;
远程方法中的参数和返回值
分布式的垃圾回收
远程对象如果被多人访问, 自己需要保证它是线程安全的类.
只有当一个远程对象 不受任何本地引用和远程引用, 这个远程对象才会结束生命周期.
Ways: 当客户端持有服务端远程对象的存根时, 客户端对这个远程对象有一个租约期限.
期限通过java.rmi.dgc.leaseValue设置, 毫秒单位. 默认10分钟, 当到达租约期限一半时间, 客户端如果还持有远程引用, 会再次向服务器发送租约通知.