1

同期メッセージ交換用のクライアント クラス:

public class AsClient
{
    private TcpClient connection;

    public AsClient(int serverPort, String ip)
    {
        connection = new TcpClient(ip, port);
    }

    public AsMessage sendMessage(AsMessage message)
    {
        System.Diagnostics.Debug.WriteLine("Connected: " + connection.Connected);
        NetworkStream ns = connection.GetStream();

        StreamReader reader = new StreamReader(ns);
        StreamWriter writer = new StreamWriter(ns);

        // Send Message:
        String msgToSendEncoded = message.encode();
        writer.WriteLine(msgToSendEncoded);
        writer.WriteLine("\n"); // each message is terminated by a paragraph
        writer.Flush();

        // Receive Message:
        String msgReceivedRaw = reader.ReadLine();
        AsMessage response = AsMessage.decode(msgReceivedRaw);

        reader.Dispose();
        writer.Dispose();

        ns.Close();

        return response;
    }
}

このアプリケーションをデバッグすると、最初に送信されたメッセージと受信された応答は完全に機能しますが、2 番目のメッセージを送信しようとすると、TcpClient.getStream() は InvalidOperationException で失敗し、接続が確立されていないことが示されます。

問題は、どこでも積極的に接続を閉じていないことです。を呼び出す前に connection.Connect(host,port) を配置するとgetStream()、connection.Connected が false であっても、ソケットがまだ接続されているという例外で失敗します。

この問題を解決するためのアイデアはありますか?

4

2 に答える 2

1

私が経験したように、根底にあるストリームを破棄して閉じます。

したがって、Dispose で接続を閉じます。

于 2013-07-24T13:20:31.267 に答える