360引起的Soap的java.io.EOFException错误

本文详细记录了一个技术问题的排查过程,即360安全软件对Android设备上的WebService接口访问造成异常,而Windows端则不受影响。通过对代码和服务的深入检查,最终发现关闭360安全软件后,问题得以解决。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

昨天,我们的后视镜终端不能对讲,我们定位了很长时间,从服务接口到终端程序,整了一整天,发现是360的事。

具体技术问题:C#.net写的WebService接口。Windows终端访问没有问题,而Andriod终端访问出现以下错误。

AXLib.Utility.RuntimeExceptionEx: java.io.EOFException-->java.io.EOFException
-----------------
java.lang.Thread.run:856
com.cityctrl.android.controller.act.CoreActivity$84.run:6060
com.cityctrl.android.controller.service.TalkService.reEnterRepeat:352
com.cityctrl.android.controller.service.TalkService.connectInternet:112
com.cjzx.androidsdk.SDKInterface.Start:211
com.cjzx.androidsdk.Net.WSInterface.Test:44
com.cjzx.androidsdk.Net.WebServiceInterface.Test:79
com.cjzx.androidsdk.Net.WebServiceInterface.Call:54
com.cjzx.androidsdk.Net.WebServiceInterface.Call:68
    java.io.EOFException-->null
    -----------------
    java.lang.Thread.run:856
    com.cityctrl.android.controller.act.CoreActivity$84.run:6060
    com.cityctrl.android.controller.service.TalkService.reEnterRepeat:352
    com.cityctrl.android.controller.service.TalkService.connectInternet:112
    com.cjzx.androidsdk.SDKInterface.Start:211
    com.cjzx.androidsdk.Net.WSInterface.Test:44
    com.cjzx.androidsdk.Net.WebServiceInterface.Test:79
    com.cjzx.androidsdk.Net.WebServiceInterface.Call:54
    com.cjzx.androidsdk.Net.WebServiceInterface.Call:63
    org.ksoap2.transport.HttpTransportSE.call:77
    com.cjzx.androidsdk.Net.ServiceConnectionSE.openInputStream:49
    libcore.net.http.HttpURLConnectionImpl.getInputStream:168
    libcore.net.http.HttpURLConnectionImpl.getResponse:274
    libcore.net.http.HttpEngine.readResponse:784
    libcore.net.http.HttpEngine.readResponseHeaders:544
    libcore.io.Streams.readAsciiLine:203

 

    AXLib.Utility.RuntimeExceptionEx: java.io.IOException: unexpected end of stream on Connection{125.208.1.201:8080, 
proxy=DIRECT hostAddress=125.208.1.201 cipherSuite=none protocol=http/1.1} (recycle count=0)-->java.io.IOException:
unexpected end of stream on Connection{125.208.1.201:8080, proxy=DIRECT hostAddress=125.208.1.201 cipherSuite=none protocol=http/1.1} (recycle count=0)
java.lang.Thread.run:776com.cityctrl.service.TalkService$1.run:220com.cityctrl.service.TalkService.reEnterRepeat:469com.cityctrl.service.TalkService.connectInternet:323
com.cjzx.androidsdk.SDKInterface.Start:203com.cjzx.androidsdk.Net.WSInterface.Test:44
com.cjzx.androidsdk.Net.WebServiceInterface.Test:79
com.cjzx.androidsdk.Net.WebServiceInterface.Call:54
com.cjzx.androidsdk.Net.WebServiceInterface.Call:68
java.io.IOException: unexpected end of stream on Connection{125.208.1.201:8080, proxy=DIRECT hostAddress=125.208.1.201 cipherSuite=none protocol=http/1.1} (recycle count=0)
-->unexpected end of stream on Connection{125.208.1.201:8080, proxy=DIRECT hostAddress=125.208.1.201 cipherSuite=none protocol=http/1.1} (recycle count=0)
-----------------
java.lang.Thread.run:776 com.cityctrl.service.TalkService$1.run:220
com.cityctrl.service.TalkService.reEnterRepeat:469 com.cityctrl.service.TalkService.connectInternet:323
com.cjzx.androidsdk.SDKInterface.Start:203 com.cjzx.androidsdk.Net.WSInterface.Test:44
com.cjzx.androidsdk.Net.WebServiceInterface.Test:79
com.cjzx.androidsdk.Net.WebServiceInterface.Call:54
com.cjzx.androidsdk.Net.WebServiceInterface.Call:63
org.ksoap2.transport.HttpTransportSE.call:77
com.cjzx.androidsdk.Net.ServiceConnectionSE.openInputStream:49
com.android.okhttp.internal.huc.HttpURLConnectionImpl.getInputStream:243
com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponse:405
com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute:463
com.android.okhttp.internal.http.HttpEngine.readResponse:782
com.android.okhttp.internal.http.HttpEngine.readNetworkResponse:906
com.android.okhttp.internal.http.HttpTransport.readResponseHeaders:80
com.android.okhttp.internal.http.HttpConnection.readResponse:210
java.io.EOFException: \n not found: size=0 content=...-->\n not found: size=0 content=...
-----------------
java.lang.Thread.run:776
com.cityctrl.service.TalkService$1.run:220
com.cityctrl.service.TalkService.reEnterRepeat:469
com.cityctrl.service.TalkService.connectInternet:323
com.cjzx.androidsdk.SDKInterface.Start:203
com.cjzx.androidsdk.Net.WSInterface.Test:44
com.cjzx.androidsdk.Net.WebServiceInterface.Test:79
com.cjzx.androidsdk.Net.WebServiceInterface.Call:54
com.cjzx.androidsdk.Net.WebServiceInterface.Call:63
org.ksoap2.transport.HttpTransportSE.call:77
com.cjzx.androidsdk.Net.ServiceConnectionSE.openInputStream:49
com.android.okhttp.internal.huc.HttpURLConnectionImpl.getInputStream:243
com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponse:405
com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute:463
com.android.okhttp.internal.http.HttpEngine.readResponse:782
com.android.okhttp.internal.http.HttpEngine.readNetworkResponse:906
com.android.okhttp.internal.http.HttpTransport.readResponseHeaders:80
com.android.okhttp.internal.http.HttpConnection.readResponse:191
com.android.okhttp.okio.RealBufferedSource.readUtf8LineStrict:200

 

 

最后,将接口服务改了下端口,发现却可以用。这就奇怪了,同样的代码,不一样的问题。

最终,想到了先把360安全程序关掉试了试,结果就可以了。

未决疑问问题:360为何对Windows端WebService访问通过,却对Andriod端的访问进行禁止呢?

 

转载于:https://www.cnblogs.com/szpgpp/p/9951344.html

<think>好的,用户遇到了Java WebSocket中出现java.io.EOFException的问题,想要解决方案。首先,我需要回忆一下这个异常通常是什么原因引起的。根据之前的引用资料,EOFException通常表示在输入过程中意外到达了文件尾或流结束,也就是说,可能在读取数据时连接被意外关闭了。 接下来,我需要结合提供的引用内容来分析可能的原因和解决方法。引用1提到WebSocket报错EOFException,并且没有配置错误处理信息。这可能意味着在连接异常断开时,服务器端没有正确处理,导致抛出异常。引用3指出当浏览器关闭时,后端会报这个错,用户想知道如何处理和原因。这说明异常通常发生在客户端突然断开连接,服务器仍在尝试读写数据。 首先,应该考虑在服务器端增加异常处理机制,捕获EOFException并优雅地关闭连接。例如,在WebSocket的onError方法中处理异常,记录日志而不是让异常抛出。同时,检查是否在会话关闭后还有写操作,这可能导致异常,所以需要在发送数据前检查会话是否仍然打开。 然后,心跳机制也是一个解决方案,可以定期检测连接是否活跃,及时关闭无效连接,避免服务器尝试与已断开的客户端通信。另外,升级库版本可能修复已知的兼容性问题,比如Tomcat或Netty的版本问题导致EOFException。 还需要检查网络稳定性,因为不稳定的网络可能导致连接中断,进而引发异常。此外,处理消息边界,确保没有在读取数据时遇到不完整的消息,特别是在使用阻塞IO时,设置合理的超时时间。 现在要组织这些思路,分步骤给出解决方案,确保结构清晰,用户能逐步排查和解决问题。同时,根据用户提供的引用,特别是引用4中的解决方案,可能需要配置合适的超时时间和正确处理关闭事件。 最后,生成相关问题,帮助用户进一步理解或解决其他可能的相关问题,比如异常原因、心跳机制实现、版本兼容性检查等。</think>### Java WebSocket中出现java.io.EOFException的解决方案 #### 1. 异常原因分析 `java.io.EOFException`通常表示在读取数据时,输入流意外结束(如客户端突然关闭连接)[^3][^4]。在WebSocket场景中,常见原因包括: - 客户端非正常断开(如浏览器关闭、网络中断) - 服务器尝试读取已关闭的连接 - 消息格式不完整或协议不匹配[^1] --- #### 2. 分步解决方案 ##### 步骤1:添加异常捕获处理 在WebSocket的`onError`方法中显式处理异常,避免异常未捕获导致服务不稳定: ```java @Override public void onError(Session session, Throwable throwable) { if (throwable instanceof EOFException) { log.warn("客户端非正常断开: {}", session.getId()); try { session.close(); // 主动关闭失效会话 } catch (IOException e) { log.error("关闭会话失败", e); } } else { log.error("WebSocket异常", throwable); } } ``` ##### 步骤2:增强连接状态检查 在发送数据前检查会话是否仍有效: ```java public void sendMessage(Session session, String message) { if (session != null && session.isOpen()) { try { session.getBasicRemote().sendText(message); } catch (IOException e) { log.error("消息发送失败", e); } } else { log.warn("会话已关闭,无法发送消息"); } } ``` ##### 步骤3:配置心跳机制(Ping/Pong) 通过心跳检测及时清理无效连接(以Tomcat为例): ```java @ServerEndpoint(value = "/ws", configurator = CustomConfigurator.class) public class WsEndpoint { // 设置心跳间隔为60秒 @OnOpen public void onOpen(Session session) { session.setMaxIdleTimeout(60000); } } ``` ##### 步骤4:升级依赖库版本 检查并更新WebSocket相关库,如Tomcat或Netty: ```xml <!-- pom.xml示例 --> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-websocket</artifactId> <version>9.0.55</version> <!-- 使用稳定版本 --> </dependency> ``` ##### 步骤5:配置合理的超时时间 在服务器配置中增加连接超时设置(如Tomcat的`server.xml`): ```xml <Connector port="8080" connectionTimeout="30000" maxKeepAliveRequests="100"/> ``` --- #### 3. 验证方法 1. 使用Wireshark抓包分析TCP连接关闭过程 2. 通过日志观察异常触发频率: ```log 2023-08-20 14:00:00 [WARN] 客户端非正常断开: session-123 ``` 3. 压力测试工具模拟异常断开场景 --- #### 4. 扩展建议 - 对于Nginx反向代理场景,需检查`proxy_read_timeout`配置 - 使用连接池管理WebSocket会话 - 客户端增加重连机制 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值