【问题标题】:TcpListener won't acknowledge connectionsTcpListener 不会确认连接
【发布时间】:2013-05-03 15:15:20
【问题描述】:

所以我正在编写一个简单的客户端-服务器应用程序。它应该发送一个数据包,然后等待接收一个数据包,而不是发送一个等等......问题是,它收到了第一个数据包,但是当我在第二次迭代中启动 TcpListener 时,它给了我这个错误:

无法建立连接,因为目标机器主动 拒绝它 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());
        }
    }

【问题讨论】:

    标签: c# tcpclient tcplistener


    【解决方案1】:

    创建一次客户端/网络流。将它们存储在一个属性中,直到您完成发送和接收。然后关闭并丢弃。不要停止/关闭每次迭代之间的连接。

    【讨论】:

      【解决方案2】:

      移动

      listener.Stop();
      

      在while循环之外。

      编辑:解释原因

      它第一次工作但第二次迭代失败的原因是因为在第一个客户端从client = listener.AcceptTcpClient() 接受后,下一行代码调用listener.Stop() 停止侦听连接。对listener.AcceptTcpClient() 的任何后续调用都会抛出InvalidOperationException。将 listener.Stop() 移出 while 循环只会在退出循环后停止监听连接。

      再次查看packetReceived 在第一次迭代中也设置为 true,所以无论如何它都会在第一个客户端之后退出 while 循环,这是预期的行为吗?

      【讨论】:

      • 我认为你错了,AcceptTcpClient() 阻塞线程直到客户端连接,所以当它连接时,它只是停止监听器。
      • 这不是您遇到的问题吗?如果不是,我误解了你的问题。
      猜你喜欢
      • 2012-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-16
      • 2012-07-29
      • 2016-11-20
      相关资源
      最近更新 更多