向服务器端获取响应异常,当服务器仅从请求中读取标头时,Http客户端不会收到响应(示例代码)...

该博客讨论了使用Java SE 11编写的一个HTTP服务器的问题,当服务器没有读取整个请求就发送响应时,客户端(如Postman或curl)无法正确接收。博主发现,只有在调用`readBody`方法或响应包含Content-Length标头时,问题才能得到解决。问题可能在于服务器在读取请求主体前就发送了响应,导致客户端通信异常。
摘要由CSDN通过智能技术生成

我正在乱用Java中的HTTP和套接字,希望你能对此有所了解:

当我用Java SE 11编写的HTTP服务器没有读取整个请求然后响应时,客户端没有得到它或者收到错误。这是为什么?在服务器读取整个请求之前,客户端是否无法读取响应?如果在下面的代码段中执行对readBody的调用,则可以正常工作。如果响应具有Content-Length标头和文本正文,它也可以正常工作。这实际上对我来说更令人费解。

我的示例请求是带有数据fds的POST。邮递员说“无法得到任何请求”,卷曲说“卷曲:(56)Recv失败:连接由同行重置”。

import java.io.*;

import java.net.Socket;

import java.util.*;

class Handler {

public synchronized void read(Socket incoming) {

try (incoming;

OutputStream outputStream = incoming.getOutputStream();

InputStream inputStream = incoming.getInputStream();

PrintWriter pw = new PrintWriter(outputStream)) {

writeRequest(inputStream);

pw.print("HTTP/1.1 200 OK

");

pw.print("

");

pw.flush();

} catch (IOException e) {

System.out.println("ERROR: " + e.getMessage());

e.printStackTrace();

}

}

private void writeRequest(InputStream inputStream) throws IOException {

String verbLine = readLine(inputStream);

Map headers = readHeaders(inputStream);

//readBody(inputStream, headers);

}

private void readBody(InputStream inputStream, Map headers) throws IOException {

Optional optKey = headers.keySet().stream()

.filter(k -> k.equalsIgnoreCase("Content-Length"))

.findFirst();

if (optKey.isPresent()) {

int contentLength = Integer.parseInt(headers.get(optKey.get()));

byte[] bytes = inputStream.readNBytes(contentLength);

}

}

private Map readHeaders(InputStream inputStream) throws IOException {

Map headers = new HashMap<>();

while (true) {

String line = readLine(inputStream);

if (line == null || line.isEmpty()) {

return headers;

}

String key = line.split(":")[0].trim();

String value = line.split(":")[1].trim();

headers.put(key, value);

}

}

private String readLine(InputStream inputStream) throws IOException {

byte[] buf = new byte[200];

int offset = 0;

while (true) {

int read = inputStream.read();

if (read == -1) {

return null;

}

buf[offset] = (byte) read;

if (buf[0] == '

' || (buf[0] == '' && buf[1] == '

')) {

return "";

}

if (buf[offset] == 0x0A) {

int endOfLine = buf[offset - 1] == 0x0D ? offset - 1 : offset;

return new String(buf, 0, endOfLine);

} else {

offset++;

}

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值