gpt4 book ai didi

java - datainputstream 缺少字节 in.read(b)

转载 作者:行者123 更新时间:2023-12-01 12:13:14 25 4
gpt4 key购买 nike

我正在尝试编写一个充当服务器的程序,该程序将从用 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。另一件对我来说似乎很神秘的事情是,当我在本地(Windows 7 Pro)中通过 Netbeans 运行服务器时,它按预期工作。我不知道出了什么问题。请帮忙..:)

谢谢!

最佳答案

  1. TCP 是一种字节流协议(protocol)。
  2. read() 方法不能保证填充缓冲区。

因此,如果您在一次读取中没有收到预期的字节数,则必须循环直到收到它们。

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

readFully() 就会起作用。在您的情况下,您指定了 10,000 字节的缓冲区,但未发送该缓冲区,因此它将阻塞等待其他 10000-4948 字节。

关于java - datainputstream 缺少字节 in.read(b),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27162207/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com