简短的回答:消息边界和连接.
使用流套接字,您可以编写两个五字节消息,并最终读取一个十字节消息.这是因为您编写的数据只是放在一个数据流中,数据之间没有边界.这就像一次写一个单词到文件.作为该文件的读者,您如何知道作者最初是一次写入一个字符,一次一个字,一次一个句子,一次一个段落,还是一次写入整个文件?基本上,如果文件已经写好,你就不会.使用流,如果快速连续发送,您如何知道源发送了两个五字节消息或一个十字节消息?您必须有某种长度或分隔符来帮助指示消息边界.有时你不关心消息或它们的界限.其他时候,您添加应用程序级别数据(例如,标题,分隔符,预定义的消息长度等).这使得流套接字也可以使用,因为您自己处理消息(即,在应用程序层).
使用基于数据报的套接字,接收方知道发送方发送的消息的大小,因为它们以1:1(baring loss,dups等...)交付,保留其原始大小.
除此之外,基于流的套接字往往是面向连接的1:1,而数据报套接字是无连接的,并且可能是一个(源)到多个(接收器),具有广播/多播.