Как будет выглядеть клиент для этого простого сервера?Как мне обработать несколько соединений? - PullRequest
0 голосов
/ 20 сентября 2019

Я пытался использовать информацию, предоставленную: https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API/Writing_a_WebSocket_server_in_Java.

Я заинтересовался клиентом javascript.Тем не менее, единственная значимая строка, которую я имею:

var exampleSocket = new WebSocket("wss://127.0.0.1:8000");

Код для самого сервера таков:

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;



public class WebSocket {
        public static void main(String[] args) throws IOException, NoSuchAlgorithmException {
                ServerSocket server = new ServerSocket(8000);
                try {
                        System.out.println("Server has started on 127.0.0.1:8000.\r\nWaiting for a connection...");
                        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();
                                Matcher get = Pattern.compile("^GET").matcher(data); //MUST BE DONE IN THIS WAY
                                //developer.mozilla.org "Writing a Websocket Server in Java"
                                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]);
                                        } //else System.println("No Find");
System.out.println("should be decoded");
                                } else System.out.println("No Find");
                        } finally {
                                s.close();
                        }
                } finally {
                        server.close();
                }
        }

Однако все, что я когда-либо получаюэто «не найти» для последней строки.Что нужно сделать клиенту для правильного шифрования рукопожатия, кроме «wss»?

Я пытался понять это, «печатая» данные из s, но, похоже, они ничего не содержалино общая информация;поскольку дешифрование по какой-то причине завершается неудачно, ничего больше не происходит, поскольку строка if get.find(), кажется, никогда не возвращает true!

Кроме того, кажется, что это только рукопожатие и выход.Вообще говоря, какие методы вы могли бы порекомендовать, чтобы сервер мог «зацикливаться», чтобы сервер мог запомнить несколько клиентов и их потоки ввода / вывода?Заранее спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...