【问题标题】:Send and Receive data C# using network stream使用网络流发送和接收数据 C#
【发布时间】:2026-02-02 11:45:01
【问题描述】:

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

我遇到的问题是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);

【问题讨论】:

  • 您对 DataAvailable 的使用是一个错误。几乎所有 DataAvailable 的用法都是错误的。搜索 DataAvailable 以了解原因。

标签: c# tcpclient networkstream


【解决方案1】:

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

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

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

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

【讨论】:

  • 非常感谢您的建议!我意识到我正在使用相同的网络流,所以感谢您的澄清。
  • @Eren:如果我们要先读再写,是否需要创建两个网络流?
  • 不,你不需要。您可以在单个网络流上进行读写。但是,当您编写时,您将无法从同一个网络流中读取这些字节。您只能读取从远程端发送的字节。就像电话一样,你可以边说边听,但你只听对方说什么。你什么也不说,只是听到你自己的话。
最近更新 更多