2016-09-02 7 views
1

JAVAのTCPによる受信バイトパケットに問題があります。 私のTCPServerクラスは、207バイトのパケットを送信します。 1つのパケットを送信すると、「207バイトのパケットを読む」というコンソールにプログラムが表示されます。停止します。次のパケットでは、実行を続け、 "Multiple Measurement"と表示し、 "1868767867バイトのパケットを読み込みます。"その後、受信は永遠に停止されます。私は1868767867バイトを受け取る理由を知らない。 wiresharkで確認して、サーバーは常に207バイトを送信します。TCPによるバイトパケットの受信

これは私れるtcpClientクラスです:

public class TCPClient extends Thread { 

private ServerSocket serverSocket; 
private Socket connectionSocket; 
private InputStream inputStream; 
private DataInputStream dataInputStream; 


public TCPClient() throws IOException { 
    try { 
     serverSocket = new ServerSocket(Config.TCP_PORT); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

@Override 
public void run() { 

    try { 
     connectionSocket = serverSocket.accept(); 
     inputStream = connectionSocket.getInputStream(); 
     dataInputStream = new DataInputStream(inputStream); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    while(true) { 
     try { 
      JsonObject json = getJsonFromTcp(); 
      if (json != null) { 
        String command = json.getAsJsonPrimitive("command").getAsString(); 
        if(command.equals("multipleMeasurement")) { 
         executeMultipleMeasurement(); 
        } 
       } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

private JsonObject getJsonFromTcp() throws IOException {  

    byte[] buff = new byte[4]; 
    for(int i = 0; i < 4; i++) { 
     buff[i] = dataInputStream.readByte(); 
    } 

    int len = (((buff[3] & 0xff) << 24) | ((buff[2] & 0xff) << 16) | ((buff[1] & 0xff) << 8) | (buff[0] & 0xff)); 

    if(len > 0) { 
     System.out.println("Read " + len + " byte packet."); 
     byte[] data = new byte[len]; 
     dataInputStream.readFully(data); 
     String jsonString = new String(data, "UTF-8"); 
     JsonParser jsonParser = new JsonParser(); 
     JsonObject json = jsonParser.parse(jsonString).getAsJsonObject(); 
     return json; 
    } 
    return null; 
} 

private void executeMultipleMeasurement() { 
    System.out.println("Multiple Measurement"); 
} 
} 

誰もが解決策を知っていますか?

答えて

0

番号1868767867を見てみると、そのバイトは、あなたがメッセージの長さとして、次のメッセージの最初の4つのバイトを読み込むことができ

"%c%c%c%c" % (0x7b,0x22,0x63,0x6f) 
'{"co' 

です。サーバーが毎回正確に207バイトを送信するという主張を考えれば、メッセージの全長に長さプレフィックス(4バイト)の長さが含まれている可能性が最も高いと考えられます。意図したプロトコルに応じて、(長さ-4)バイトをパケットの本体として読み取ることが適切かもしれません。

// Account for the length of the header 
len -= 4; 

if(len > 0) { 
    System.out.println("Read " + len + " byte packet."); 
    byte[] data = new byte[len]; 
    dataInputStream.readFully(data); 

第2の可能性は、サーバは、文字列内の文字の数を測定した後、UTF-8の長さは、いくつかの非ASCII文字を含む、それを送信することバイトバッファを換算しその長さを使用していることです結果として生じるバッファを長くする原因となります。

サーバーコードが表示されていないと、ここではどのようなことが起こっているのかわかりません。

+0

最初の解決策は正しいです。どうもありがとう! – crulalbani

関連する問題