客户端我是这样实现的!!        //连接成功
        void TcpClient_ConnectedServer(object sender, NetEventArgs e)
        {
            count = 0;
            IsConnected = true;
            TcpClient.Send(RqtCMD.Login("1.0", UIN, PWD));//发送登录消息
            BeginInvoke(new EventHandler(OnConnect), null);
        }
        //连接失败
        void TcpClient_DisConnectedServer(object sender, NetEventArgs e)
        {
            CliClose();//回收资源
            Thread.Sleep(1000);//1秒
            if (count++ < 5)//尝试连接次数
            {
                Thread.Sleep(5000);//5秒
                ConnectServer(_ip, _port);//再次连接
            }
            else//认为真的断线
                BeginInvoke(new EventHandler(OnDisConnected), null);
        }现在的问题是当我重启服务端后,所有断线的客户就会同时登录,服务端根本处理不过来.
出现数据丢失错误!有什么好的解决方法????

解决方案 »

  1.   

    自定义的通信协议,如:
    CMD=Login|SEQ=4791312|VER=1.0.0.0|UIN=3224713|PWD=1 
    Login表示登录
    SEQ是为了防止重复发送而设定的一个标记,取当前时间数值的一段
    ...
    服务端接收后是用string.split来分的;为了取出方便我把它先装入一个Hashtable        public RecvMsg()
            {
                _HasTable = new Hashtable();
                //命令7个
                _HasTable.Add("CMD", "");
                _HasTable.Add("VER", "");
                _HasTable.Add("SEQ", "");
                _HasTable.Add("RES", "");
                _HasTable.Add("RA", "");
                _HasTable.Add("MSG", "");
                _HasTable.Add("ST", "");
    .....
            /// <summary>
            /// 数据分析
            /// </summary>
            /// <param name="datagram">接收的消息</param>
            public void SplitStr(string datagram)
            {
               string[] tokens = datagram.Split(new char[] { '|' });
               for (int i = 0; i < tokens.Length; i++)
               {
                    string[] Items = tokens[i].Split(new char[] { '=' });
                    _HasTable[Items[0]] = Items[1];
                 }
             }
      

  2.   

    呵!!忘了谢Knight94(愚翁) 了,帮我解决了不少问题!!   _HasTable[Items[0]] = Items[1];
    而后可以直接取CMD、SEQ、VER的值了这样做我当时是为了存取方便,程序优雅些!可能也是问题所在.
    to Kninght94 我是不是这样做
    服务接收后先存入一个Queue表,用另一线程来处理??
      

  3.   

    to 服务接收后先存入一个Queue表,用另一线程来处理??用另一个Queue表去存储,没有问题,你最好在服务器端,看看是否接收到所有client重发的连接信息。
      

  4.   

    to 用另一个Queue表去存储,没有问题,你最好在服务器端,看看是否接收到所有client重发的连接信息。目前我还是在本机上做测试,只有3个client,server要是只接收字符串而不处理的话没有问题,
    肯定是拆装箱太频繁费时 。想问一下处理这样的字符串有没更好的方法!
    CMD=Login|SEQ=4791312|VER=1.0.0.0|UIN=3224713|PWD=1 
      

  5.   

    用另一个Queue表去存储,没有问题,就是速度明显变慢了!!!