我试图编写一个程序,它充当服务器,从用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专业版)运行服务器时,它按预期工作。我不知道出了什么问题。请帮助.. :))
谢谢!
答案 0 :(得分:1)
read()
方法填充缓冲区。因此,如果在单次读取中没有收到预期的字节数,则必须循环,直到收到它们为止。
如果缓冲区大小与发送的大小一致,则 readFully()
会起作用。在你的情况下,你指定了一个10,000字节的缓冲区,它没有被发送,所以它会阻塞等待其他10000-4948字节。