java - 无法从 Google Chrome 中的 Java Server 应用程序接收纯文本

标签 java google-chrome

我有一个用 Java 编写的小型服务器应用程序,它将纯文本发送到浏览器,如下所示:

服务器.java

import java.io.IOException;
public class Server {

private int portNumber;

public Server(int portNumber) {
    this.portNumber = portNumber;
}

public void start() {
    //Thread pool
    final ExecutorService threadPool = Executors.newFixedThreadPool(10);
    Runnable serverTask = new Runnable() {

        @Override
        public void run() {
            try {
                ServerSocket ss = new ServerSocket(portNumber);
                while(true) {
                    Socket clientSocket = ss.accept();
                    threadPool.submit(new ClientTask(clientSocket));
                }
            } catch(IOException e) {
                e.printStackTrace();
            }
        }
    };
    Thread clientThread = new Thread(serverTask);
    clientThread.start();
}
}

ClientTask.java

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;

public class ClientTask implements Runnable{

private final Socket clientSocket;

public ClientTask(Socket clientSocket) {
    this.clientSocket = clientSocket;
}

@Override
public void run() {
    System.out.println("Got a client...");

    try (BufferedReader br = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
            DataOutputStream os = new DataOutputStream(clientSocket.getOutputStream());){
        os.writeBytes("HTTP/1.1 200 OK\r\n");
        os.writeBytes("Content-Type: text/plain");
        os.writeBytes("\r\n");
        os.writeBytes("\r\n");
        os.writeBytes("hello");
        os.writeBytes("\r\n");
        os.flush();
        System.out.println("About to close..");
    } catch(IOException e) {
        e.printStackTrace();
    } finally {
        try {
            clientSocket.close();
        } catch(IOException e) {
            e.printStackTrace();
        }
    }
}

}

Main.java

public class Main {

public static void main(String[] args) {
    Server server = new Server(1111);
    server.start();
}
}

我的服务器在端口 1111 上运行,当我在 Safari 中输入 http://localhost:1111 时,它运行得很好(我在浏览器中看到“hello”),但在 Chrome 中则不然。
Chrome 会出现什么情况?

编辑:控制台网络选项卡的屏幕截图 enter image description here

最佳答案

您在 DataOutputStream 中发送的输出是错误的,基本上 Chrome 会接受有效的 HTTP 响应来接收。

这是您的客户端更新(我会让您优化代码)

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;

public class ClientTask implements Runnable {

    private final Socket clientSocket;

    public ClientTask(Socket clientSocket) {
        this.clientSocket = clientSocket;
    }

    @Override
    public void run() {
        System.out.println("Got a client...");

        try (BufferedReader br = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
             DataOutputStream os = new DataOutputStream(clientSocket.getOutputStream())) {
            String message = "Hello";
            os.writeBytes("HTTP/1.0 200 OK\r\n");
            final String currentDateFormatted = DateTimeFormatter.RFC_1123_DATE_TIME.format(ZonedDateTime.now(ZoneOffset.UTC));
            os.writeBytes("Date: " + currentDateFormatted + "\r\n");
            os.writeBytes("Server: Java Server/12234\r\n");
            os.writeBytes("Content-Type: text/plain\r\n");
            os.writeBytes("Content-Length: " + message.length() + "\r\n");
            os.writeBytes("Expires: " + currentDateFormatted + "\r\n");
            os.writeBytes("Last-modified: " + currentDateFormatted + "\r\n");
            os.writeBytes("\r\n");
            os.write(message.getBytes(StandardCharsets.UTF_8));
            os.flush();
            os.close();
            System.out.println("About to close..");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                clientSocket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

}

在 Chrome 上测试并通过终端使用 curl:

curl -v localhost:1111
* Rebuilt URL to: localhost:1111/
*   Trying ::1...
* TCP_NODELAY set
* Connected to localhost (::1) port 1111 (#0)
> GET / HTTP/1.1
> Host: localhost:1111
> User-Agent: curl/7.54.0
> Accept: */*
>
* HTTP 1.0, assume close after body
< HTTP/1.0 200 OK
< Date: Sat, 24 Mar 2018 11:27:15 GMT
< Server: Java Server/12234
< Content-Type: text/plain
< Content-Length: 5
< Expires: Sat, 24 Mar 2018 11:27:15 GMT
< Last-modified: Sat, 24 Mar 2018 11:27:15 GMT
<
* Closing connection 0
Hello%

关于java - 无法从 Google Chrome 中的 Java Server 应用程序接收纯文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49462568/

相关文章:

Java erlang套接字通信

java - TextInputLayout setError() 没有出现在 fragment 中

google-chrome - Chrome 中的 WebRTC getUserMedia promise api 支持

android - 移动 Chrome 中用于测试多个 android 包名称的 Intent URL

javascript - Chrome jquery onchange 计数器

java - 这是保存对 Activity/Context 的静态引用的有效方法吗?为什么我不应该这样做?

Java构造函数并在运行时修改对象属性

java - 泛型 List<String> 和 List<Integer> 未按预期运行

javascript - 返回变量 - 未定义

google-chrome - 如何使用 uglifyjs2 和 Ionic 加载 sourcemaps?