我从第一个例子中学习了代码。
这是index.html
<html>
<head>
<title>Welcome to BrainySoftware</title>
</head>
<body>
<img src="./images/logo.gif">
<br>
Welcome to BrainySoftware.
</body>
</html>
我知道会有2个GET请求。首先是html,第二个是img。 但我有时会收到第三个请求。第三个请求是空的,我从请求中得不到任何结果。
ServerSocket serverSocket = null;
int port = 8080;
try {
serverSocket = new ServerSocket(port, 1, InetAddress.getByName("127.0.0.1"));
}
catch (IOException e) {
e.printStackTrace();
System.exit(1);
}
while (!shutdown) {
Socket socket = null;
InputStream input = null;
OutputStream output = null;
try {
socket = serverSocket.accept();
input = socket.getInputStream();
output = socket.getOutputStream();
// create Request object and parse
Request request = new Request(input);
request.parse();
// create Response object
Response response = new Response(output);
response.setRequest(request);
response.sendStaticResource();
// Close the socket
socket.close();
//check if the previous URI is a shutdown command
shutdown = request.getUri().equals(SHUTDOWN_COMMAND);
}
catch (Exception e) {
e.printStackTrace();
continue;
}
}
当第三个请求到来时,方法sendStaticResource
会抛出异常:
java.lang.NullPointerException because request.getUri() is null.
我的jdk版本是1.7,当我将InetAddress从127.0.0.1
更改为192.168.50.132
时,第三个请求消失了。
我不知道为什么不2请求,请帮助我。
答案 0 :(得分:1)
如果您接受来自世界的连接,那么无法您可以将连接浏览器归咎于“有错误”。即使它有:你 负责处理从外部收到的数据。处理这些请求时可能会抛出异常,但您最好捕获并处理它们。如果有的话,你的代码必须处理被抛出的任何。
您发布的代码似乎是这样做的 - 但由于它过于简单化,它不能优雅地处理任何不可预见的结果。相反,它只是爆炸堆栈痕迹 - 给人的印象是出现了可怕的错误。我知道你不打算为HTTP实现另一个处理程序 - 这将是一个很好的领域 - 但是有兴趣测试这些概念。
回到实际导致这些请求的内容:从远处开始很难说,不执行此代码并在此处执行所有操作。正如我在评论中所说,您应该在调试器中检查可疑请求及其随附的数据。请记住,乍一看HTTP似乎非常简单,但是规范包含了很多细节,你在这个非常简单的连接处理程序中完全省略了 - 连接 - keep-alive出现在我的脑海中:一个物理连接可以携带多个虚拟连接(读取:HTTP请求)。