[英]What is difference between “while (-1 != (len = in.read(b)))” and “while ((len = in.read(b)) > 0)” in Java IO?
[英]datainputstream missing bytes in.read(b)
我正在嘗試編寫一個充當服務器的程序,該程序將從用PHP編寫的客戶端讀取字節-通過套接字發送請求(由於策略我無法重新編碼)這是服務器代碼:服務器在以下位置運行:紅帽企業Linux服務器版本6.2(聖地亞哥)
public void run() {
try {
serverSocket = new ServerSocket(port);
serverSocket.setSoTimeout(0);
while(!isInterrupted) {
try {
Socket server = serverSocket.accept();
LOG.info("Request received from : " + server.getRemoteSocketAddress());
DataInputStream in = new DataInputStream(server.getInputStream());
// DataInputStream in = new DataInputStream(
// new BufferedInputStream(server.getInputStream(), 10000));
byte[] bytes = new byte[10000];
int byteDupLength = in.read(t_bytes);
// in.readFully(bytes); // I tried this but to no avail
// int byteDupLength = bytes.length;
LOG.info(byteDupLength);
byte[] byteDup = new byte[byteDupLength];
System.arraycopy(bytes, 4, byteDup, 0, byteDupLength);
// FOR INFORMATION ONLY
/*for (byte b : byteDup){
LOG.info(b);
}*/
ByteBuffer buffer = ByteBuffer.wrap(byteDup);
LOG.info(buffer);
forwardRequest(byteDup);
server.close();
}
catch(SocketTimeoutException s) {
LOG.error("Socket timed out!", s);
break;
}
catch(IOException e)
{
LOG.error("IOException:", e);
break;
}
}
}
catch (IOException ex) {
LOG.error("Server socket is null", ex);
}
LOG.fatal("ReceiverEngine interrupted!");
}
當客戶端發送包含4948個字節的請求時,我遇到了一個問題。 服務器只能讀取2090個字節。對我來說,另一件事似乎是個謎,那就是,當我在本地(Windows 7 Pro)中通過Netbeans運行服務器時,它可以按預期運行。 我不知道怎么了。 請幫忙.. :)
謝謝!
read()
方法會填充緩沖區。 因此,如果您在一次讀取中沒有收到預期的字節數,則必須循環直到收到它們。
如果緩沖區大小與發送的大小一致,則readFully()
將起作用。 在您的情況下,您指定了10,000個字節的緩沖區,但該緩沖區未發送,因此它會阻塞等待其他10000-4948個字節。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.