天天看点

Socket编程 关于缓冲区长度问题

先描述问题的情景:系统的组成是客户端--代理服务器--服务器

问题:客户端向代理服务器发送登录请求,代理服务器向服务器转发客户端的登陆请求。问题出现在代理服务器接收消息,并且转发成功后没有收到服务器的登陆结果。

           并且在输出登陆请求的时候,字符串是正常的。

后来经过讨论,问题出在代理服务器的转发请求上。

下面直接上解决办法:

        //代理服务器接收数据方法

        private void ServerGetMessage(object socket)

        {

            Socket s = (Socket)socket;

            while (true)

            {

                    Byte[] result = new Byte[1024];//注意这里,申请到的缓冲区长度是1024.所以之后转发的消息长度也是1024,这就意味着在少于1024字节的消息中会出现无意义字符

                    int msgLength=s.Receive(result);//获取到我们的消息长度

                    textBox1.AppendText("\r\n" + s.RemoteEndPoint.ToString() + "   " + "as server:" + ASCIIEncoding.ASCII.GetString(result));

                    lSocket[s].Send(ASCIIEncoding.ASCII.GetBytes(ASCIIEncoding.ASCII.GetString(result).Substring(0, msgLength)));

                    Console.WriteLine(lSocket[s].RemoteEndPoint.ToString());

                    Console.WriteLine(ASCIIEncoding.ASCII.GetBytes(ASCIIEncoding.ASCII.GetString(result).Substring(0, msgLength)).Length + "aa" + ASCIIEncoding.ASCII.GetString(result).Substring(0, msgLength));//这里只要获取到我们需要的字符串长度就行了

                    //Data data = new Data();

                    //data.msg = ASCIIEncoding.ASCII.GetString(result);

                    //data.s = s;

                    //JsonDecode jd = new JsonDecode(ASCIIEncoding.ASCII.GetString(result));

                    //Thread thread = new Thread(ServerMsgMethod);

                    //thread.Start(data);

            }

        }

继续阅读