`

《JAVA tcp/ip socket》第二章读书笔记

阅读更多

 

      close()  方法关闭套接字及其关联的输入输出流,从而阻止对其的进一步操作。

 

      shutDownInput()   方法关闭TCP流的输入端,任何没有读取的数据都将被舍弃,包括那些已经被套接字缓存的数据,正在传输的数据以及将要到达的数据。后续的任何从套接字读取数据的尝试都将抛出异常。

 


      shutDownOutput() 方法在输出流上也产生类似的效果,但在具体实现中,已经写入套接字输出流的数据,将被尽量保证能发送到另一端。

 

UDP套接字与TCP套接字进行通信的一些不同点:

 

一个微小但重要的差别是UDP协议保留了消息的边界信息。DatagramSocket的每一次receive()调用最多只能接收调用一次send()方法所发送的数据。而且,不同的receive()方法调用绝不会返回同一个send()方法调用所发送的数据。

 

当在TCP套接字的输出流上调用的write()方法返回后,所有调用者都知道数据已经被复制到一个传输缓存区中,实际上此时数据可能已经被传送,也可能还没有被传送。而UDP协议没有提供从网络错误中恢复的机制,因此,并不对可能需要重传的数据进行缓存。这就意味着,当send()方法调用返回时,消息已经被发送到了底层的传输信道中,并正处在(或即将处在)发送途中。

 

消息从网络到达后,其所包含数据被read()方法或receive()方法返回前,数据存储在一个先进先出的接收数据队列中。对于已经连接的TCP套接字来说,所有已经接收但还未传送的字节都看作是一个连续的字节序列。然而,对于UDP套接字来说,接收到的数据可能来自于不同的发送者。一个 UDP套接字所接收的数据存放在一个消息队列中,每个消息都关联了其源地址信息。每次receive()调用只返回一条消息。然而,如果 receive()方法在一个缓存区大小为n的DatagramPacket实例中调用,而接收队列中的第一条消息长度大于n,则receive()方法只返回这条消息的前n个字节。超出部分的其他字节都将自动被丢弃,而且对接收程序也没有任何消息丢失的提示!

 

出于这个原因,接收者应该提供一个有足够大的缓存空间的DatagramPacket实例,以完整地存放调用receive()方法时应用程序协议所允许的最大长度的消息。这个技术能够保证数据不会丢失。一个DatagramPacket实例中所运行传输的最大数据量为65507字节,即UDP数据报文所能负载的最多数据。因此,使用一个有65600字节左右缓存数组的数据包总是安全的。


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics