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

4

你好,我正尝试从客户端发送一个字符串到服务器。但它无法工作,所以我正在尝试通过在同一台机器上发送和接收数据来测试下面的功能。

我遇到的问题是,在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的使用是一个bug。几乎所有对DataAvailable的使用都是错误的。搜索DataAvailable以了解原因。 - usr
1个回答

2

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

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

当你向网络流写入数据时,它实际上被发送到网络上--它不能从同一网络流中读取。你只能读取你从远程端点接收到的数据。换句话说,除非你有一个远程端点返回给你数据,否则你就没有任何可读的DataAvailable

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


非常感谢您的建议!我意识到我正在使用相同的网络流,所以感谢您的澄清。 - user1779026
@Eren:如果我们想要读取并写入,我们需要创建两个网络流吗? - user1282609
2
不需要。您可以在单个网络流上读取和写入。但是,当您写入时,您将无法从同一网络流中读取这些字节。您只能读取从远程端发送的字节。就像电话一样,您可以同时说话和听取,但您只听取对方说的内容。您不会说话并期望听到自己的话回来。 - Eren Ersönmez

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接