Welcome

首页 / 软件开发 / C# / C#网络编程(异步传输字符串) - Part.3

C#网络编程(异步传输字符串) - Part.32011-07-31 tracefact.net 张子阳这篇文章我们将前进一大步,使用异步的方式来对服务端编程,以使它成为一个真正意义上的服务器 :可以为多个客户端的多次请求服务。但是开始之前,我们需要解决上一节中遗留的一个问题。

消息发送时的问题

这个问题就是:客户端分两次向流中写入数据(比如字符串)时,我们主观上将这两次写入视为两次 请求;然而服务端有可能将这两次合起来视为一条请求,这在两个请求间隔时间比较短的情况下尤其如此 。同样,也有可能客户端发出一条请求,但是服务端将其视为两条请求处理。下面列出了可能的情况,假 设我们在客户端连续发送两条“Welcome to Tracefact.net!”,则数据到达服务端时可能有这样三种情 况:

NOTE:在这里我们假设采用ASCII编码方式,因为此时上面的一个方框正好代表一个字节,而字符串到 达末尾后为持续的0(因为byte是值类型,且最小为0)。

上面的第一种情况是最理想的情况,此时两条消息被视为两个独立请求由服务端完整地接收。第二种 情况的示意图如下,此时一条消息被当作两条消息接收了:

而对于第三种情况,则是两条消息被合并成了一条接收:

如果你下载了上一篇文章所附带的源码,那么将Client2.cs进行一下修改,不通过用户输入,而是使 用一个for循环连续的发送三个请求过去,这样会使请求的间隔时间更短,下面是关键代码:

string msg = "Welcome to TraceFact.Net!";

for (int i = 0; i <= 2; i++) {
byte[] buffer = Encoding.Unicode.GetBytes(msg); // 获得缓存
try {
streamToServer.Write(buffer, 0, buffer.Length); // 发往服务器
Console.WriteLine("Sent: {0}", msg);
} catch (Exception ex) {
Console.WriteLine(ex.Message);
break;
}
}

运行服务端,然后再运行这个客户端,你可能会看到这样的结果: