android java.net.SocketException: Connection reset by peer
阿新 • • 發佈:2019-01-24
寫了個android上測試socket的例子:
server側:
class ServerThread extends Thread { /** * TCP. */ @Override public void run() { ServerSocket serSocket = null; try { serSocket = new ServerSocket(4567); // wait until accept request from client ! System.out.println("== before ServerSocket.accept(TCP) =="); Socket socket = serSocket.accept(); InputStream is = socket.getInputStream(); byte[] bytes = new byte[1024]; int temp = 0; while ((temp = is.read(bytes)) != -1) { System.out.println(new String(bytes, 0, temp)); } } catch (IOException e) { e.printStackTrace(); } finally { try { serSocket.close(); } catch (IOException e) { e.printStackTrace(); } System.out.println("== after ServerSocket.accept(TCP) =="); } } }
client側:
@Test public void startClientSocket() { Socket socket = null; InputStream is = null; try { // get socket object socket = new Socket("192.168.1.102", 4567); // get outputStream OutputStream os = socket.getOutputStream(); is = new FileInputStream("C:/test.txt"); byte[] bytes = new byte[1024]; int temp = 0; while ((temp = is.read(bytes)) != -1) { os.write(bytes, 0, temp); } os.flush(); is.close(); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }
執行後發現logcat中有SocketException:
10-03 17:19:16.225: W/System.err(16398): java.net.SocketException: Connection reset by peer 10-03 17:19:16.264: W/System.err(16398): at org.apache.harmony.luni.platform.OSNetworkSystem.read(Native Method) 10-03 17:19:16.264: W/System.err(16398): at dalvik.system.BlockGuard$WrappedNetworkSystem.read(BlockGuard.java:273) 10-03 17:19:16.264: W/System.err(16398): at org.apache.harmony.luni.net.PlainSocketImpl.read(PlainSocketImpl.java:458) 10-03 17:19:16.264: W/System.err(16398): at org.apache.harmony.luni.net.SocketInputStream.read(SocketInputStream.java:85) 10-03 17:19:16.264: W/System.err(16398): at org.apache.harmony.luni.net.SocketInputStream.read(SocketInputStream.java:65) 10-03 17:19:16.272: W/System.err(16398): at com.example.androidstudy.socket.ServerThread.run(SocketActivity.java:54)
上網查了些資料,發現原因如下:
java.net.SocketException: (Connection reset或者Connect reset by peer:Socket write error)。
該異常在客戶端和伺服器端均有可能發生,引起該異常的原因有兩個,第一個就是如果一端的Socket被關閉(或主動關閉或者因為異常退出而引起的關閉),另一端仍傳送資料,傳送的第一個資料包引發該異常(Connect reset by peer)。另一個是一端退出,但退出時並未關閉該連線,另一端如果在從連線中讀資料則丟擲該異常(Connection reset)。簡單的說就是在連線斷開後的讀和寫操作引起的。請參照:http://developer.51cto.com/art/201003/189724.htm
client側的socket使用後沒有關閉,所以在client側的測試程式碼後面追加了finally,異常就不再發生了。
......
finally {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}