У меня есть вопрос.Может быть, кто-то может объяснить мне, или, может быть, кто-то уже сделал это - В моем проекте я использую http-прокси на основе Smiley's Http Proxy с небольшим рефакторингом - он отлично работает для HTTP и HTTPS.Но теперь мне нужно проксировать приложения Websocket.Итак, я нашел другую библиотеку - Nv-WebSocket-Client .Когда пользователь открывает браузер, скажем, на http://somehost:8082/examples/websocket/chat.xhtml - мое приложение проксирует http://someanotherhost:8080/examples/websocket/chat.xhtml - это работает.Затем - код javascript на этой странице создает Websocket и реквизит ws: // somehost: 8082 / examples / websocket / chat - мое приложение проксирует ws: // someanotherhost: 8080 / examples / websocket / chat - и это тоже работает,Потому что рукопожатие успешно выполнено, и ответ возвращается в браузер с 101 протоколом переключения.Но потом я получил текстовый фрейм от конечной точки реального сервера weboscket, я не понимаю, как я могу донести этот фрейм до пользователя.Может быть кто-нибудь знает какие-нибудь библиотеки, которые могут делать проксирование для websocket?Это некоторый код метода:
private HttpResponse invokeWebSocketReq(HttpServletRequest servletRequest, HttpRequest proxyRequest){
final HttpResponse httpResponse = new BasicHttpResponse(new ProtocolVersion("HTTP",1,1), 101, "Switching protocol");
try {
WebSocketFactory factory = new WebSocketFactory();
factory.setConnectionTimeout(5000);
WebSocket webSocket = factory.createSocket(proxyRequest.getRequestLine().getUri());
Header header = proxyRequest.getFirstHeader("Sec-WebSocket-Extensions");
webSocket.addExtension(WebSocketExtension.parse(header.getValue()));
webSocket.addHeader("Sec-WebSocket-Key", proxyRequest.getFirstHeader("Sec-WebSocket-Key").getValue());
webSocket.setMissingCloseFrameAllowed(true);
webSocket.addListener(new WebSocketAdapter() {
ServerTest st;
@Override
public void onConnected(WebSocket websocket, Map<String, List<String>> headers) throws Exception {
System.out.println("Successfully connected to websocket");
System.out.println("Is websocket open? - " + webSocket.isOpen());
}
@Override
public void onConnectError(WebSocket websocket, WebSocketException exception) throws Exception {
super.onConnectError(websocket, exception);
}
@Override
public void onDisconnected(WebSocket websocket, WebSocketFrame serverCloseFrame, WebSocketFrame clientCloseFrame, boolean closedByServer) throws Exception {
System.out.println("Disconnected from websocket");
System.out.println("Server Close code: " + serverCloseFrame.getCloseCode());
System.out.println("Server Close reason: " + serverCloseFrame.getCloseReason());
System.out.println("Client Close code: " + clientCloseFrame.getCloseCode());
System.out.println("Client Close reason: " + clientCloseFrame.getCloseReason());
}
@Override
public void onTextFrame(WebSocket websocket, WebSocketFrame frame) throws Exception {
System.out.println("OnTextFrame: " + frame.getPayloadText());
}
@Override
public void onCloseFrame(WebSocket websocket, WebSocketFrame frame) throws Exception {
System.out.println("OnClose Frame");
}
@Override
public void onTextMessage(WebSocket websocket, String text) throws Exception {
System.out.println("On Text Message: " + text);
System.out.println("Local socket address: " + websocket.getSocket().getLocalSocketAddress().toString());
System.out.println("Remote socket address" + websocket.getSocket().getRemoteSocketAddress().toString());
super.onTextMessage(websocket, text);
}
@Override
public void onError(WebSocket websocket, WebSocketException cause) throws Exception {
System.out.println("Error: " + cause.getMessage());
}
@Override
public void onSendError(WebSocket websocket, WebSocketException cause, WebSocketFrame frame) throws Exception {
System.out.println("On send error");
}
@Override
public void onUnexpectedError(WebSocket websocket, WebSocketException cause) throws Exception {
System.out.println("On unexpected error");
}
@Override
public void onSendingHandshake(WebSocket websocket, String requestLine, List<String[]> headers) throws Exception {
System.out.println("Will send handshake");
System.out.println("Request line: " + requestLine);
System.out.println("All headers: " + headers.toString());
}
@Override
public void onStateChanged(WebSocket websocket, WebSocketState newState) throws Exception {
super.onStateChanged(websocket, newState);
}
});
webSocket.connect();
System.out.println("Is websocket open? - " + webSocket.isOpen());
for (Map.Entry<String, List<String>> entry : webSocket.getServerHeaders().entrySet()) {
httpResponse.setHeader(entry.getKey(), entry.getValue().get(0));
}
} catch (InterruptedException | ExecutionException | /*DeploymentException |*/ IOException | WebSocketException e) {
e.printStackTrace();
httpResponse.setStatusCode(500);
httpResponse.setReasonPhrase(e.getMessage());
}finally {
System.out.println("Woopes");
}
return httpResponse;
}
Я тестирую на примере чата tomcat websocket.Кроме того, когда пользователь пытается что-то набрать в чате - я получаю сообщение в консоли браузера: «Не удалось установить соединение WebSocket с« ws: // somehost: 8082 / examples / websocket / chat »: сервер не должен маскировать любые кадры, которые онотправляет клиенту. "