Ошибка WebSocket 404
Я пытаюсь реализовать WebSocket на моем сайте. Следуя основным урокам, я добавил этот класс:
@ServerEndpoint(value="/websocketendpoint")
public class WebSocket {
private static Set<Session> peers = Collections.synchronizedSet(new HashSet<Session>());
@OnMessage
public String onMessage(String message){ return null; }
@OnOpen
public void onOpen(Session peer){ peers.add(peer); }
@OnClose
public void onClose(Session peer){ peers.remove(peer); }
}
И это JS:
var wsUri = "ws://" + document.location.host + document.location.pathname + "websocketendpoint";
var ws = new WebSocket(wsUri);
ws.onopen = function(){
ws.send("Message to send");
alert("Message is sent...");
};
ws.onmessage = function (evt){
var received_msg = evt.data;
alert("Message is received...");
};
ws.onclose = function(){
alert("Connection is closed...");
};
Я добавил JS на одну из своих страниц, и только ws.onclose
называется, в консоли я получаю эту ошибку:
Firefox
: Firefox не может установить соединение с сервером по адресу ws: // localhost: 8080 / Mysite / websocketendpoint
Chrome
: Ошибка во время рукопожатия WebSocket: Неожиданный код ответа: 404
Я попытался использовать 'ws://echo.websocket.org' как wsUri
и это работает, поэтому я думаю, что проблема на стороне сервера.
Я использую следующие библиотеки: javaee-api-7.0, javax.websocket-api-1.0 Мои браузеры совместимы с веб-сокетами (я проверял)
Подобные темы мне не помогли, поэтому я прошу у вас предложения о том, как решить проблему
4 ответа
Вы могли бы хотеть проверить, является ли это корнем вашей ошибки: реализация tomcat 7.0.50 java webscoket дает ошибку 404
Tomcat имеет реализацию JSR-356 (т.е. API websocket) начиная с версии 7.0.47. Это также обеспечивает javax.websocket-api-1.0.jar
библиотека, так что это не нужно в вашем приложении. Это может понадобиться во время компиляции, но сервер предоставит его во время выполнения (вот что provided
область действия означает в Maven, если вы не знакомы с инструментом)
Удостовериться javax.websocket-api-1.0.jar
не развертывается в вашей WAR, щелкните правой кнопкой мыши в представлении сервера Eclipse, Clean...
с последующим Clean Tomcat work directory...
затем Publish
и попробуй еще раз.
Я столкнулся с этой же проблемой и решил ее, используя tomcat7-websocket.jar вместо javax.websocket-api.jar. Используйте эту зависимость:
<зависимость org = "org.apache.tomcat" name = "tomcat7-websocket" rev = "7.0.52" />
или поместите tomcat7-websocket.jar в /usr/share/tomcat7/lib/
Я столкнулся с тем же набором симптомов, у которых была другая причина, о которой люди, обсуждающие этот вопрос, могли бы хотеть знать. Все отлично работало локально, но в tomcat произошел сбой 404 и те же сообщения об ошибках, что и в этом вопросе при развертывании сервера в AWS Проблема оказалась в том, что в AWS мой веб-сокет проходил через интерфейс Apache httpd через директивы ProxyPass.
<Location "/myApp">
AuthType Basic
AuthName "Authorized Users Only"
AuthBasicProvider file
AuthUserFile "/usr/local/secure/htpasswd/passwords"
Require user my_user
ProxyPass http://localhost:8080/myApp
ProxyPassReverse http://localhost:8080/myApp
</Location>
Однако это привело к тому, что запрос был превращен в http://
запрос не ws://
запрос, когда он был передан в кот.
Решение было написать более конкретную Location
это касается только веб-сокета.
<Location "/myApp/socket">
AuthType Basic
AuthName "Authorized Users Only"
AuthBasicProvider file
AuthUserFile "/usr/local/secure/htpasswd/passwords"
Require user my_user
ProxyPass ws://localhost:8080/myApp/socket
ProxyPassReverse ws://localhost:8080/myApp/socket
</Location>
Я страдал от этой проблемы в течение нескольких дней.
Я использовал tomcat7.
Я пытался добавить банки в JVM, но нет смысла.
Наконец я обновился до tomcat8.5
ссылка здесь и работает как шарм!