套接字发送空的长字符串

本文关键字:字符串 套接字 | 更新日期: 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中读取数据。