Java ServerSocket监听9090端口时浏览器访问127.0.0.1被拒问题
问题原因
- 不符合HTTP协议规范
浏览器发送的是标准HTTP请求,要求返回的内容必须符合HTTP响应格式。你当前代码直接返回Hello client!,没有携带任何合法HTTP响应头,浏览器无法识别返回内容,会判定为连接异常。 - 服务端单次请求后直接关闭监听
你的代码处理完一次客户端请求后,直接调用了serverSocket.close()关闭了服务端监听套接字,浏览器发起第二次请求(比如请求站点图标favicon.ico)时无法建立连接,就会抛出拒绝连接错误。 - 请求读取不完整
你只读取了HTTP请求的第一行内容,没有完整读取整个请求的所有报文头,也可能触发连接提前中断的问题。
修复方案
调整后的代码如下:
try { ServerSocket serverSocket = new ServerSocket(9090); System.out.println("waiting for clients..."); // 加循环保持服务端监听,不要处理一次就关闭 while (true) { Socket socket = serverSocket.accept(); PrintWriter out = new PrintWriter(socket.getOutputStream(), true); BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream())); // 读取完整的HTTP请求头 String line; while ((line = input.readLine()) != null && !line.isEmpty()) { System.out.println(line); } // 先返回标准HTTP响应头 out.println("HTTP/1.1 200 OK"); out.println("Content-Type: text/html; charset=UTF-8"); // 响应头和响应体之间必须有一个空行 out.println(); // 再返回实际内容 out.println("Hello client!"); input.close(); out.close(); socket.close(); // 不要关闭serverSocket,保持监听 } } catch (Exception e) { System.out.println(e); }
验证步骤
运行修改后的代码后,再次在浏览器访问127.0.0.1:9090即可正常看到返回的Hello client!内容,控制台也会打印完整的浏览器请求报文。
内容的提问来源于stack exchange,提问作者Ali
相关产品推荐
相关产品推荐

