我用SOCKET异步写了一个客户端和一个服务端,我在客户端连续发出几条信息,可服务端只接收到了第一条信息,以后的信息都没有接收到,请问这是怎么回事?

解决方案 »

  1.   

     private void load()
            {
                server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                IPEndPoint iep = new IPEndPoint(IPAddress.Any, 2020);
                server.Bind(iep);
                server.Listen(5);
                server.BeginAccept(new AsyncCallback(AcceptConn), server);
            }        private void AcceptConn(IAsyncResult iar)
            {
                Socket oldServer = (Socket)iar.AsyncState;
                client = oldServer.EndAccept(iar);
                conStatus.Text = "连接到:" + client.RemoteEndPoint.ToString();
                string stringData = "欢迎来到服务器";
                byte[] message1 = Encoding.UTF8.GetBytes(stringData);
                client.BeginSend(message1, 0, message1.Length, SocketFlags.None, new AsyncCallback(SendData), client);
            }        private void SendData(IAsyncResult iar)
            {
                Socket client = (Socket)iar.AsyncState;
                int sent = client.EndSend(iar);
                try
                {
                    client.BeginReceive(data, 0, size, SocketFlags.None, new AsyncCallback(ReceiveData), client);
                }
                catch (Exception ex)
                {
                    Common.Log.Error(ex.ToString());
                }
            }        private void ReceiveData(IAsyncResult iar)
            {
                Socket client = (Socket)iar.AsyncState;
                try
                {
                    int recv = client.EndReceive(iar);
                    if (recv == 18)
                    {
                        SPARE1 = BitConverter.ToInt16(data, 0);
                        HEADERID = Encoding.UTF8.GetString(data, 2, 2);
                        PLATEID = Encoding.UTF8.GetString(data, 4, 12);
                    }
                }
                catch (Exception ex)
                {
                    client.Close();
                    client.Shutdown(SocketShutdown.Both);
                    conStatus.Text = "等待客户端...";
                    server.BeginAccept(new AsyncCallback(AcceptConn), server);
                    return;
                }
            }
    当客户端发送后,在红字部分打断点,只响应一次。以后都不响应了
      

  2.   

    server.BeginAccept(new AsyncCallback(AcceptConn), server); 
    这里改成:
    client.BeginReceive(data, 0, size, SocketFlags.None, new AsyncCallback(ReceiveData), client); 
      

  3.   

      private void ReceiveData(IAsyncResult iar) 
            { 
                Socket client = (Socket)iar.AsyncState; 
                try 
                { 
                    int recv = client.EndReceive(iar); 
                    if (recv == 18) 
                    { 
                        SPARE1 = BitConverter.ToInt16(data, 0); 
                        HEADERID = Encoding.UTF8.GetString(data, 2, 2); 
                        PLATEID = Encoding.UTF8.GetString(data, 4, 12); 
                    }
    //加上下面几句试试
                    if(client.Connected)
                    {
                       client.BeginReceive(data, 0, size, SocketFlags.None, new AsyncCallback(ReceiveData), client);
    }
    //
                   
                } 
                catch (Exception ex) 
                { 
                    client.Close(); 
                    client.Shutdown(SocketShutdown.Both); 
                    conStatus.Text = "等待客户端..."; 
                    server.BeginAccept(new AsyncCallback(AcceptConn), server); 
                    return; 
                } 
            } 
      

  4.   


    private void AcceptConn(IAsyncResult iar) 
            { 
                Socket oldServer = (Socket)iar.AsyncState; 
                client = oldServer.EndAccept(iar); 
                conStatus.Text = "连接到:" + client.RemoteEndPoint.ToString(); 
                string stringData = "欢迎来到服务器"; 
                byte[] message1 = Encoding.UTF8.GetBytes(stringData); 
                client.BeginSend(message1, 0, message1.Length, SocketFlags.None, new AsyncCallback(SendData), client);
                server.BeginAccept(new AsyncCallback(AcceptConn), server); //加上这句,否则你的服务器只能有一个客户端可以连接上 
            }另外楼上的方法可以解决你只能收到一条消息的问题
      

  5.   

    谢谢大家,lljfl的可以实现。
    To:wzd24 牧野(高分亮解)  按照你的方法,当启动时,一直停留在client.BeginReceive(data, 0, size, SocketFlags.None, new AsyncCallback(ReceiveData), client);这。程序不能启动。可能是在一直在接受吧。忘说了,load()是在构造函数里,程序启动时,也就直接启动了