Ошибка 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 ссылка здесь и работает как шарм!

Другие вопросы по тегам