逻辑上的一次发送未必就以一个单独的包发送出去,逻辑上的多次调用未必就是多个包被发送出去,这其中的秘密就是winsock缓冲区。调用flush可以强制发空当前缓冲数据,但是接收者还是未必一次收够或单次不多收。
使用NetworkStream可以在我们的程序中再设立一层缓冲,但真正的意义是在这层缓冲上,我们可以使用StreamReader和StreamWriter两个流,而这两个流可以使用ReadLine和WriteLine方法,这样做的意义是逻辑上的两次发送被换行符分割,逻辑层的NetworkStream可以缓冲保证单次数据的完整性,ReadLine方法可以保证单词数据的纯粹性。
但是有个限制,我们的单次数据不能包含换行符。否则逻辑上的语义被拆分,换行符号数据丢失。
使用上很简单,没什么可说的。
Socket client = svrsock.Accept();
IPEndPoint clientaddr = (IPEndPoint)client.RemoteEndPoint;
NetworkStream ns = new NetworkStream(client);
StreamReader rdstrm = new StreamReader(ns);
StreamWriter wtstrm = new StreamWriter(ns);
string welcome = "yes,you login,it's snake";
wtstrm.WriteLine(welcome);
wtstrm.Flush();
string recvStrBuf;
try
{
recvStrBuf = rdstrm.ReadLine();
}