2016-01-20 2 views
0

Может кто-нибудь объяснит мне, почему byte[] buf на сервере не содержит 100 000 1s, отправленных клиентом? На отметке 60 тыс. Байт значения остаются в нуле. Я признаю, что не очень много работал с Streams или TCP, поэтому я уверен, что сделал что-то неправильно; Я просто не понимаю, что это такое. Я пробовал это с InputStream и BufferedInputStream на сервере с тем же результатом. Спасибо всем, кто может потратить время, чтобы объяснить это мне!Кто-нибудь, пожалуйста, объясните, почему у меня возникли проблемы с отправкой большого байта [] на сервер через TCP

Клиентский код довольно прост:

byte[] msgBytes = new byte[100000]; 
    for (int i=0;i<msgBytes.length;i++){ 
     msgBytes[i] = 1; 
    } 
    Socket sck = null; 
    try { 
     sck = new Socket("my.server.net", 1234); 
     OutputStream outStream = sck.getOutputStream(); 
     outStream.write(msgBytes); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } finally { 
     try { 
      sck.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

Кроме того, код сервера также прост:

ServerSocket srvSock = new ServerSocket(1234); 
    Socket sock = srvSock.accept(); 
    returnAddress = sock.getInetAddress(); 
    returnPort = sock.getPort(); 
    BufferedInputStream iStream = new BufferedInputStream(sock.getInputStream(), 100000); 
    byte[] buf = new byte[100000]; 
    iStream.read(buf); 
+1

не уверен, что это ваша проблема, но в целом вы должны читать поток в цикле, пока не дойдете до конца. –

+0

Спасибо за ответ! Могу ли я беспокоить вас примером? Откуда я знаю, что это конец? – RoboLam

+0

BufferedInputStream.read (...) Возвращает: общее количество байтов, считанных в буфере, или -1, если данных больше нет, поскольку конец потока достигнут. –

ответ

1

Попробуйте заменить BufferedInputStream с DataInputStream и использовать readFully, так что ваш код сервера должен стал:

ServerSocket srvSock = new ServerSocket(1234); 
Socket sock = srvSock.accept(); 
returnAddress = sock.getInetAddress(); 
returnPort = sock.getPort(); 
DataInputStream iStream = new DataInputStream(sock.getInputStream()); 
byte[] buf = new byte[100000]; 
iStream.readFully(buf); 
1

Да, но в любом случае вам нужно t o читать весь поток, вы не знаете размер с другой стороны. Кроме того, вы не должны читать потоковое содержимое в памяти, но лучше пытаться его выполнить.

BufferedInputStream iStream = new BufferedInputStream(sock.getInputStream(), 100000); 
byte[] buf = new byte[100000]; 
int cnt; 
StringBuffer content = new StringBuffer(); 
while ((cnt = iStream.read(buf)) != -1) { 
    content.append(buf); // you should not store content of stream, but better process it if possible 
};