Java ServerSocket和javascript Websocket之间的通信

时间:2018-08-18 11:57:23

标签: javascript java websocket serversocket

我想在计算机上用Java创建服务器,然后通过手机的浏览器从手机连接到该服务器。我还希望能够在电话(浏览器)和计算机(服务器)之间来回发送消息,以便更新浏览器中显示的内容。

我的计划是使用ServerSocket创建Java服务器。当电话连接到浏览器中的localhost:port时,服务器将发送一些应启动websocket的html和javascript代码。我能够在浏览器等中显示标准的html元素,但是当我尝试启动websocket时,出现此错误:

WebSocket connection to 'ws://localhost:8000/' failed: Error during WebSocket handshake: Unexpected response code: 200

这是正确的方法吗?我可以通过其他方式实现吗?

这是我的代码。

public class MyClass {

    public MyClass() {

        final ExecutorService clientProcessingPool = Executors.newFixedThreadPool(10);

        Runnable serverTask = new Runnable() {
            @Override
            public void run() {
                try {
                    ServerSocket serverSocket = new ServerSocket(8000);
                    System.out.println("Waiting for clients to connect...");
                    while (true) {
                        System.out.println("Waiting");
                        Socket clientSocket = serverSocket.accept();
                        clientProcessingPool.submit(new ClientTask(clientSocket));
                    }
                } catch (IOException e) {
                    System.err.println("Unable to process client request");
                    e.printStackTrace();
                }
            }
        };
        Thread serverThread = new Thread(serverTask);
        serverThread.start();
    }

    private class ClientTask implements Runnable {

        private final Socket clientSocket;

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

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

            PrintWriter out = null;
            try {
                out = new PrintWriter(clientSocket.getOutputStream());


            /*out.println("HTTP/1.1 200 OK");
            out.println("Content-Type: text/html");
            out.println("\r\n");
            out.println("<!DOCTYPE html>");
            out.println("<html>");
            out.println("    <head>");
            out.println("        <title>Test</title>");
            out.println("        <script type=\"text/javascript\">");
            out.println("          var w = new WebSocket(\"ws://192.168.0.5:8000\")");
            out.println("....More code");
            out.println("        </script>");
            out.println("    </head>");
            out.println("    <body>");
            out.println("    </body>");
            out.println("</html>");*/

                out.print("Hej");
                out.flush();


            } catch (IOException e) {
                e.printStackTrace();
            }
            ;

            try {
                clientSocket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }

    public static void main(String[] args) {
        System.out.println("Hej");
        new MyClass();
    }
}

1 个答案:

答案 0 :(得分:0)

要编写Websocket服务器,您需要实现涉及升级http连接的Websocket协议。 即使您可以编写程序从头开始执行此操作,也可以使用一些库/框架来解决大部分连接问题。

我想到的两个是使用或任何Java EE容器实现(JSR 356)(java EE 7和8实现),有一些关于使用Spring Boot的替代方法的教程,另一个我记得是使用Netty。

在客户端,如果连接浏览器,则客户端代码将使用javascript编写。仅当要从Java程序而不是浏览器(基于您的问题而不是浏览器)进行连接时,才需要为客户端编写Java代码。

一些可能对您有帮助的链接:
https://docs.oracle.com/javaee/7/tutorial/websocket.htm
https://www.baeldung.com/websockets-spring
https://netty.io/