C#Socket Trick

时间:2010-10-04 05:47:39

标签: c# sockets

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

邮件格式如下: {密钥:值,关键:值,关键:值}

现在在客户端而不是收到此消息,我收到的此消息的多个副本不适用于此。

客户端收到这样的信息: {键:值,键入:值,键:值} {键:值,键入:值,键:值} {键:值,键入:值,键:值} {键:值,键入:值,键:值} {键:值,键入:值,键:值} {键:值,键入:值,键:值} {密钥:值,关键:值,

有人可以帮我解决问题吗?

更新


此代码正在发送说明。

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

此代码在客户端接收。

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

4 个答案:

答案 0 :(得分:5)

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

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

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

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

答案 1 :(得分:1)

你有:

while (true)

在发件人中:它只是一遍又一遍地发送同样的东西......

此外,如果您尝试发送或接收数据时遇到异常,则不能再次尝试并期望它能够正常工作。根据确切的错误,您可能需要重新建立连接,或者可能是网络已完全消失。在任何情况下,只需再次重试几乎总是错误的。

答案 2 :(得分:0)

问题就像Dean Harding所说的那样。
但除此之外,您应该更清楚地了解“客户”或“服务器” Basicaly:
只有服务器端应该等待(通过循环)msgs。客户端(发件人)在需要或有条件时发送消息 您可以在循环中发送消息,但应通过“睡眠”或“定时器”控制和调节它。通过这种方式,您可以节省资源并为接收器提供更多时间来完全处理消息。

答案 3 :(得分:0)

您正在通过TCP发送数据。 TCP是一种面向流的协议,因此您知道客户端将以相同的顺序接收相同的字节流,但是您会丢失数据包边界。您的协议似乎是面向数据包的。然后你可以选择:

  • 切换到面向数据包的协议(UDP)或
  • 在接收方自己划分数据包(正如Jon Skeet所说,通过寻找分隔符)。

请记住,TCP具有UDP中没有的一些可靠性功能。如果不考虑可靠性,请切换到UDP。否则,在客户端找到分隔符应该比实现自己的可靠性层更容易。