繁体   English   中英

WebSocket 服务器 Java 与客户端通信

[英]WebSocket Server Java Communication with Client

我已经根据本教程编写了 Java WebSocket 服务器。
到目前为止,服务器工作得很好,但是我如何在此基础上从客户端读取和发送消息?

        ServerSocket server = new ServerSocket(200);
        try 
        {
            while(true)
            {
                System.out.println("Socket Server started on Port 200. Waiting for connections...");

                // Wait for Client ...
                Socket client = server.accept();
                System.out.println("A client connected.");

                InputStream in = client.getInputStream();
                OutputStream out = client.getOutputStream();
                Scanner s = new Scanner(in, "UTF-8");

                try 
                {
                    String data = s.useDelimiter("\\r\\n\\r\\n").next();

                    System.out.println(data);

                    Matcher get = Pattern.compile("^GET").matcher(data);

                    if (get.find()) 
                    {
                        Matcher match = Pattern.compile("Sec-WebSocket-Key: (.*)").matcher(data);
                        match.find();
                        byte[] response = ("HTTP/1.1 101 Switching Protocols\r\n"
                            + "Connection: Upgrade\r\n"
                            + "Upgrade: websocket\r\n"
                            + "Sec-WebSocket-Accept: "
                            + Base64.getEncoder().encodeToString(MessageDigest.getInstance("SHA-1").digest((match.group(1) + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11").getBytes("UTF-8")))
                            + "\r\n\r\n").getBytes("UTF-8");
                        out.write(response, 0, response.length);
                        byte[] decoded = new byte[6];
                        byte[] encoded = new byte[] { (byte) 198, (byte) 131, (byte) 130, (byte) 182, (byte) 194, (byte) 135 };
                        byte[] key = new byte[] { (byte) 167, (byte) 225, (byte) 225, (byte) 210 };
                        for (int i = 0; i < encoded.length; i++) {
                            decoded[i] = (byte) (encoded[i] ^ key[i & 0x3]);
                        }
                    }

                    // Read Messages from Client:
                    //BufferedReader clientInputReader = new BufferedReader(new InputStreamReader(in));
                    //String line = clientInputReader.readLine();
                    //System.out.println(line);

                    // Send Message to Client:
                    //PrintWriter writer = new PrintWriter(out, true);
                    //writer.println("Test");

                } 
                finally 
                {
                    s.close();
                }

            }

        }
        finally 
        {
            server.close();
        }

为了阅读消息,我尝试了以下操作,但 function readLine() 从未返回任何内容:

BufferedReader clientInputReader = new BufferedReader(new InputStreamReader(in));
String line = clientInputReader.readLine();

为了发送消息,我尝试了以下方法,但 JS 中的 onMessage() 从未被调用:

PrintWriter writer = new PrintWriter(out, true);
writer.println("Test");

JS代码:

var wsUri = "ws://localhost:200";
websocket = new WebSocket(wsUri);
// ... onOpen()
websocket.send("Test\n");

为了阅读消息,我使用了这段代码,但它没有经过优化。

private String read() throws IOException {
        //Reading values
        reader.read();
        int len = reader.read() - 128;
        byte[] key = new byte[4];
        byte[] decoded = new byte[len];
        byte[] encoded = new byte[len];
        for (int i = 0; i<4; i++) {
            key[i] = (byte) reader.read();
        }
        for (int i = 0; i<len; i++) {
            encoded[i] = (byte) reader.read();
        }
        //Decoded
        for (int i = 0; i < encoded.length; i++) {
            decoded[i] = (byte)(encoded[i] ^ key[(i % 4) & 0x3]);
        }
        //return
        return new String(decoded);
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM