4

こんにちは、クライアントからサーバーに文字列を送信しようとしています。動作しないため、同じマシンでデータを送信および受信して、以下の機能をテストしようとしています。

私が遭遇した問題は、_serverStream.DataAvailablein がReceiveData()常に 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()andを呼び出します。ReceiveData()

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

1 に答える 1

2

コードには表示されていません_serverClientが、TcpClient だと思います。

どちらの方法でも、同じ からネットワーク ストリームを取得するため、まったく同じネットワーク ストリーム_serverClientにアクセスしています。また、 でネットワーク ストリームにデータを書き込むと、内で同じデータを読み取ることができると期待しているようですが、これは正しくありません。SendDataReceiveData

データをネットワーク ストリームに書き込むと、実際にはネットワーク経由で送信されます。同じネットワーク ストリームからデータを読み取ることはできません。リモート エンドポイントから受信したデータのみを読み取ることができます。つまり、データを送り返すリモート エンドポイントがない限り、DataAvailable読み取る必要はありません。

では、データの送信に使用したものからではなくReceiveData、サーバー エンドからネットワーク ストリームを取得する必要があります。TcpClientTcpListener.AcceptTcpClientTcpClient

于 2013-08-13T15:04:39.650 に答える