0

クライアントから値を受け取る関数です。しかし、問題は、私はそれを一度しか受けていないということです. 何度データを送信しても、MainWindows のラベルが変更されるのは 1 回だけです。

ここで何が間違っていますか?

private void HandleClientComm(object client)
{
    tcpClient = (TcpClient)client;
    NetworkStream clientStream = tcpClient.GetStream();

    byte[] message = new byte[4096];
    int bytesRead;

    while (true)
    {
        bytesRead = 0;

        try
        {
            bytesRead = clientStream.Read(message, 0, 4096);
        }
        catch
        {
            break;
        }

        if (bytesRead == 0)
        {
            break;
        }

        if (String.IsNullOrWhiteSpace(data))
        {
            ASCIIEncoding encoder = new ASCIIEncoding();
            data = encoder.GetString(message, 0, bytesRead);

            MainWindow.Change(data);
            tcpClient.Close();
        }

        tcpClient.Close();

    }

クライアント側には、次の例があります。

try
{
    TcpClient tcpclnt = new TcpClient();
    Console.WriteLine("Connecting.....");
    tcpclnt.Connect("127.0.0.1", 8001);
    Console.WriteLine("Connected");
    while (true)
    {
        Console.Write("Enter the string to be transmitted : ");
        String str = Console.ReadLine();
        Stream stm = tcpclnt.GetStream();
        ASCIIEncoding asen = new ASCIIEncoding();
        byte[] ba = asen.GetBytes(str);
        Console.WriteLine("Transmitting.....");
        stm.Write(ba, 0, ba.Length);
        stm.Flush();
        Console.WriteLine("Sent.....");
    }

    tcpclnt.Close();
    Console.Read();
}
catch (Exception e)
{
    Console.WriteLine("Error..... " + e.StackTrace);
}

簡単な例です。文字列名を入力すると、最初に値が変更されますが、2 回目に入力するか、クライアント プログラムを終了して何も変更されない場合、ラベル コンテンツの値は最初に送信された値と等しくなります。価値。

4

3 に答える 3

0

tcpClient.Close()の後にclientStream.Read()を使用すると、例外がスローされ、catchブロックが実行され、ループから抜け出します。(そして、ループ内の2つの場所でtcpClient.Close()を呼び出しているので、1つだけを取り除くだけでは役に立ちません。どちらも間違っています。)

接続が完全に完了していない限り、tcpClient.Close()を呼び出さないでください(さらに、一度だけ呼び出す必要があります)。

また、

「データの送受信が終了したら、NetworkStreamを閉じる必要があります。TcpClientを閉じてもNetworkStreamは解放されません。」

したがって、TcpClientとNetworkStreamを必ず閉じてください。ただし、ループでの処理が完全に終了した場合に限ります。

于 2013-02-19T22:40:25.300 に答える
0

非同期サーバーソケットを使用する必要があります...MSDNLinkのこのサンプルを参照して ください

于 2013-02-19T17:51:07.987 に答える
0

呼び出している最初の読み取りが成功した後、次のようになります。

tcpClient.Close();

これにより、今後の読み取りが成功しなくなります。

この種のソケットの問題を回避したい場合は、代わりにネットワーク ライブラリを使用することを検討しましたか? 私はライブラリ networkComms.net の開発者です。短い例またはここで意味することを見つけることができます。

于 2013-02-19T16:33:44.720 に答える