09-04 00:18:36.660: E/NetTcpFileSendThread(1728): null
09-04 00:18:36.660: E/NetTcpFileSendThread(1728): java.net.SocketException: Connection reset by peer
09-04 00:18:36.660: E/NetTcpFileSendThread(1728): at org.apache.harmony.luni.platform.OSNetworkSystem.writeDirect(Native Method)
09-04 00:18:36.660: E/NetTcpFileSendThread(1728): at dalvik.system.BlockGuard$WrappedNetworkSystem.writeDirect(BlockGuard.java:290)
09-04 00:18:36.660: E/NetTcpFileSendThread(1728): at org.apache.harmony.nio.internal.SocketChannelImpl.writeImpl(SocketChannelImpl.java:454)
09-04 00:18:36.660: E/NetTcpFileSendThread(1728): at org.apache.harmony.nio.internal.SocketChannelImpl.write(SocketChannelImpl.java:402)
09-04 00:18:36.660: E/NetTcpFileSendThread(1728): at com.ccf.feige.net.NetTcpFileSendThread.sendFile(NetTcpFileSendThread.java:246)
09-04 00:18:36.660: E/NetTcpFileSendThread(1728): at com.ccf.feige.net.NetTcpFileSendThread.SocketListening(NetTcpFileSendThread.java:147)
09-04 00:18:36.660: E/NetTcpFileSendThread(1728): at com.ccf.feige.net.NetTcpFileSendThread.run(NetTcpFileSendThread.java:72)
09-04 00:18:36.660: E/NetTcpFileSendThread(1728): at java.lang.Thread.run(Thread.java:1019)
09-04 00:18:36.660: W/System.err(1728): java.net.SocketException: Connection reset by peer
09-04 00:18:36.660: W/System.err(1728): at org.apache.harmony.luni.platform.OSNetworkSystem.writeDirect(Native Method)
09-04 00:18:36.660: W/System.err(1728): at dalvik.system.BlockGuard$WrappedNetworkSystem.writeDirect(BlockGuard.java:290)
09-04 00:18:36.670: W/System.err(1728): at org.apache.harmony.nio.internal.SocketChannelImpl.writeImpl(SocketChannelImpl.java:454)
09-04 00:18:36.670: W/System.err(1728): at org.apache.harmony.nio.internal.SocketChannelImpl.write(SocketChannelImpl.java:402)
09-04 00:18:36.670: W/System.err(1728): at com.ccf.feige.net.NetTcpFileSendThread.sendFile(NetTcpFileSendThread.java:246)
09-04 00:18:36.670: W/System.err(1728): at com.ccf.feige.net.NetTcpFileSendThread.SocketListening(NetTcpFileSendThread.java:147)
09-04 00:18:36.670: W/System.err(1728): at com.ccf.feige.net.NetTcpFileSendThread.run(NetTcpFileSendThread.java:72)
09-04 00:18:36.670: W/System.err(1728): at java.lang.Thread.run(Thread.java:1019)
問題:
the answer was that it's the server's fault - it had to close the connection after each request .
作為服務器的一端出問題了。服務器一段單方面關閉了連接,導致請求無效。
it might be that android keeps a pool of connections and use the old one or something like that .
可能是Android系統保留了一個老的連接池,然后使用了老的連接,導致失效。
解決方法:我是利用Nio來進行數據傳輸的,在Nio中,Accepted、Writable、Readable在同一個線程中,每次連接的時候就創建一個新的線程。但是沒有注意到及時銷毀老的進程,這樣當老的連接線程因為監聽而阻塞的時候,新的線程也在監聽阻塞。兩個線程可能公用一個SocketChannel。這樣當回收老的進程的時候,新的進程的SocketChannel也被回收了。
導致連接重置( Connection reset by peer)。
以上是我的猜想。當我及時干掉老線程的時候,發現這個錯誤就沒有了。
