2012-07-01 62 views
1

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

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行上的例外。我不明白为什么或者我该如何解决这个问题。

+0

u能提ü[R面临什么样的异常? – ZafarYousafi

回答

0

你.Disconnect()调用需要有真正的作为参数,以允许重复使用。您当前正在告诉套接字禁止重新连接。 See here的文档。

+0

没有工作...给出tcpclient.connect行错误,说 – Adir

0

不是这方面的专家,但我认为一个可能的解决办法是正常关闭使用tcpclnt.Close()的连接。如果你不这样做,或者让垃圾收集器不正常地做它,那么你不能重新连接(我认为)。关闭流,然后关闭tcpclnt而不是断开连接。

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

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

编辑

以上不起作用。我不知道如何重用套接字。这是我如何得到它的工作...

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

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

+0

也没有工作....实际问题tcpclnt.Connect每一次都被给予的问题。我可以做的一两件事,我可以定义“公共TcpClient的tcpclnt =新的TcpClient();”每次我尝试连接,但目前看来,会创造出很多开放的线程....如果用户点击连接按钮10次,然后它会创建10个开放的连接....(不确定在这一部分,因为我是这个技术的新人)..建议将这是一个很好的方法来做到这一点。 – Adir

+0

要小心关闭流和连接,因为它们紧密地绑定到套接字,所以在不得不重用套接字的情况下可能不会那么优雅。由于某些原因,C#中的TCP库非常... winie。只是要小心:) –

+0

是的,似乎它的工作,谢谢Theo :-) – Adir