天天看點

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);

            }

        }

繼續閱讀