1

だから私は単純なクライアントサーバーアプリケーションを書いています。パケットを送信してから、パケットを送信するよりも受信を待つ必要があります...問題は、最初のパケットを受信することですがTcpListener、2回目の反復で開始すると、次のエラーが発生します。

ターゲット マシンがアクティブに拒否したため、接続できませんでした 127.0.0.1:13

private void listenForConnections()
    {
        bool prejelPaket = false; 
        listener = new TcpListener(IPAddress, port);
        listener.Start();

        while (!packetReceived)
        {
            try
            {
                client = listener.AcceptTcpClient();
                listener.Stop();

                networkStream = client.GetStream();
                byte[] message = new byte[1024];
                networkStream.Read(message, 0, message.Length);
                networkStream.Close();

                string strMessage = Encoding.UTF8.GetString(message);
                packetReceived= true;
                MessageBox.Show("received message: " + strMessage);

                client.Close();
            }
            catch (Exception ee)
            {
                thListen.Join();
            }
        }
    }

    private void sendPacket(object pClient)
    {
        string message = "test message;

        try
        {
            client = (TcpClient)pClient;
            client.Connect(IPAddress, port);
            networkStream = client.GetStream();
            byte[] strMessage = Encoding.UTF8.GetBytes(message);
            networkStream.Write(strMessage, 0, strMessage.Length);           
            networkStream.Close();
            client.Close();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString());
        }
    }
4

2 に答える 2

1

移動

listener.Stop();

while ループの外側。

編集:理由を説明する

最初は機能するが 2 回目の反復が失敗する理由は、最初のクライアントがclient = listener.AcceptTcpClient()次のコード行から受け入れられた後、listener.Stop()接続のリッスンを停止するためです。以降の への呼び出しは、listener.AcceptTcpClient()をスローしInvalidOperationExceptionます。while ループの外側に移動listener.Stop()しても、ループを終了すると、接続のリッスンが停止するだけです。

もう一度見るとpacketReceived、最初の反復でも true に設定されているため、とにかく最初のクライアントの後に while ループを終了しますが、これは意図した動作ですか?

于 2013-05-03T00:53:36.370 に答える
1

クライアント/ネットワークストリームを一度作成します。送受信が完了するまでプロパティに保管してください。その後、閉じて廃棄してください。各反復間の接続を停止/閉じないでください。

于 2013-05-03T03:46:17.197 に答える