2016-01-20 15 views
0

有誰可以請解釋爲什麼byte[] buf在服務器上不包含由客戶端發送的100,000 1?在大約60k字節的標記處,值保持全零。我承認我沒有在Streams或TCP上工作太多,所以我確信我做錯了什麼;我只是不明白它是什麼。我已經在服務器上用InputStreamBufferedInputStream對此進行了嘗試,結果相同。感謝任何人/每個可以花時間向我解釋這一點的人!有人請解釋爲什麼我無法通過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

嘗試用DataInputStreamBufferedInputStream和使用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 
}; 
相關問題