datainputstream缺少字节in.read(b)

时间:2014-11-27 02:38:08

标签: java byte datainputstream

我试图编写一个程序,它充当服务器,从用PHP编写的客户端读取字节 - 通过套接字发送请求(由于策略我无法重新编码)这是服务器代码: 服务器运行于:Red Hat Enterprise Linux Server 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。 另一件对我来说似乎是个谜的事情是,当我通过我本地的Netbeans(也就是Windows 7专业版)运行服务器时,它按预期工作。我不知道出了什么问题。请帮助.. :))

谢谢!

1 个答案:

答案 0 :(得分:1)

  1. TCP是字节流协议。
  2. 无法保证read()方法填充缓冲区。
  3. 因此,如果在单次读取中没有收到预期的字节数,则必须循环,直到收到它们为止。

    如果缓冲区大小与发送的大小一致,则

    readFully()会起作用。在你的情况下,你指定了一个10,000字节的缓冲区,它没有被发送,所以它会阻塞等待其他10000-4948字节。