1

我正在编写一个应用程序来向服务器发送/接收一些数据。我需要在发送一些数据之前建立连接,并且需要保持打开状态,以便用户可以连续发送数据。用户可以随时通过单击断开连接按钮来关闭连接。我创建了 2 个按钮,一个用于连接,一个用于断开连接。断开连接按钮后面的代码如下:-

    private void button1_Click(object sender, EventArgs e)
    {
        if (tcpclnt.Connected)
        {
            tcpclnt.Client.Disconnect(false);
            stm.Close();
        }
        else
        {
            MessageBox.Show("Not Connected");
        }
    }

连接按钮后面的代码如下:-

    public ASCIIEncoding asen = new ASCIIEncoding();
    public TcpClient tcpclnt = new TcpClient();
    public NetworkStream stm;

    private void Connect_Click(object sender, EventArgs e)
    {
        if (!tcpclnt.Connected)
        {                
            tcpclnt.Connect("XX.XX.XX.XX", 5500);
            MessageBox.Show("Connected to server");


            stm = tcpclnt.GetStream();

            string sysname = "000B0000" + SystemName.Text.ToString();
            byte[] sys1 = asen.GetBytes(sysname);
            sys1[0] = 0; sys1[1] = 0;
            sys1[2] = 0; sys1[3] = 0xB;
            sys1[4] = 0; sys1[5] = 0;
            sys1[6] = 0; sys1[7] = 0;
            try
            {
                stm.Write(sys1, 0, sys1.Length);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
                MessageBox.Show("Error in Sending data");
            }
            if (stm.DataAvailable)
            {
                try
                {
                    byte[] bb = new byte[600];
                    int k = 8;                        
                    k = stm.Read(bb, 0, bb.Length);
                    string value = ASCIIEncoding.ASCII.GetString(bb, 8, k - 8);
                    MessageBox.Show(value.ToString());
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.ToString());
                    MessageBox.Show("Error in Reading data");
                }
            }                
         }
         else {
                MessageBox.Show("Already Connected");
        }
    } 

现在,当我单击断开连接按钮并再次单击连接按钮时,它会在 tcpclient.connect 行上引发异常。我不明白为什么或如何解决它。

4

2 回答 2

1

不是该主题的专家,但我认为可能的解决方案是使用 tcpclnt.Close() 优雅地关闭连接。如果您不这样做或让垃圾收集器不优雅地这样做,那么您将无法重新连接(我认为)。关闭流,然后关闭 tcpclnt 而不是断开连接。

tcpclnt.GetStream().Close();
tcpclnt.Close();

另外,不要使用 tcpclnt.Connected 检查是否有连接。只需简单地关闭它。

编辑

以上不起作用。我不知道如何重用套接字。这就是我让它工作的方式......

private void DisconnectButton_Click(object sender, EventArgs e)
{
    tcpclnt.Close();
    tcpclnt = new TcpClient();
}

您提到重新实例化对象会创建额外的线程。这可能是真的,因为我不确定如何对此进行测试。我打开了 Windows 资源监视器并观察了应用程序的线程数,但每次都没有显示额外的线程打开。

于 2012-07-01T05:50:34.900 回答
0

您的 .Disconnect() 调用需要将 true 作为参数以允许重用。您当前正在告诉套接字不允许重新连接。有关文档,请参见此处

于 2012-07-01T01:54:43.200 回答