2012-07-01 7 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

어떤 종류의 예외적 인 문제에 대해 언급 할 수 있습니까? – ZafarYousafi

답변

0

재사용을 허용하려면 .Disconnect() 호출에 매개 변수로 true가 있어야합니다. 현재 재 연결을 허용하지 않도록 소켓에 알려줍니다. 설명서는 See here입니다.

+0

did not work ... tcpclient.connect 행에 오류가 발생하여 – Adir

0

이 주제에 대해서는 전문가가 아니지만 가능한 해결책은 tcpclnt.Close()를 사용하여 정상적으로 연결을 닫는 것입니다. 당신이 이것을하지 않거나 가비지 컬렉터가 비정상적으로 그것을하게한다면, 당신은 다시 연결할 수 없다 (나는 생각한다). 스트림을 닫은 다음 연결을 끊기보다는 tcpclnt를 닫으십시오.

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

또한 tcpclnt.Connected를 사용하여 연결이 있는지 확인하지 마십시오. 단지 그것을 닫으십시오.

편집

위 작동하지 않습니다. 소켓 재사용 방법을 모르겠습니다. 이것은 내가 일하는 방법입니다 ...

당신은 객체를 다시 인스턴스화하는 것이 추가 스레드를 생성한다고 언급했습니다. 이 문제를 어떻게 테스트 할 지 확신 할 수 없어 사실 일 수 있습니다. 나는 창 리소스 모니터를 열고 응용 프로그램에 대한 스레드 수를 보았고 매번 추가 스레드가 열리는 것을 보여주지 못했습니다.

+0

또한 작동하지 않습니다 ... 실제로 문제는 tcpclnt.Connect가 매번 문제가되는 것입니다. 연결하려고 할 때마다 "public TcpClient tcpclnt = new TcpClient();"를 정의 할 수있는 한 가지를 할 수 있지만, 열린 스레드가 많이 생성됩니다. 사용자가 연결 버튼을 10 번 클릭하면 그것은 10 개의 열린 커넥션을 생성 할 것입니다. (이 부분에 대해 확신하지는 않습니다.이 테크놀로지에 익숙하지 않습니다.)이 작업을 수행하는 좋은 방법이 될 것을 제안하십시오. – Adir

+0

소켓과 밀접하게 연결되어 있기 때문에 닫는 스트림과 연결을 조심해야합니다. 소켓을 다시 사용해야하는 경우에는 그다지 우아하지 않을 수 있습니다. 어떤 이유로 C#의 TCP 라이브러리는 꽤 ... winie입니다. 그냥 조심해라. –

+0

그래, 잘된 것 같아, 고마워 테오 :-) – Adir