3

私のコードでは、サーバー上のメッセージを読み取り、クライアントから書き込むことができます。しかし、サーバーからの応答を書き込んでクライアントで読み取ることができません。

上のコードclient

var cli = new TcpClient();

cli.Connect("127.0.0.1", 6800);

string data = String.Empty;

using (var ns = cli.GetStream())
{
    using (var sw = new StreamWriter(ns))
    {
        sw.Write("Hello");
        sw.Flush();

        //using (var sr = new StreamReader(ns))
        //{
        //    data = sr.ReadToEnd();
        //}
    }
}

cli.Close();

上のコードserver

tcpListener = new TcpListener(IPAddress.Any, port);
tcpListener.Start();

while (run)
{
    var client = tcpListener.AcceptTcpClient();

    string data = String.Empty;

    using (var ns = client.GetStream())
    {
        using (var sr = new StreamReader(ns))
        {
            data = sr.ReadToEnd();

            //using (var sw = new StreamWriter(ns))
            //{
            //    sw.WriteLine("Hi");
            //    sw.Flush();
            //}
        }
    }
    client.Close();
}

データを読み取った後にサーバーに応答させ、クライアントにこのデータを読み取らせるにはどうすればよいですか?

4

2 に答える 2

3

使用しているので

TcpClient client = tcpListener.AcceptTcpClient();

、自己識別を必要とせずにクライアントに直接書き戻すことができます。 またはの代わりに使用すると、コードは実際に機能します。 ストリームが閉じられるまで、ネットワーク ストリーム上で永久にブロックされます。同様の質問に対するこの回答を参照するか、 MSDNから、Stream.Read().ReadLine().ReadToEnd()ReadToEnd()

ReadToEnd は、ストリームがいつ終了したかをストリームが認識していると想定します。サーバーが要求した場合にのみデータを送信し、接続を閉じない対話型プロトコルの場合、ReadToEnd は最後に到達しないため無期限にブロックされる可能性があり、回避する必要があります。

一方で ReadLine() を使用する場合、他方では Write() ではなく WriteLine() を使用する必要があります。もう 1 つの方法は、読み取るものがなくなるまで Stream.Read() を呼び出すループを使用することです。MSDN の AcceptTcpClient() ドキュメントで、サーバー側のこの完全な例を確認できます。対応するクライアントの例は、TcpClient のドキュメントにあります。

于 2011-04-08T03:14:43.823 に答える
0

安っぽい、非効率的ですが、1 回限りの使い捨てプログラムでトリックを実行します。

  • クライアント: ストリームに、応答を受信したいポートと IP アドレスを含めます。
  • クライアント: そのポートと IP のリスナーを作成します。
  • サーバー: ポート/IP 情報を読み込んで接続し、応答ストリームを送信します。

ただし、ここから開始することをお勧めします。適切な双方向通信については、Sockets クラスを調べてください。

于 2011-04-08T02:35:59.927 に答える