簡體   English   中英

Java ServerSocket和javascript Websocket之間的通信

[英]Communication between Java ServerSocket and javascript Websocket

我想在計算機上用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();
    }
}

要編寫Websocket服務器,您需要實現Websocket協議,該協議涉及升級http連接。 即使您可以編寫程序從頭開始執行此操作,也可以使用一些庫/框架來解決大部分連接問題。

我想到的兩個是使用或任何Java EE容器實現(JSR 356)(java EE 7和8實現),有一些使用Spring Boot的替代方法教程,我記得的另一個是使用網狀。

在客戶端,如果連接瀏覽器,則客戶端代碼將使用javascript編寫。 如果要從Java程序而不是瀏覽器進行連接,則只需要為客戶端編寫Java代碼(基於您的問題不是您的情況)。

一些鏈接可能會幫助您:
https://docs.oracle.com/javaee/7/tutorial/websocket.htm
https://www.baeldung.com/websockets-spring
https://netty.io/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM