使用网络流发送和接收数据C#

本文关键字:数据 网络 | 更新日期: 2023-09-27 18:27:34

嗨,我正试图将字符串从客户端发送到服务器。它不起作用,所以我试图通过在同一台机器上发送数据和接收数据来测试下面的功能。

我遇到的问题是ReceiveData()中的_serverStream.DataAvailable总是返回false。如何检查这两个功能是否正常工作?_serverStream是否无法发送/接收数据?

    public void SendData(string dataToSend)
    {
        if (string.IsNullOrEmpty(dataToSend))
            return;
        _serverStream = _serverClient.GetStream();
            byte[] outStream = Encoding.UTF8.GetBytes(dataToSend);
            _serverStream.Write(outStream, 0, outStream.Length);
            //_serverStream.Flush();
    }
    public string ReceiveData()
    {
        StringBuilder message = new StringBuilder();
        _serverStream = _serverClient.GetStream();
        _serverStream.ReadTimeout = 100;
        while (true)
        {
            if (_serverStream.DataAvailable)
            {
                int read = _serverStream.ReadByte();
                if (read > 0)
                {
                    message.Append((char)read);
                }
                else
                {
                    break;
                }
            }
            else if (message.ToString().Length > 0)
            {
                break;
            }
        }
        return message.ToString();
    }

我称SendData()ReceiveData()如下:

    tcpclient.SendData(username);
    string test = tcpclient.ReceiveData();
    MessageBox.Show(test);

使用网络流发送和接收数据C#

虽然代码中没有显示它,但我猜_serverClient是一个TcpClient。

在这两种方法中,您都从相同的_serverClient获取网络流,因此您访问的是完全相同的网络流。而且,当您在SendData中将数据写入网络流时,您似乎期望能够在ReceiveData中读取相同的数据,这是不正确的。

当您将数据写入网络流时,它实际上是通过网络发送的——不能从同一网络流中读取。您只能读取从远程端点接收的数据。换句话说,除非您有一个远程端点向您发回数据,否则您将没有任何DataAvailable可供读取。

ReceiveData中,您应该从服务器端获取网络流,例如从通过调用TcpListener.AcceptTcpClient返回的TcpClient,而不是从用于发送数据的同一TcpClient