`
libin0019
  • 浏览: 234462 次
  • 性别: Icon_minigender_1
  • 来自: 沈阳
社区版块
存档分类
最新评论

Software caused connection abort: recv failed

 
阅读更多

2011/09/28-09:49:18 >>  INFO >> pool-1-thread-1 >> org.apache.http.impl.client.DefaultRequestDirector.tryExecute(DefaultRequestDirector.java:656) >> I/O exception (java.net.SocketException) caught when processing request: Software caused connection abort: recv failed
2011/09/28-09:49:18 >>  INFO >> pool-1-thread-1 >> org.apache.http.impl.client.DefaultRequestDirector.tryExecute(DefaultRequestDirector.java:663) >> Retrying request
java.lang.UnsupportedOperationException: captureScreenshot
	at org.openqa.selenium.WebDriverCommandProcessor.execute(WebDriverCommandProcessor.java:262)
	at org.openqa.selenium.WebDriverCommandProcessor.doCommand(WebDriverCommandProcessor.java:195)
	at com.thoughtworks.selenium.DefaultSelenium.captureScreenshot(DefaultSelenium.java:744)
	at com.thoughtworks.selenium.ScreenshotListener.onTestFailure(ScreenshotListener.java:27)
	at org.testng.internal.Invoker.runTestListeners(Invoker.java:1732)
	at org.testng.internal.Invoker.runTestListeners(Invoker.java:1716)
	at org.testng.internal.Invoker.invokeMethod(Invoker.java:702)
	at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:799)
	at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1103)
	at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:137)
	at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:121)
	at org.testng.TestRunner.runWorkers(TestRunner.java:1098)
	at org.testng.TestRunner.privateRun(TestRunner.java:727)
	at org.testng.TestRunner.run(TestRunner.java:581)
	at org.testng.SuiteRunner.runTest(SuiteRunner.java:315)
	at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:310)
	at org.testng.SuiteRunner.privateRun(SuiteRunner.java:272)
	at org.testng.SuiteRunner.run(SuiteRunner.java:221)
	at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:40)
	at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:83)
	at org.testng.internal.thread.ThreadUtil$CountDownLatchedRunnable.run(ThreadUtil.java:151)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)

产生这个异常的原因有多种方面,单就如 Software caused 所示,

是由于程序编写的问题,而不是网络的问题引起的.

已知会导致这种异常的一个场景如下:
客户端和服务端建立tcp的短连接,每次客户端发送一次请求,
服务端响应后关闭与客户端的连接.
如果客户端在服务端关闭连接后,没有释放连接,继续试图发送请求和接收响应.
这个时候就会出错
 .

这个时候客户端Socket的getOutputStream返回来的OutPutStream维护
的是本地的连接状态,
无法知道远程的服务端已经关闭了对应的InputStream和socket因此
虽然调用了
out.write(sendbuf, 0, sendbuf.length);
方法,但是实际上服务端并没有接收到客户端的请求信息.
因为没有抛出异常,因此造成了误以为客户端请求发送成功的假象.

接下来调用InputStream的in.read(header, 0, 14);方法.
因为这次要读取服务端的信息,因此产生了
Software caused connection abort: recv failed的异常

总结产生原因,在服务端/客户端单方面关闭连接的情况下,另一方依然以为
tcp连接仍然建立,试图读取对方的响应数据,导致出现
Software caused connection abort: recv failed的异常.
 

因此在receive数据之前,要先判断连接状态.
通过inputstream的available()方法来判断,是否有响应结果.
如果available()的返回值为0,说明没有响应数据,可能是对方已经断开连接,
如果available()的返回值大于0,说明有响应数据.
另外值得注意的是available()返回的值是非堵塞的,可以被多个线程访问

在对方释放连接后,也要释放本地的连接.

解决办法引用自:http://jjiag22222.iteye.com/blog/1066525

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics