【问题标题】:Java HTTP request/response from socket, server closing output stream before client can recieve来自套接字的 Java HTTP 请求/响应,服务器在客户端接收之前关闭输出流
【发布时间】:2012-08-16 04:29:24
【问题描述】:

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

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 标头以 \r\n 结尾而不是 \n
  • 正如@rambo 已经提到的,查看维基百科的介绍:en.wikipedia.org/wiki/…
  • 在关闭套接字之前,应发出关闭并等待确认。我的套接字编程都是用 C++ 编写的,所以我不确定如何用 Java 解决它,但下面的文章可能会帮助您了解问题blog.netherlabs.nl/articles/2009/01/18/…

标签: java http


【解决方案1】:

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

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

【讨论】:

  • 非常感谢,我实际上有一个方法可以先读取输入,但实际上并没有调用它。解决了这个问题,现在很好用,谢谢你的提示。我也同意你为此使用库,但我实际上只是在尝试探索而不是实现
猜你喜欢
  • 1970-01-01
  • 2017-11-05
  • 2013-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-05
  • 2015-06-23
  • 1970-01-01
相关资源
最近更新 更多