来自套接字的Java HTTP请求/响应,服务器在客户端可以接收之前关闭输出流

时间:2012-08-16 04:29:25

标签: java http

似乎使用curl和大多数Web浏览器,我的服务器代码在客户端能够读取响应之前关闭连接。这是我的代码

public void run() {
        try {
            InputStream input = clientSocket.getInputStream();
            OutputStream output = clientSocket.getOutputStream();
            System.out.println(input);

            // getRequestObject(input);
            long time = System.currentTimeMillis();
            output.write(("HTTP/1.1 200 OK\n\nWorkerRunnable: " + this.serverText + " - " + time + "").getBytes());
            output.flush();
            output.close();
            input.close();
            System.out.println("Request processed: " + time);
        } catch (IOException e) {
            // report exception somewhere.
            e.printStackTrace();
        }
    }

    protected String readInputStream(InputStream input) throws IOException {
        String inputLine;
        BufferedReader in = new BufferedReader(new InputStreamReader(input));
        StringBuilder sb = new StringBuilder();
        while (!(inputLine = in.readLine()).equals("")) {
            sb.append(inputLine);
        }
        return sb.toString();
    }

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

也许问题可能是因为您没有阅读客户的数据。客户端正在尝试向您发送HTTP标头,但您会立即开始发送响应。尝试从InputStream读取,直到收到空行(表示请求HTTP标头的结尾),然后开始发送输出。

如果您需要在应用程序中嵌入HTTP服务器,我强烈建议您使用现有库。实现您自己的HTTP兼容服务器将是一项繁琐的工作。参见

答案 1 :(得分:0)

有什么想法吗?

实际上,这很奇怪。 你说通过阅读HTTP请求的内容 - 我认为每个http服务器的100%(并且你的没有做) - 你的错误得到修复。

如果您需要处理该数据,从套接字读取数据只是相关的。我有点意外,你不读书的事实给客户造成了问题。我唯一的理论是,您的代码可能会对HTTP请求激励做出快速反应,即使在客户端的完整请求到达服务器之前,您也关闭了输入流通道。

也许在客户端,尝试联系您服务器的人正在设置套接字写入IO异常。

...讨人喜欢

:)