用C#编写的 同步Socket通信接受数据不完整或接受不到,望知道的给与解答。
代码贴出来如下:
-------------------------------------                             Socket s = null;
                IPEndPoint hostEndPoint;
                IPAddress hostAddress = IPAddress.Parse(setting.FrontForIP);
                int conPort = int.Parse(setting.FrontForPort);
                hostEndPoint = new IPEndPoint(hostAddress, conPort);                // Creates the Socket to send data over a TCP connection.
                s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);                // Connect to the host using its IPEndPoint.
                s.Connect(hostEndPoint);                if (!s.Connected)
                {
                    s = null;
                }                byte[] msg = Encoding.UTF8.GetBytes(xmlBW);
                byte[] bytes = new byte[1024 * 10];
                string resp = string.Empty;
                try
                {
                    // Blocks until send returns.
                    int byteCount = s.Send(msg, 0, msg.Length, SocketFlags.None);
                   
                    // Get reply from the server.
                    byteCount = s.Receive(bytes, 0, bytes.Length, SocketFlags.None);                    int i = 0;
                    while (byteCount==0 && s.Available>0)
                    {
                        byteCount = s.Receive(bytes, 0, bytes.Length, SocketFlags.None);
                        if (i >= 4)
                            break;
                        i++;
                    }                    if (byteCount > 0)//表示有返回
                    {
                        resp = Encoding.UTF8.GetString(bytes);
                    }
                    s.Close();
                    return resp;                }

解决方案 »

  1.   

    比如说:   while (byteCount!=0 || s.Available>0)
      

  2.   

    还有啊,搞个循环一遍一遍地覆盖bytes数据,这又是什么意思呢?另外最后的“Encoding.UTF8.GetString”显然不能从整个bytes数组里取值,它只应该取有效数据(长度等于byteCount个字节)。唉,你最好删除了自己的程序,重新考虑逻辑。
      

  3.   

      我这里弄个循环一遍一遍的取是有时候获取不到值,所以多次去获取,我对这方面的编程刚接触不久,如果有好的这方面的例子的,给个地址或发到。   不过我后面在 byteCount = s.Receive(bytes, 0, bytes.Length, SocketFlags.None);
    前面加上   Thread.sheep(350); 程序就能很好的接受返回,求解!!!
      

  4.   

    既然你要接受数据,干嘛要弄个什么i,还》4之后就break。。没搞明白,姑且当成你的业务需要。支持2楼观点,byteCount==0表示的是对方server(通过代码,你这边怎么看都是client)关掉了对应的socket,因为数据传输完毕了,对方都已经close,并且shutdown了,你这时候再去循环有什么用。