2015-04-19 2 views
0

У меня есть TCP Client на Java, который связывается с C# TCP Server и наоборот. Они обмениваются данными, отправляя более byte массивов. У меня возникают проблемы с чтением массивов байтов в клиенте. Байт массивы имеют фиксированную длину, равную 4Чтение байт-массивов из DataInputStream

Когда, например, сервер посылает:

[2, 4, 0, 2]

[2, 4, 0, 0]

выход клиента:

Подключение к порту: 10000

Просто подключается к /192.168.1.101:10000

Сервер говорит [2, 4, 0, 0]

Как я могу решить эту проблему? Кажется, что первый массив переписывается?

TCPClient.java

public class TCPClient { 

private OutputStream outToServer=null; 
private DataOutputStream out=null; 
private ByteProtocol byteProtocol; 
Socket client; 
InputStream inFromServer; 
DataInputStream in; 

public void initConnection(){ 
    try { 
     int serverPort = 10000; 
     InetAddress host = InetAddress.getByName("192.168.1.101"); 
     System.out.println("Connecting to port :" + serverPort); 
     client = new Socket(host, serverPort); 
     System.out.println("Just connected to " + client.getRemoteSocketAddress()); 
     outToServer = client.getOutputStream(); 
     out=new DataOutputStream(outToServer); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

public void readBytes(){ 

    try { 
     inFromServer = client.getInputStream(); 
     in = new DataInputStream(inFromServer); 

     byte[] buffer = new byte[4]; 
     int read = 0; 
     while ((read = in.read(buffer, 0, buffer.length)) != -1) { 
      in.read(buffer); 
      System.out.println("Server says " + Arrays.toString(buffer)); 
     } 
    } catch (IOException ex) { 
     ex.printStackTrace(); 
    } 
} 

public void sendBytes(byte [] byteArray) throws IOException{ 
    out.write(byteArray); 
} 

public void closeClient() throws IOException{ 
    client.close(); 
} 
} 

ответ

2

Похоже, что вы читаете в буфер дважды:

while ((read = in.read(buffer, 0, buffer.length)) != -1) { 
     in.read(buffer); 

Так содержание чтения в голове петли перезаписываются второй read().

+0

Да, вы правы! Удаление второй строки ('in.read (buffer);') выполнило задание. – Sybren

0
while ((read = in.read(buffer, 0, buffer.length)) != -1) { 
     in.read(buffer); 
     System.out.println("Server says " + Arrays.toString(buffer)); 
    } 

Вы должны использовать DataInputStream.readFully() вместо этого read() конструкции, увидеть эту related question. В противном случае вы не можете быть уверены, что заполнили буфер.

+0

поэтому я делаю 'in.readFully()', но что я использую вместо этой строки 'while ((read = in.read (buffer, 0, buffer.length))! = -1) {'? – Sybren