套接字发送长字符串的null

时间:2011-05-05 18:41:25

标签: c# sockets

大家好,我目前在使用Socket发送数据时遇到问题。

当客户端发送到服务器(例如“HEART”)作为心跳时,我现在遇到一个非常奇怪的问题。在第一次发送服务器开始接收大量的\ 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消息心跳)

1 个答案:

答案 0 :(得分:2)

这段代码不正确:

    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个发送呼叫,可能需要多个接收呼叫才能读取,或者1个接收呼叫可能会从多个发送呼叫中读取数据。