2009-07-07 6 views
1

Ich schreibe einen Server, der mit einigen eingebetteten Geräten kommunizieren soll. Das Kommunikationsprotokoll basiert auf einem Header fester Länge. Das Problem ist, dass ich meinen Server nicht dazu bringen kann, plötzliche Unterbrechungen der Geräte richtig zu handhaben (durch "plötzliche" Situationen, wenn ich das Gerät gerade ausschalte). Hier ist der Code für die Client-Thread Hauptschleife:Java-Socket-Server und eingebettetes Gerät - kann die Verbindung nicht richtig trennen

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 

Auch wenn ich das Gerät ausschalten, die Lesemethode hält 0 Rückkehr nicht -1. Wie könnte das sein?

Antwort

2

Wenn Sie einen Socket normal schließen, wird eine Sequenz von Codes zwischen Client und Server gesendet, um dies zu koordinieren (beginnend mit einem FIN-Code vom Closing-Ende). In diesem Fall passiert dies nicht (da Sie das Gerät einfach ausschalten) und folglich fragt sich der Server, was passiert ist.

Möglicherweise möchten Sie die Konfiguration über Timeouts usw. oder eine Art zeitgesteuertes Protokoll untersuchen, um eine Unterbrechung durch fehlende Antwort zu identifizieren (möglicherweise Out-of-Band-Herzschläge mit ICMP/UDP?). Oder ist ein verbindungsloses Protokoll wie UDP für Ihre Kommunikation geeignet?

1

Lesen soll 0 zurückgeben, nur wenn die angegebene Länge 0 ist. Im Falle eines Fehlers sollte -1 zurückgegeben werden oder eine Ausnahme ausgelöst werden.

Ich schlage vor, dass Sie zuerst Ihr Server-Programm debuggen. Erstellen Sie eine Java-Client-Anwendung (sollte einfach zu tun sein). Töte den Kunden, um zu sehen, was passiert. Noch besser zwei PCs benutzen und sie plötzlich ausstecken. Dies simuliert Ihre Situation besser.

0

TCP hat eine Zeitüberschreitung von 30 Sekunden für Kommunikationspartner, die nicht erreichbar sind. Ich nehme an, wenn Sie 30 Sekunden warten, sollten Sie Ihre -1 erhalten.

Verwandte Themen