C#网络编程(订立协议和发送文件) - Part.4
2009-03-26 08:22:21 来源:WEB开发网服务端收到以后,根据客户端ip和端口号与该客户端建立连接。
客户端建立起与服务端的连接,服务端开始网络流中写入数据。
传送完毕后服务端、客户端分别关闭连接。
2.协议处理类的实现
和上面一章一样,在开始编写实际的服务端客户端代码之前,我们首先要编写处理协议的类,它需要提供这样两个功能:1、方便地帮我们获取完整的协议信息,因为前面我们说过,服务端可能将客户端的多次独立请求拆分或合并。比如,客户端连续发送了两条控制信息到服务端,而服务端将它们合并了,那么则需要先拆开再分别处理。2、方便地获取我们所想要的属性信息,因为协议是XML格式,所以还需要一个类专门对XML进行处理,获得字符串的属性值。
2.1 ProtocalHandler辅助类
我们先看下ProtocalHandler,它与上一篇中的RequestHandler作用相同。需要注意的是必须将它声明为实例的,而非静态的,这是因为每个TcpClient都需要对应一个ProtocalHandler,因为它内部维护的patialProtocal不能共享,在协议发送不完整的情况下,这个变量用于临时保存被截断的字符串。
public class ProtocolHandler {
private string partialProtocal; // 保存不完整的协议
public ProtocolHandler() {
partialProtocal = "";
}
public string[] GetProtocol(string input) {
return GetProtocol(input, null);
}
// 获得协议
private string[] GetProtocol(string input, List<string> outputList) {
if (outputList == null)
outputList = new List<string>();
if (String.IsNullOrEmpty(input))
return outputList.ToArray();
if (!String.IsNullOrEmpty(partialProtocal))
input = partialProtocal + input;
string pattern = "(^<protocol>.*?</protocol>)";
// 如果有匹配,说明已经找到了,是完整的协议
if (Regex.IsMatch(input, pattern)) {
// 获取匹配的值
string match = Regex.Match(input, pattern).Groups[0].Value;
outputList.Add(match);
partialProtocal = "";
// 缩短input的长度
input = input.Substring(match.Length);
// 递归调用
GetProtocol(input, outputList);
} else {
// 如果不匹配,说明协议的长度不够,
// 那么先缓存,然后等待下一次请求
partialProtocal = input;
}
return outputList.ToArray();
}
}
更多精彩
赞助商链接