2010-06-27 6 views
0

LAN에서 작동하는 암호화 된 채팅 프로그램을 개발 중이며 파일을 보낼 수 있어야합니다. 문제가 있습니다 : 1 - 채팅 용으로 1 개의 메시지 만 보내고 연결을 닫으면 상대방이 메시지를 수신하기 위해 프로그램을 다시 실행해야합니다.이 메시지는 마치 (닫기를 수신하고 다시 수신함)과 같은 루프에 넣으려고 시도했지만 프로그램이 충돌했습니다.들어오는 데이터를 확인하십시오

파일을 수신하는 데 동일한 문제가 있습니다. ,
이 문제를 어떻게 해결할 수 있습니까? 이것은 코드입니다 IP = textBox2.Text.ToString(); int port = int.Parse (textBox1.Text); IPAddress IP2 = IPAddress.Parse (IP); TcpListener TCPListen = 새 TcpListener (IP2, 포트);

   TCPListen.Start(); 

      TcpClient TCP = TCPListen.AcceptTcpClient(); 
      //bool a = false; 

      NetworkStream NetStream = TCP.GetStream(); 



      //while (!a) 
      //{ 

      RijndaelManaged RMCrypto = new RijndaelManaged(); 


      byte[] Key = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16 }; 
      byte[] IV = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16 }; 




      CryptoStream CryptStream = new CryptoStream(NetStream, 
       RMCrypto.CreateDecryptor(Key, IV), 
       CryptoStreamMode.Read); 

      StreamReader SReader = new StreamReader(CryptStream); 




      message = SReader.ReadToEnd(); 

      textBox3.Clear(); 

      textBox3.Text = message; 

      CryptStream.Flush(); 

      SReader.Close(); 


      //encryption(NetStream); 




      NetStream.Flush(); 

      NetStream.Close(); 

      TCPListen.Stop(); 
      TCP.Close(); 

그리고 이것은 루프에 있습니다. bool a = false; while (! a) 이는 계속 수행한다는 의미입니다.

+3

우리는 훨씬 더 구체적인 정보가 필요합니다. 프로그램이 어떻게 충돌합니까? 충돌하는 코드는 무엇입니까? – Thomas

+0

명령으로 입력 할 수 없으므로 질문을 편집하여 입력하십시오. – Mohammad

+0

다른 사람에게 알려 주시면 암호화 된 클라이언트로부터 데이터를받는 서버입니다. – Mohammad

답변

1

먼저이 작업을 훨씬 복잡하게 만듭니다. 소켓이나 TcpClient를 직접 다루지 않아도됩니다. WCF를 사용하여 클라이언트가 서로 통신하도록하십시오. 그것은 매우 간단하며,이 지루한 모든 것에 대해 걱정할 필요가 없습니다. WCF는 모든 배관을 처리합니다.

두 번째로, 만약 당신이하고있는 것처럼한다면, NetworkStream이나 SslStream을 열어서 그 스트림에 "읽기"와 "쓰기"를하면 모든 통신을 처리 할 수 ​​있습니다. 가장 쉬운 방법은 하나의 연결/스트림을 통해 모든 것을 수행하는 것입니다. 즉, 파일을 전송하는 동안 채팅 할 수 없음을 의미합니다. 다른 스트림을 그림으로 가져 오자 마자 다른 스트림의 순서가 더 복잡해집니다. 이제는 기본 스트림 외에도 해당 스트림의 연결과 수명을 관리해야하기 때문입니다. 대부분의 코드는 문제로부터 복구해야하기 때문에이 접근법은 매우 취약 할 수 있습니다. 통신하는 동안 다른 사람이 라우터를 재부팅하면 어떻게됩니까? 파일 전송이 실패하면 어떻게됩니까? 이렇게 낮은 수준에서이 문제를 처리하기 때문에 정상적으로 작동하지 않게되는 많은 코드가 필요합니다.

다시 말하지만, 나는 이것을 위해 WCF를 적극적으로 사용할 것입니다. 희망이 도움이됩니다.

+0

그게 정말로 도움이되는 사람입니다. 문제를 해결하는 열쇠라고 생각합니다. 고마워요. – Mohammad

관련 문제