簡體   English   中英

datainputstream in.read(b)中缺少字節

[英]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運行服務器時,它可以按預期運行。 我不知道怎么了。 請幫忙.. :)

謝謝!

  1. TCP是字節流協議。
  2. 不能保證read()方法會填充緩沖區。

因此,如果您在一次讀取中沒有收到預期的字節數,則必須循環直到收到它們。

如果緩沖區大小與發送的大小一致,則readFully()將起作用。 在您的情況下,您指定了10,000個字節的緩沖區,但該緩沖區未發送,因此它會阻塞等待其他10000-4948個字節。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM