Я хочу настроить соединение WebSocket для загрузки множества очень маленьких файлов (1kb-50mb) в веб-приложение.
Мое веб-приложение работает в Wildfly, а остальные компоненты, основанные на https, работают нормально, однако мое соединение с Websocket возвращает 404 каждый раз или 200 при попытке.
Вот код для моей конечной точки:
package com.my.package;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
import java.util.logging.Level;
import java.util.logging.Logger;
@ServerEndpoint("/smallfiles/socket")
public class WebsocketApi {
private static final long serialVersionUID = 2356475533479775725L;
private static final Logger logger = Logger.getLogger(WebsocketApi.class.getName());
private static Set<Session> clients = Collections.synchronizedSet(new HashSet<Session>());
@OnOpen
public void onOpen(Session session) {
// Set max buffer size
session.setMaxBinaryMessageBufferSize(1024 * 512);
// Add session to the connected sessions set
clients.add(session);
logger.log(Level.INFO,"Client " + session.getId() + " connected.");
}
@OnClose
public void onClose(Session session) {
// Remove session from the connected sessions set
clients.remove(session);
logger.log(Level.INFO,"Client " + session.getId() + " disconnected.");
}
@OnError
public void onError(Throwable error) {
logger.log(Level.SEVERE,error.getMessage());
}
@OnMessage
public void processUpload(byte[] uploadData, Session session) {
try {
if (session.isOpen()) {
// Wrap a byte array into a buffer
ByteBuffer buf = ByteBuffer.wrap(uploadData);
logger.log(Level.INFO,"Receiving Data");
//session.getBasicRemote().sendBinary(buf);
}
} catch (Exception e) {
try {
session.close();
} catch (Exception e1) {
logger.log(Level.SEVERE,"Failed to close Session. ",e1);
}
}
}
}
У меня была идея, что, возможно, это связано с Apache, так как наша Wildfly работает за apache, который работает как обратный прокси, поэтому я добавил конечные точки Websocket в моем https- gw.conf:
<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerName repName
SSLProxyEngine On
ProxyRequests Off
ProxyPreserveHost On
ProxyPass / http://127.0.0.1:8080/
ProxyPassReverse / http://127.0.0.1:8080/
ProxyPass /Application/ http://127.0.0.1:8080/Application/
ProxyPassReverse /Application/ http://127.0.0.1:8080/Application/
ProxyPass /smallfiles/socket/ ws://127.0.0.1:8080/websocket/
ProxyPassReverse /smallfiles/socket/ ws://127.0.0.1:8080/websocket/
ProxyPass /Application/smallfiles/socket/ ws://127.0.0.1:8080/Application/websocket/
ProxyPassReverse /Application/smallfiles/socket/ ws://127.0.0.1:8080/Application/websocket/
SetEnv proxy-sendcl 10000000
SetEnv proxy-sendchunked
# Server Certificate:
SSLCertificateFile /etc/apache2/ssl.crt/host.net.cer
# Server Private Key:
SSLCertificateKeyFile /etc/apache2/ssl.key/host.net.key
# Certificate Authority (CA):
SSLCACertificateFile /etc/apache2/ssl.crt/my_ca.crt
</VirtualHost>
</IfModule>
Однако всякий раз, когда я пытаюсь получить доступ к Websocket через Javascript, я получаю следующие проблемы:
ws = new WebSocket("wss://my.server.net/")
WebSocket {url: "wss://my.server.net/", readyState: 0, bufferedAmount: 0, onopen: null, onerror: null, …}
Соединение WebSocket с 'wss: //my.application.net/ 'не удалось: ошибка во время рукопожатия WebSocket: непредвиденный код ответа: 200
или
ws = new WebSocket("wss://my.server.net/smallfiles/socket")
WebSocket {url: "wss://my.server.net/smallfiles/socket", readyState: 0, bufferedAmount: 0, onopen: null, onerror: null, …}
подключение WebSocket к' wss: / /my.server.net/smallfiles/socket 'не удалось: ошибка во время рукопожатия WebSocket: неожиданный код ответа: 404
Я также проверил сообщение от пользователя @cayz, но, к сожалению Я не очень понимаю, что означает решение для пользователей.
Кто-нибудь знает, где у меня есть blackage?
РЕДАКТИРОВАТЬ: Я также проверил журналы wildfly, и wildfly регистрирует конечную точку.
2020-02-04 19:33:44,647 INFO [io.undertow.websockets.jsr] (ServerService Thread Pool -- 113) UT026003: Adding annotated server endpoint class com.my.package.WebsocketApi for path /smallfiles/socket