我在本地 PC 上创建并测试了一个使用 WebSockets 的 Java EE 7 应用程序。当我在本地机器上部署到 WildFly 8 并使用本地主机访问应用程序时,一切正常。
当我在具有完全相同的 WildFly 配置的云服务器 (Ubuntu 14.04) 上部署相同的应用程序时,当应用程序尝试连接时我收到以下消息:
"NetworkError: 404 Not Found - http://178.11.11.11:8080/pss/ws/notification"
Firefox can't establish a connection to the server at ws://178.11.11.11:8080/pss/ws/notification.
我可以访问该应用程序,只是 websocket 连接失败。
pss 是我的上下文根,websocket 端点用 @ServerEndpoint("/ws/notification") 注释,所以 URL 是正确的,并且在我使用 localhost 的本地机器上 100% 工作。
当我部署应用程序时,我可以看到 WildFly 已经获取了 websocket 端点,所以这不是问题
2015-02-14 14:18:21,200 INFO [io.undertow.websockets.jsr] (MSC service thread 1-2) UT026003: Adding annotated server endpoint class za.co.ssms.interfaces.websocket.NotificationWebSocket for path /ws/notification
请求 header 正确:
Accept text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding gzip, deflate
Accept-Language en-US,en;q=0.5
Cache-Control no-cache
Connection keep-alive, Upgrade
Cookie JSESSIONID=mgFhI1MAZwT2NwULXDXgEaXt.app
Host 178.11.11.11:8080
Origin http://178.11.11.11:8080
Pragma no-cache
Sec-WebSocket-Key LD55xYAKjJoXgLXQpUS7fA==
Sec-WebSocket-Version 13
Upgrade websocket
User-Agent Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:35.0) Gecko/20100101 Firefox/35.0
我正在使用以下 URL(已修改 IP)访问应用程序,并且端口匹配:
http://178.11.11.11:8080/pss/
如果我运行 netstat -an |在我的云服务器上 grep 'LISTEN' 我得到以下信息,这表明 0.0.0.0:8080 已绑定(bind)并正在监听:
tcp 0 0 127.0.0.1:9990 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:3528 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:8787 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp6 0 0 :::22 :::* LISTEN
unix 2 [ ACC ] STREAM LISTENING 9227 /var/run/acpid.socket
unix 2 [ ACC ] STREAM LISTENING 7014 @/com/ubuntu/upstart
unix 2 [ ACC ] STREAM LISTENING 8907 /var/run/dbus/system_bus_socket
unix 2 [ ACC ] STREAM LISTENING 9448 /var/run/mysqld/mysqld.sock
unix 2 [ ACC ] SEQPACKET LISTENING 7666 /run/udev/control
我的公共(public)接口(interface)配置如下:
<interface name="public">
<inet-address value="${jboss.bind.address:0.0.0.0}"/>
</interface>
Apache 未安装,因此这是与 Wildfly 服务器的直接连接。
几天后,我很困惑为什么会失败。
有没有人以前遇到过这种情况并有解决方案,或者你们有办法进一步解决这个问题。
谢谢
最佳答案
我有类似的问题。
but any http upgrade requests fail with a 404. The same call works when WildFly and the browser is on the same machine
工作的原因不一定是因为在同一台机器上,通过连接到同一网络上同事的机器进行测试,连接有效。
我是如何解决我的问题的:
我在服务器上做了一个 tcpdump,发现流量缺少升级 http header ,但当我通过不同的网络(手机热点网络共享)连接时情况并非如此。
错误的连接转储:
GET /websocket/api/alert HTTP/1.0
Host: www.example.co.za
Pragma: no-cache
Origin: http://www.example.co.za
Sec-WebSocket-Version: 13
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US,en;q=0.8
Cookie: JSESSIONID=biPOHuOQGRlw59eDqH4nevzt.mpilotech2
Sec-WebSocket-Key: U7f+gZQLqFLX18x6vB+i1Q==
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
Via: 1.1 localhost (squid/3.0.STABLE19)
X-Forwarded-For: 10.1.1.148
Cache-Control: no-cache, max-age=259200
Connection: keep-alive
HTTP/1.1 404 Not Found
Server: nginx/1.8.0
Date: Wed, 06 May 2015 08:29:05 GMT
Content-Length: 0
Connection: keep-alive
Access-Control-Allow-Origin: http://www.example.co.za
Vary: Origin
X-Powered-By: Undertow/1
Access-Control-Allow-Credentials: true
良好的连接转储:
GET /websocket/api/alert HTTP/1.1
Host: www.example.co.za
Connection: Upgrade
Pragma: no-cache
Cache-Control: no-cache
Upgrade: websocket
Origin: http://www.example.co.za
Sec-WebSocket-Version: 13
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US,en;q=0.8
Cookie: JSESSIONID=biPOHuOQGRlw59eDqH4nevzt.mpilotech2
Sec-WebSocket-Key: xY36TVE76RzHujuFljtq/w==
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
HTTP/1.1 101 Switching Protocols
Server: nginx/1.8.0
Date: Wed, 06 May 2015 08:31:19 GMT
Content-Length: 0
Connection: upgrade
X-Powered-By: Undertow/1
Origin: http://www.example.co.za
Upgrade: WebSocket
Sec-WebSocket-Accept: sxwgjN1BONLj5U5Kjh80fjQWBo4=
Access-Control-Allow-Origin: http://www.example.co.za
Vary: Origin
Sec-WebSocket-Location: ws://127.0.0.1:8180/websocket/api/alert
Access-Control-Allow-Credentials: true
然后我注意到失败的连接是通过 squid 3 代理服务器进行的,在网上阅读发现该代理服务器不支持 websocket。
我的临时解决方案是创建一个自签名证书并切换到使用 wss,我在我的反向代理而不是 ws 上终止连接。
你不必使用 ubuntu,我使用 CentOS,大部分说明仍然相同。
希望这会节省一些时间
关于java - 尝试在服务器上的 WildFly 上访问 websocket URL 时出现 404 错误,在本地主机上完美运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28519564/