2017-03-01 16 views
0

表示する文字列メッセージが必要なリスナーアプリケーションがあります。私はこのアプリケーションを変更することはできません。 C#クライアントを介してこのリスナーにメッセージを送信する必要があります。リスナとクライアントの両方が同じPC(ローカルホスト)上で実行されるはずです。閉じられていないソケット接続に再接続するC#

マイコードを接続するには:

public void ConnectAndSendMessage(string MessageToSend) 
    { 
     string localIP = GetIPAddress(); 

     try 
     { 
      TcpClient tcpclnt = new TcpClient(); 
      Console.WriteLine("Connecting....."); 
      tcpclnt.Connect(localIP, 2400); 

      Socket socket = tcpclnt.Client; 
      bool connectionStatus = socket.Connected; 

      if (connectionStatus) 
      { 
       //Send Message 
       ASCIIEncoding asen = new ASCIIEncoding(); 
       //string sDateTime = DateTime.Now.ToString(); 
       int SendStatus = socket.Send(asen.GetBytes(MessageToSend + Environment.NewLine)); 
      } 
      Thread.Sleep(2000); 

      tcpclnt.Close(); 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine("Error..... " + e.StackTrace); 
     } 
    } 

問題:

クライアントアプリケーションが正常に動作し、リスナーに正常にメッセージを送信します。 しかし、tcpclnt.Close();を実行する前にクライアントがクラッシュしたら(私はクライアントプログラムを閉じます)、問題が発生します。この場合、クライアントプログラムを再起動すると、以前の実行(クラッシュした実行)でアプリケーションがソケットを閉じなかったため、ソケットに接続できません。

この状態でリスナーに再接続するにはどうすればよいですか?

+1

をこれを試してみてください。また、プログラムでは変更できない問題があります。通常、サーバは複数の接続を許可し、放棄された接続をタイムアウトする手段を持っています。 –

答えて

0

は、それがどのようにアプリケーションのクラッシュに応じて、チャンスを得れば、それはまだ接続を閉じるようにするには、 `TcpClient`ため` using`ブロックを使用する必要があります。..

public void ConnectAndSendMessage(string MessageToSend) 
{ 
    string localIP = GetIPAddress(); 

    using (System.Net.Sockets.TcpClient tcpclnt = new System.Net.Sockets.TcpClient()) 
    { 
     try 
     { 
      Console.WriteLine("Connecting....."); 
      tcpclnt.Connect(localIP, 2400); 

      using (System.Net.Sockets.Socket socket = tcpclnt.Client) 
      { 
       if (socket.Connected) 
       { 
        //Send Message 
        System.Text.ASCIIEncoding asen = new System.Text.ASCIIEncoding(); 
        //string sDateTime = DateTime.Now.ToString(); 
        int SendStatus = socket.Send(asen.GetBytes(MessageToSend + Environment.NewLine)); 
       } 
       System.Threading.Thread.Sleep(2000); 
      } 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine("Error..... " + e.StackTrace); 
     } 
     finally 
     { 
      if (tcpclnt != null && tcpclnt.Connected) 
       tcpclnt.Close(); 
     } 
    } 
} 
+0

それは問題を解決しませんでした。それは例外ではない。私がコードをデバッグすると、 'bool connectionStatus = socket.Connected;'という行はfalseを返しますが、catchブロックには入りません。 – skm

+0

私は 'using'ブロックを置くと直ぐに' tcpclnt'はtryブロックとcatchブロックの文脈から外れます。 – skm

+0

いいえ、そのコンテキストのtryブロックから外に最初にブロック –

関連する問題