套接字发送空的长字符串
本文关键字:字符串 套接字 | 更新日期: 2023-09-27 17:54:53
嗨,伙计们,我有一个问题,目前当使用套接字发送数据。
我目前得到一个非常奇怪的问题,当客户端发送到服务器,例如"心脏",作为心脏跳动。在发送第一次之后,服务器开始接收大量的'0,并不总是在HEART之前相同的数量。我正在使用队列来排队发送,所以在慢速连接上,它等待当前发送完成,然后再发送下一个,但对于像这样的小长度,我有点困惑。
public void Send(string data)
{
if (Connected)
{
SendQueue.Enqueue(data);
if (t.ThreadState == ThreadState.Stopped)
{
t = new Thread(new ThreadStart(SendData));
t.Start();
}
else if (t.ThreadState == ThreadState.Unstarted)
t.Start();
}
}
和SendData函数
private void SendData()
{
if (sending)
return;
sending = true;
while (SendQueue.Count > 0)
{
if (ClientSocket.Connected)
{
byte[] data = Networking.StringToByte((string)SendQueue.Dequeue());
ClientSocket.Send(data);
}
}
sending = false;
}
我不认为这是发送函数,因为我已经调试过了,字节数组总是保存正确的信息。
接收端更简单。
public string Receive()
{
string msg = "";
if (Connected)
{
byte[] data = new byte[1024];
while (ClientSocket.Avaliable > 0)
{
ClientSocket.Receive(data);
msg += Networking.ByteToString(data).Trim();
}
}
return msg;
}
如果有人能指出我哪里错了,或者如果我在这个完全错误的方式,那将是伟大的。谢谢。
我要提醒大家,它似乎是每2秒'0的随机长度(在本例中为HEART消息heartbeat)
这段代码不可能正确:
byte[] data = new byte[1024];
while (ClientSocket.Avaliable > 0)
{
ClientSocket.Receive(data);
msg += Networking.ByteToString(data).Trim();
}
看来你没有考虑到你实际收到了多少数据。你必须看看从ClientSocket.Receive
的返回值,我不知道你的Networking.ByteToString
做什么,但是当你的代码运行Networking.ByteToString
时,该函数不能知道你实际收到了多少数据。它可能会转换整个缓冲区——全部1024字节。这可能就是你所有的零的来源。也有可能你在发送端做了类似的事情。
您可能还需要记住TCP是面向流的,而不是面向包的。如果你做了1个Send call,那可能需要几个Receive call来读取,或者1个Receive call可能会从许多Send call中读取数据。