WEB开发网
开发学院软件开发C语言 C#网络编程(订立协议和发送文件) - Part.4 阅读

C#网络编程(订立协议和发送文件) - Part.4

 2009-03-26 08:22:21 来源:WEB开发网   
核心提示: 服务端收到以后,根据客户端ip和端口号与该客户端建立连接,C#网络编程(订立协议和发送文件) - Part.4(3),客户端建立起与服务端的连接,服务端开始网络流中写入数据,是完整的协议 if (Regex.IsMatch(input, pattern)) { // 获取匹配的值 stri

服务端收到以后,根据客户端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();
    }
}

上一页  1 2 3 4 5 6 7 8  下一页

Tags:网络编程 订立 协议

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接