Websocket Handshake Failed In Java

Próbuję więc przeanalizować witrynę, która używa websocket do wysyłania danych do klientów. Z tego co przeczytałem:

Link 1Link 2

Zrozumiałem, że do tworzenia połączenia muszę wysłać specjalne żądanie http do serwera, a ot pobierze niektóre dane, których używam do uzyskania dostępu do kanału.

Co ja zrobiłem:

stworzył żądanie http

`URL obj = new URL(url);
HttpURLConnection con = (HttpURLConnection) obj.openConnection();

// optional default is GET
con.setRequestMethod("GET");

//add request header
con.setRequestProperty("Cache-Control", "no-cache");
con.setRequestProperty("Host", "www.example.com");
con.setRequestProperty("Upgrade", "websocket");
con.setRequestProperty("Connection", "upgrade");
con.setRequestProperty("Origin", "https://example.com");
con.setRequestProperty("Sec-WebSocket-Extensions", "x-webkit-deflate-frame");
con.setRequestProperty("Sec-WebSocket-Key", "QkWkChtTGpaZL5PkOMaRtg==");
con.setRequestProperty("Sec-WebSocket-Version", "13");
con.setRequestProperty("User-Agent", "Mozilla/..;

`

i przeczytałem odpowiedź z kodem 200 (nie 101, który ma być).

Pytania:

Jak wygenerować klucz Sec-Websocket? (na przykład pochodzi z firebug, wszystkie nagłówki faktycznie)

1.1. Co można zrobić więcej?

1.2. Ten sam link z http musi być używany do uzyskania dostępu do websocket? tylko z wss zamiast https?

po tym staram się połączyć klienta z serwerem i odbierać wiadomości w metodzie onMessage.

WebSocketContainer container = ContainerProvider.getWebSocketContainer(); Session session = container.connectToServer(ClientEndpoint.class, buildCEC(), new URI("wss://async.example.com/socket.io/1/?t=" + System.currentTimeMillis()));

Próbowałem w buildCec () wstawić nagłówki do połączenia z serwerem.ClientEndpointConfig config = ClientEndpointConfig.Builder.create().build(); Configurator conf = config.getConfigurator();

`Map<String, List<String>> headers = new HashMap<String, List<String>>();

headers.put("Connection", Arrays.asList("keep-alive", "Upgrade"));
headers.put("Sec-Websocket-Extensions", Arrays.asList("x-webkit-deflate-frame"));
headers.put("Sec-Websocket-key", Arrays.asList("cx36sHrtuW9HZAaB6kKa/Q=="));
headers.put("Sec-Websocket-Version", Arrays.asList("13"));
headers.put("Upgrade", Arrays.asList("websocket"));
headers.put("User-Agent", Arrays.asList("Mozill..."));

conf.beforeRequest(headers);

return config;`

pytania

Czy mój osąd jest dobry w przypadku, gdy opracuję i otrzymam kod statusu 101 z żądania uaktualnienia http? (Mam na myśli, co robię z tymi szczegółami?)Nie osądzaj mnie, jestem na początku z websockets w java i nie znam zbyt dobrze javascript, chcę zrobić tego klienta w czystej java z jsr-356. Zrobiłem małe przykłady z websockets, ale nie mogę znaleźć nigdzie dobrego klienta, z nagłówkami i bardziej skomplikowanym handshake.Czy można połączyć się z nieznanym serwerem, nie znając wszystkich szczegółów?

Używam programistycznego punktu końcowego i importuję javax.websocket.ContainerProvider; za radzenie sobie z połączeniem websocket z jsr356.

questionAnswers(2)

yourAnswerToTheQuestion