繁体   English   中英

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

[英]Java HTTP request/response from socket, server closing output stream before client can recieve

似乎使用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();
    }

有什么想法吗?

可能是由于您没有读取客户端数据而引起的。 客户端尝试向您发送HTTP标头,但是您立即开始发送响应。 尝试从InputStream读取,直到收到空行(这表明请求HTTP标头已结束),然后开始发送输出。

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

有什么想法吗?

实际上,这很好奇。 您说通过读取HTTP请求的内容(我想每个HTTP服务器100%都做到了(而您的HTTP服务器没有这样做)),您的错误已得到解决。

从套接字读取数据仅在您需要处理该数据时才有意义。 令您惊讶的是,您没有阅读的事实给客户带来了麻烦。 我对此的唯一理论是,您的代码可能会对HTTP请求刺激做出快速反应,以至于您甚至在客户端的完整请求到达serve.r之前就关闭了输入流通道。

也许在客户端,尝试与您的服务器联系的人遇到了套接字写入IO异常。

:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM