有没有人遇到socket多个客户端编程,2个以上客户端上线后,先前上线的会很难(有时会接到)接到服务器发送过去的数据,新上线的客户接收数据就反映很快。
用的异步,和同步多线程都有这种问题,有谁知道怎么回事?

解决方案 »

  1.   

    补充一下,在PC机上就可以,如果放到一个wince上运行,就会出这种问题。
    部分代码,这些代码到底有什么问题,用同步多线程,问题一样,用java写的问题也一样。Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    listener.Bind(new IPEndPoint(_ip, _port));
    listener.Listen(100);
    listener.BeginAccept(new AsyncCallback(OnConnectRequest), listener);public void OnConnectRequest(IAsyncResult ar)
    {
          Socket listener = (Socket)ar.AsyncState;
          NewConnection(listener.EndAccept(ar));
          listener.BeginAccept(new AsyncCallback(OnConnectRequest), listener);
    }public void NewConnection(Socket sockClient)
    {     byte[] packetBuff = new byte[_max];// _max,1024
         sockClient.Receive(packetBuff);
         string _s = pEncoding.Encoding.GetString(packetBuff).TrimEnd('\0');
         
                string userKey, userSay;//userKey唯一标记,userSay客户端名称,都是客户端连接成功后马上发送过来的,格式userKey|userSay            try
                {
                    userKey = _s.Split('|')[0];                userSay = _s.Split('|')[1];
                }
                catch (Exception ex)
                {
                    userKey = "...";
                    userSay = "...";
                }
                
                
                clientsSession session = new clientsSession();//一个保存客户端的对象
                sockClient.Blocking = false;            session.SessionSocket = sockClient;            session.Key = userKey;//唯一标记            //一些判断代码(没有贴上来)             
                par.clients.Add(userKey,session);//par.clients是一个hashtable            SetupRecieveCallback(session);
    }ublic void SetupRecieveCallback(clientsSession session)
            {
                try
                {
                    AsyncCallback recieveData = new AsyncCallback(ReceiveData);
                    session.SessionSocket.BeginReceive(session.m_byBuff, 0, session.m_byBuff.Length, SocketFlags.None, recieveData, session);
                }
                catch (Exception ex)
                {
                    par.log.Add(ex.Message, cmd.protocol.LogIcon.All);
                }
            }
           //ReceiveData函数实现,省略。       //发送也是异步
    public void SendCmd(string key, string send)
            {
                try
                {
                    clientsSession session = par.pp[key] as session;
                    
                    byte[] _b = pEncoding.Encoding.GetBytes(send);
                    AsyncCallback sendRev = new AsyncCallback(SendRev);//SendRev为发送
                    session.SessionSocket.BeginSend(_b, 0, _b.Length, SocketFlags.None, sendRev, session);
                }
                catch
                {
                    //.....
                }
            }         //发送
             private void SendRev(IAsyncResult ar)
            {
                clientsSession session = (clientsSession)ar.AsyncState;
                Socket sock = session .SessionSocket;
                int nBytesRec = sock.EndSend(ar);
                if (nBytesRec < 1)
                {
                    sock.Shutdown(SocketShutdown.Both);
                    sock.Close();
                }
            }
      

  2.   

    看看这个!
    一个我经常参考的异步socket通信:

    C#.net 同步异步SOCKET通讯和多线程总结
      

  3.   

    socket通信额,有没有能够讲解一下子啊!
      

  4.   

    你是说客户端换成wince就收不到数据吗?是不是端口没设置好,抓包看看
      

  5.   


    如果只有一个wince,就正常,多个wince,特别是先前上线的wince,socket程序就很难收到服务器发送的数据。。新上线的就很好。兄弟有没有什么抓包工具可以推荐下?