java - 如何从服务器(jetty服务器)发送字节数组到客户端(RPI)?

标签 java jetty

我正在尝试从服务器向客户端发送数据字节,因此我使用文件指针来指向文件已读取的位置并读取字节集并将其发送到客户端。

下面是服务器端

byte[] b = readByte()// my function which return bytes of Data
ServletOutputStream stream = httpServletResponse.getOutputStream();
stream.flush();
stream.write(b);
stream.flush();

下面是客户端

URL url = new URL("http://localhost:1222/?filePointer=" + fp);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setDoInput(true);
conn.setDoOutput(true);
conn.connect();
InputStream is = conn.getInputStream();
System.out.println("Connection Open");
int pos = 0;
byte[] b = new byte[buffLength];
while (pos != -1) {
    pos = is.read(b, pos, b.length - pos);
}
write2File(b);

上面的代码适用于 20Kb 的 bufferLength,随着 bufferLength 的增加,我收到了不正确的值。

最佳答案

由于您已经澄清服务器和客户端对于要传输的字节数(由 bufferLength 表示)有共同协议(protocol),因此您认为他们不需要交换该长度是正确的。

但是客户端确实需要使用正确的长度。您的问题出在客户端的读取循环中:

int pos = 0;
byte[] b = new byte[buffLength];
while (pos != -1) {
    pos = is.read(b, pos, b.length - pos);
}

这有一个明确的和一个潜在的主要问题:

  1. 您的接收代码在循环的第三次及后续迭代中(执行多次迭代时)无法正确填充目标数组,因为 pos 仅记录接收到的字节数在最近的前一个 read() 中。您需要使用截至该点之前所有读取到数组中的总字节数来确定偏移量和尝试读取的字节数。

  2. InputStream.read() 仅在末尾返回 -1,这通常不会发生在网络流,直到远端关闭。如果服务器在写入数组后没有从一端关闭连接(至少是输出端),那么客户端将在尝试读取它时挂起。特别是,如果pos等于b.length,则会进入紧密循环,从而请求的字节数为0。

关于java - 如何从服务器(jetty服务器)发送字节数组到客户端(RPI)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50351831/

相关文章:

eclipse - 使用 Jetty 和 Maven 进行 Web 开发

java - 嵌入式 jetty 处理从 Eclipse 运行但未部署的请求

rest - 嵌入式 Jetty : In secure https server, ContextHandler 重定向到 http URI

java - 从后台线程更新可观察列表的正确方法

java - 为什么从非静态方法访问静态方法不好?

java - 很难理解 Java 消费者示例

maven - Maven 多模块项目中客户端服务器应用程序的集成测试

intellij-idea - 如何在 Windows 上从 IntelliJ 启动 Jetty?

java - 将序列化对象从java程序发送到servlet

java - 频率包 - getFrequencyOf(aData)