android java.net.SocketException: Connection reset by peer

写了个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();
			}

		}


 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值