我在服务器和客户端之间发送和接收字节。服务器定期以字节的形式发送一些消息,客户端接收它们。
邮件格式如下: {密钥:值,关键:值,关键:值}
现在在客户端而不是收到此消息,我收到的此消息的多个副本不适用于此。
客户端收到这样的信息: {键:值,键入:值,键:值} {键:值,键入:值,键:值} {键:值,键入:值,键:值} {键:值,键入:值,键:值} {键:值,键入:值,键:值} {键:值,键入:值,键:值} {密钥:值,关键:值,
有人可以帮我解决问题吗?
更新
此代码正在发送说明。
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;
}
}
答案 0 :(得分:5)
好的,这段代码存在一些问题:
Encoding.Default
,这几乎当然不是您想要做的事情stream.Read
理想情况下,您的消息有一个前缀可以说明每个消息的长度(以字节为单位)。然后在接收端,您可以读取该长度,然后循环以重复读入缓冲区,直到您已读取所需的所有数据。 然后执行解码。
如果你不能改变协议,你仍然需要循环,但可能明确地检查结束分隔符(“}”) - 并注意到你可能会收到下一条消息的数据,你将会必须存储,直到你下一次想要阅读。
答案 1 :(得分:1)
你有:
while (true)
在发件人中:它只是一遍又一遍地发送同样的东西......
此外,如果您尝试发送或接收数据时遇到异常,则不能再次尝试并期望它能够正常工作。根据确切的错误,您可能需要重新建立连接,或者可能是网络已完全消失。在任何情况下,只需再次重试几乎总是错误的。
答案 2 :(得分:0)
问题就像Dean Harding所说的那样。
但除此之外,您应该更清楚地了解“客户”或“服务器”
Basicaly:
只有服务器端应该等待(通过循环)msgs。客户端(发件人)在需要或有条件时发送消息
您可以在循环中发送消息,但应通过“睡眠”或“定时器”控制和调节它。通过这种方式,您可以节省资源并为接收器提供更多时间来完全处理消息。
答案 3 :(得分:0)
您正在通过TCP发送数据。 TCP是一种面向流的协议,因此您知道客户端将以相同的顺序接收相同的字节流,但是您会丢失数据包边界。您的协议似乎是面向数据包的。然后你可以选择:
请记住,TCP具有UDP中没有的一些可靠性功能。如果不考虑可靠性,请切换到UDP。否则,在客户端找到分隔符应该比实现自己的可靠性层更容易。