C#Socket Trick

Uma*_* A. 0 c# sockets

我在服务器和客户端之间发送和接收字节.服务器定期以字节的形式发送一些消息,客户端接收它们.

消息格式如下:{Key:Value,Key:Value,Key:Value}

现在在客户端而不是收到此消息,我收到此消息的多个副本,这不适合这个.

客户端收到如下:{Key:Value,Key:Value,Key:Value} {Key:Value,Key:Value,Key:Value} {Key:Value,Key:Value,Key:Value} {Key:Value ,键:值,键:值} {键:值,键:值,键:值} {键:值,键:值,键:值} {键:值,键:值,

有人能帮我解决问题吗?

更新


此代码正在发送指令.

var client = (param as System.Net.Sockets.Socket);
            while (true)
            {
                try
                {
                    var instructions = "{";
                    instructions += "Window:" + window + ",";
                    instructions += "Time:" + System.DateTime.Now.ToShortTimeString() + ",";
                    instructions += "Message:" + msgToSend + "";
                    instructions += "}";

                    var bytes = System.Text.Encoding.Default.GetBytes(instructions);
                    client.Send(bytes, 0, bytes.Length, System.Net.Sockets.SocketFlags.None);
                }
                catch (Exception ex)
                {
                    continue;
                }
            }
Run Code Online (Sandbox Code Playgroud)

此代码在客户端接收.

while (true)
            {
                try
                {
                    var data = new byte[tcpClient.ReceiveBufferSize];
                    stream.Read(data, 0, tcpClient.ReceiveBufferSize);
                    instructions = System.Text.Encoding.Default.GetString(data.ToArray());
                }
                catch (Exception ex)
                {
                    continue;
                }
            }
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 5

好的,这段代码有一些问题:

  • 你正在使用Encoding.Default,这几乎肯定不是你想要做的
  • 你总是解码整个字符串,而不仅仅是你实际设法读取的数量 - 你忽略了返回值stream.Read
  • 您只是在异常后继续,没有记录,错误处理或任何事情
  • 正如Dean所说,你反复发送相同的数据

理想情况下,您的消息有一个前缀可以说明每个消息的长度(以字节为单位).然后在接收端,您可以读取该长度,然后循环以重复读入缓冲区,直到您已读取所需的所有数据.然后执行解码.

如果你不能改变协议,你仍然需要循环,但明确地检查结束分隔符("}") - 并注意到你可能会收到下一条消息中你必须存储的数据直到你下一个想要阅读.