【Java TCP/IP Socket编程】----进阶----注意点

1.广播和多播:TCP套接字中客户端只能接收和发送指定服务器端过来的数据,这种一对一的通信方式叫单播,而UDP套接字可以容许一个发送端和多个接收端情况,一对多的类型有:广播和多播。

      1)广播:本地网络中所有的主机都会接收到一份数据副本。IPv4广播地址(255.255.255.255)将消息发送到同一个广播网络中上的所有主机,本地广播信息不回被路由器转发。广播不能使用连接,有些操作系统不支持普通用户进行广播操作。

      2)多播:网络只分发数据给想要接收数据的多播地址的主机。一个多播地址指示了一组接收者,IP协议的设计者为多播分配了一定范围的地址空间,IPv4中多播地址是224.0.0.0到239.255.255.255,IPv6中多播地址是FF开头的地址。多播报文会初始化一个TTL值(Time To Live,生命周期),当存在路由器转发便会减1,TTL值为0时,丢弃该数据报文。

2.Keep-Alive:TCP协议提供了一种Keep-alive机制,发送端和接收端一段时间内没有数据交换时,发送端会向终端发送探测消息,终端如果处于活跃状态会回复一个确认消息。几次尝试后依然没有收到终端消息,则会终止发送探测消息,关闭套接字,下次IO操作时会抛出异常。

3.发送和接收缓存区的大小:当创建了Socket或者DatagramSocket实例的时候,操作系统就必须为其分配缓存区以存放接收的和要发送的数据。方法setReceiveBufferSize(int size)和setSendBufferSize(int size);

4.超时:很多IO操作如果不能立即完成就会阻塞等待,读操作会阻塞等待直到至少一个字节可读;接收操作将阻塞等待直到成功建立连接。通过调用setSoTimeout()方法设置读,接收数据以及accept()方法的最长阻塞时间。

5.地址重用:某些情况下,希望能将多个套接字绑定到同一个套接字地址,对于UDP多播情况,同一个主机上可能有多个应用程序加入相同的多播组。对于TCP来说,当一个连接关闭后,通信的一端必须在“Time-Wait”状态上等一段时间,以对传输途中丢失的数据包进行清理,但通信终端可能无法等待Time-Wait结束。这两种情况需要能够与正在使用的地址进行绑定的能力,实现地址的重用。

6.消除缓冲延迟:TCP协议将数据缓存起来直到足够多时一次发送,以避免发送过小的数据包而浪费网络资源。虽然这个功能有利于网络,但是应用程序可能对所造成的缓冲延迟无法容忍,可以禁用缓存功能,调用方法setTcpNoDelay(true).

7.紧急数据:TCP协议中包含了紧急数据的概念,如果需要发送一条紧急数据,但是前面已经有很多其他数据,要求能够绕过这些常规数据(频道外数据)。但Java中紧急数据几乎没有什么用,因为常规数据与紧急数据顺序混在一起,接收者无法区别。

8关闭后停留:调用套接字的close()方法后,即使套接字的缓冲区中还存在没有发送的数据,它也会立即返回。这样不发送完所有数可能导致的问题是主机将在后面的某个时刻发生故障。其实可以选择然close()方法“停留”或者阻塞一段时间,直到发送所有数据都已经发送并确认,或者发生了超时。调用方法setSoLinger(boolean on, int linger)。

9.广播许可:一些操作系统要求显式地对广播许可进行请求,可以对广播许可进行控制。调用方法,setBroadcast(true),true表示允许广播

10.通信等级:有的网络对满足服务条件的数据报提供了增强的服务或者额外的保险。一个数据报的通信登记由数据包在网络中传输时其内部的一个值来指定。但是通信等级会收到网络提供者的限制,不能保证这项功能可用。(方法setTrafficClass(int tc))

11.基于性能的协议选择:TCP协议不是套接字唯一可选的协议,Java允许开发者根据不同的性能特征对于应用程序的重要程序,为具体实现给出建议,底层网络系统可能会根据这些建议,在一组能够提供同等的数据流服务,同时有具有不同的性能特征的不同协议中做出选择。方法setPerformancePreferences(int connectionTime,int latency,int bandwidth)设置连接时间,延迟和带宽,底层会根据这些参数设置选择合适的协议。

12.关闭连接:网络协议通常明确指定了谁来关闭连接。但直接调用Socket的close()将会同时终止输出和输入两个方向的数据流,如客户端发送完数据后调用close()方法就会导致接收不到数据,需要一种方法来告诉连接的另一端我已经发送完所有数据,并且保持能够接收数据的能力。套接字里面就提供了这样的功能,Socket类的shutdonwInput()和shutdownOutput()方法能够将输入输出流单独关闭。

      1)调用shutdownInput()后,套接字的输入流将无法使用,任何没有发送的数据都将被丢弃,任何想从套接字的输入流读取数据的操作都将返回-1。

      2)调用shutdownOutput()方法时,套接字的输出流将无法再发送数据,任何尝试向输出流写数据的操作都将抛出异常IOException异常。

 

发布了83 篇原创文章 · 获赞 21 · 访问量 4万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览