【问题标题】:Java simple server errorJava简单服务器错误
【发布时间】:2012-02-12 15:46:10
【问题描述】:

几个小时前,我开始学习 java 套接字通信。现在我正在尝试让服务器应用程序将数据返回给 webbrowser。 我的代码:

try{
    ServerSocket socket = new ServerSocket(80);
    Socket response = socket.accept();
    String lol = "<html>hi</html>";
    OutputStream str = response.getOutputStream();
    str.write(lol.getBytes("US-ASCII"));
    str.flush();
    response.close();
    System.out.println("LOL works!");
    }catch(IOException ex)
    {
        System.out.println(ex.toString());
    }
}

我在服务器应用程序中没有错误,消息“LOL 有效!!!”在控制台中打印,但在 webbrowser 中出现此错误:

有人知道如何修复它并在 webbrowser 中获取文本“hi”吗?谢谢。

编辑: 我试过将它添加到telnet。这是结果:

【问题讨论】:

  • 您正在侦听端口 80,但通过 HTTPS 连接,默认为端口 443。这是一个问题,确定吗?
  • 我正在处理 80。这是我在 google 上找到的第一张图片。

标签: java html sockets text


【解决方案1】:

您不能只向浏览器发送原始数据并期望它处理它 - 您必须遵循RFC1945 中描述的 HTTP(协议)。

具体来说,您必须按照 RFC1945 的第 4.1 节中的描述,先发送几个标头,然后是一个新行。

try{
    ServerSocket socket = new ServerSocket(80);
    Socket response = socket.accept();
    String lol = "<html>hi</html>";
    writer = new PrintStream(response.getOutputStream());
    writer.println("HTTP/1.1 200 OK");
    writer.println("Content-Type: text/html");
    writer.println();
    writer.println(lol);
    writer.flush();
    response.close();
    System.out.println("LOL works!");
    }catch(IOException e)
    {
        e.printStackTrace();
    }
}

请注意,我还将您的 OutputStream 包装在 PrintStream 中,因为这比手动处理 OutputStream 容易得多。

【讨论】:

  • \n 用作换行符在那里不起作用。 HTTP 协议指定必须使用\r\n。写完响应正文后不要忘记那些。
  • 错误 101 (net::ERR_CONNECTION_RESET):连接已被重置
  • 即使使用http 而不是https?
  • 什么?我正在使用http。如果你指的是那张图片,它来自谷歌。我在127.0.0.1 上运行所有内容。
  • 所以没人知道它是什么?
【解决方案2】:

正如 Kristian Antonsen 指出的那样,除了没有发送正确的响应之外,问题可能在于您实际上并没有在响应之前等待并阅读请求。可以说,由于缓冲,这应该不是问题,但即便如此,您的服务器也可能只是“太快”,在 Chrome 有机会发送请求之前发送响应并关闭套接字,从而触发“连接重置”它报告的问题。

尝试实现一个更完整的服务器。这是一个简单的例子:

public void readRequest(Socket client) throws IOException {
    Reader raw = new InputStreamReader(client.getInputStream(), "US-ASCII");
    BufferedReader reader = new BufferedReader(raw);
    while(true) {
        String line = reader.readLine().trim();
        if(line.equals(""))
            break;
    }
}

public void writeResponse(Socket client) throws IOException {
    String lol = "<html>hi</html>";
    PrintStream writer = new PrintStream(client.getOutputStream());
    writer.println("HTTP/1.1 200 OK");
    writer.println("Content-Type: text/html");
    writer.println();
    writer.println(lol);
    writer.flush();
}

public void serveClient(Socket client) throws IOException {
    try {
        readRequest(client);
        writeResponse(client);
        System.out.println("LOL works!");
    } finally {
        client.close()
    }
}

public void serve() {
    try{
        ServerSocket socket = new ServerSocket(80);
        while(true) {
            Socket client = socket.accept();
            serveClient(client);
        }
    }catch(IOException e) {
        e.printStackTrace();
    }
}

(请注意,我没有尝试过代码或任何东西,因此无法保证它按原样编译。)

【讨论】:

  • 有效!不知道为什么您的答案没有标记为解决方案。谢谢解释!
【解决方案3】:

网络浏览器使用HTTP protocol 与网络服务器通信。如果您希望浏览器正确显示页面,您的服务器必须根据该协议响应来自浏览器的请求。

【讨论】:

    【解决方案4】:

    看起来像是 Chrome 的问题。也许this one?

    尝试调整 IPv6 设置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-19
      • 1970-01-01
      • 2011-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-31
      相关资源
      最近更新 更多