【发布时间】:2017-03-09 22:05:15
【问题描述】:
我有一个 Spring Boot 应用程序,它实现了一个 Websocket 服务器 (SockJS)。
只要托管应用程序的 Ubuntu 机器可以访问互联网,我就可以在本地网络上将客户端连接到该服务器。
2016-10-27 11:22:20.802 调试 9390 --- [nio-8085-exec-9] oacoyote.http11.Http11NioProtocol:套接字:[org.apache.tomcat.util.net.NioEndpoint$KeyAttachment @6cb31793:org.apache.tomcat.util.net.NioChannel@231c3b0c:java.nio.channels.SocketChannel[已连接本地=/192.168.1.104:8085 远程=/192.168.1.106:51946]],状态:[OPEN_READ ],说明:[已关闭]
2016-10-27 11:22:20.849 调试 9390 --- [io-8085-exec-10] d.f.util.ConnectivityCheckUtil:找到本地网络接口:wlp2s0 192.168.1.104 2016-10-27 11:22:20.850 调试 9390 --- [io-8085-exec-10] d.f.util.ConnectivityCheckUtil :您的 ip 是:192.168.1.104
2016-10-27 11:22:20.850 调试 9390 --- [io-8085-exec-10] d.f.i.v.b.i.w.s.BrokerWebsocketHandler:已连接 ... t0obkpdo 2016-10-27 11:22:20.851 信息 9390 --- [io-8085-exec-10] d.f.i.v.b.i.w.s.BrokerWebsocketHandler:websocketTextmessagesize = 1000000
2016-10-27 11:22:20.852 调试 9390 --- [io-8085-exec-10] oacoyote.http11.Http11NioProtocol:套接字:[org.apache.tomcat.util.net.NioEndpoint$KeyAttachment @1648207f:org.apache.tomcat.util.net.NioChannel@231c3b0c:java.nio.channels.SocketChannel[连接本地=192.168.1.104/192.168.1.104:8085远程=/192.168.1.106:51947]],状态:[OPEN_READ],说明:[UPGRADING]
2016-10-27 11:22:20.852 调试 9390 --- [io-8085-exec-10] oacoyote.http11.Http11NioProtocol:套接字:[org.apache.tomcat.util.net.NioEndpoint$KeyAttachment @1648207f:org.apache.tomcat.util.net.NioChannel@231c3b0c:java.nio.channels.SocketChannel[连接本地=192.168.1.104/192.168.1.104:8085远程=/192.168.1.106:51947]],状态:[OPEN_READ],说明:[UPGRADED]
当我拔下网络路由器上的 WAN 插头时,服务器会断开所有 WS 连接并且不允许新的连接。客户端会报错码2000 'All transports failed'。
服务器会抛出这个错误:
2016-10-27 11:18:38.380 调试 9390 --- [nio-8085-exec-1] oacoyote.http11.Http11NioProtocol:套接字:[org.apache.tomcat.util.net.NioEndpoint$KeyAttachment @5526ea03:org.apache.tomcat.util.net.NioChannel@5f9486ff:java.nio.channels.SocketChannel[关闭]],状态:[OPEN_READ],状态:[CLOSED]
2016-10-27 11:18:51.396 调试 9390 --- [nio-8085-exec-2] oacoyote.http11.Http11NioProtocol:套接字:[org.apache.tomcat.util.net.NioEndpoint$KeyAttachment @d05fac1:org.apache.tomcat.util.net.NioChannel@5f9486ff:java.nio.channels.SocketChannel[连接本地=/192.168.1.104:8085远程=/192.168.1.106:51692]],状态:[OPEN_READ ],说明:[已关闭]
2016-10-27 11:19:01.437 调试 9390 --- [nio-8085-exec-6] oacoyote.http11.Http11NioProtocol:套接字:[org.apache.tomcat.util.net.NioEndpoint$KeyAttachment @7f10c230:org.apache.tomcat.util.net.NioChannel@5f9486ff:java.nio.channels.SocketChannel[已连接本地=192.168.1.104/192.168.1.104:8085 远程=/192.168.1.106:51693]],状态在:[OPEN_READ],说明:[CLOSED]
2016-10-27 11:19:02.141 DEBUG 9390 --- [nio-8085-exec-3] d.f.util.ConnectivityCheckUtil:找到本地网络接口:wlp2s0 192.168.1.104
2016-10-27 11:19:02.142 DEBUG 9390 --- [nio-8085-exec-3] d.f.util.ConnectivityCheckUtil :您的 ip 是:192.168.1.104
2016-10-27 11:19:02.144 调试 9390 --- [nio-8085-exec-3] d.f.i.v.b.i.w.s.BrokerWebsocketHandler:已连接 ... 2cbhftw3
2016-10-27 11:19:02.144 INFO 9390 --- [nio-8085-exec-3] d.f.i.v.b.i.w.s.BrokerWebsocketHandler:websocketTextmessagesize = 1000000
2016-10-27 11:19:02.147 调试 9390 --- [nio-8085-exec-3] d.f.i.v.b.i.w.s.BrokerWebsocketHandler :会话 2cbhftw3 由于 CloseStatus [code=1011, reason=null] 而关闭
2016-10-27 11:19:02.149 错误 9390 --- [nio-8085-exec-3] oaccC[.[.[/].[dispatcherServlet]:Servlet.service() 用于 servlet [dispatcherServlet]在路径 [] 的上下文中抛出异常 [请求处理失败;嵌套异常是 org.springframework.web.socket.sockjs.SockJsException: Uncaught failure in SockJS request, uri=http://192.168.1.104:8085/websocket/data/421/2cbhftw3/xhr_streaming;嵌套异常是 org.springframework.web.socket.sockjs.SockJsTransportFailureException: 无法打开会话;嵌套异常是 org.apache.catalina.connector.ClientAbortException: java.io.IOException: Broken pipe] 的根本原因
java.io.IOException: 损坏的管道
只要我重新插入 WAN 电缆并且路由器可以再次访问 Internet,WS 连接就会再次开始工作。我已经在 Netgear 和 TP-Link 的多个路由器上尝试过这个。
我已经尝试在ubuntu下手动设置网络接口设置,但是没有帮助。
知道是什么原因造成的吗?
BR 丹尼尔
【问题讨论】:
标签: java spring websocket sockjs