2009-07-07 10 views
1

一部の組み込みデバイスと通信するはずのサーバーを作成しています。通信プロトコルは固定長ヘッダに基づいている。問題は、サーバーを突然デバイスの突然の切断に適切に対応させることができないことです(「突然」とは、単にデバイスをオフにしたときの状況を意味します)。ここでは、クライアント・スレッドのメインループのコードは次のとおりです。javaソケットサーバーと組み込みデバイス - 接続が正しく処理されない

while(!terminate) { 

     try { 
      // Receive the header 
      while(totalBytesRead < ServerCommon.HEADER_SIZE) { 

       bytesRead = dis.read(headerBuffer, bytesRead, ServerCommon.HEADER_SIZE - bytesRead); 
       if(bytesRead == -1) { 
       // Can't get here! 
       } 
       else { 
        totalBytesRead += bytesRead; 
       } 
      } 
      totalBytesRead = 0; 
      bytesRead = 0; 

      type = Conversion.byteArrayToShortOrder(headerBuffer, 0); 
      length = Conversion.byteArrayToShortOrder(headerBuffer, 2); 
      // Receive the payload 
      while(totalBytesRead < length) { 
       bytesRead = dis.read(receiveBuffer, bytesRead, length - bytesRead); 

       if(bytesRead == -1) { 
       // Can't get here! 
       } 
       else { 
        totalBytesRead += bytesRead; 
       } 
      } 
      totalBytesRead = 0; 
      bytesRead = 0; 

      // Pass received frame to FrameDispatcher 

私は、デバイスをオフにした場合でも、readメソッドは、0を返さない続け-1。これはどのようにすることができますか?

答えて

2

通常はソケットを閉じると、これを調整するためにクライアントとサーバーの間に一連のコードが送信されます(終了側のFINコードから開始)。この場合、これは起こっていません(デバイスをオフにするだけなので)、サーバは何が起こったのか不思議に思っています。

タイムアウトなどの設定や、何らかの種類のタイムプロトコルを使用して、応答がないことによる切断(ICMP/UDPを使用した帯域外のハートビートなど)を特定できます。あるいはあなたの通信に使用するUDPのようなコネクションレスなプロトコルですか?

1

Readは、指定された長さが0の場合にのみ、0を返すと想定されます。エラーの場合は、-1が返されるか、例外がスローされます。

まず、サーバープログラムをデバッグすることをお勧めします。 Javaクライアントアプリケーションを作成します(簡単に行う必要があります)。何が起こるかを見るためにクライアントを殺す。さらに2台のPCを使い、突然それを抜いてください。これはあなたの状況をよりよくシミュレートします。

0

TCPに到達できない通信パートナーのタイムアウトは30秒です。私はあなたが30秒待つなら、あなたは-1を得なければならないと思います。

関連する問題