服务端代码
package com.ligo.socket; import java.io.InputStream; import java.net.ServerSocket; import java.net.Socket; public class LigoServer3 { public static void main(String[] args) { try { System.out.println("已经开启 http服务"); ServerSocket sc = new ServerSocket(8080); Socket s = sc.accept(); InputStream is = s.getInputStream(); int count = 0; byte[] buffer = new byte[30]; System.out.println("开始读取数据"); while((count = is.read(buffer)) > -1) { System.out.println("读到数据的个数:"+count); } //读完数据的时间 System.out.println("读取数据结束"); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
客户端代码
1 package org.cnt.java.client; 2 3 import java.net.InetSocketAddress; 4 import java.net.Socket; 5 import java.util.Random; 6 7 public class Client { 8 9 public static void main(String[] args) { 10 try { 11 Socket s = new Socket(); 12 s.connect(new InetSocketAddress("localhost", 8080)); 13 System.out.println("已经连接到服务端,发送的数据准备中"); 14 //睡眠随机的5-10秒,模拟数据尚未就绪 15 Thread.sleep((new Random().nextInt(6) + 5) * 1000); 16 s.getOutputStream().write(prepareBytes()); 17 System.out.println("数据已发送中11111"); 18 //睡眠10秒,让服务器端把数据读完 19 Thread.sleep(10000); 20 //s.getOutputStream().close(); 21 //s.close(); 22 } catch (Exception e) { 23 e.printStackTrace(); 24 } 25 } 26 27 28 static byte[] prepareBytes() { 29 byte[] bytes = new byte[68]; 30 for (int i = 0; i < bytes.length; i++) { 31 bytes[i] = 1; 32 } 33 return bytes; 34 } 35 }
服务端开启服务之后,客户端进行连接. 服务端运行的结果是
已经开启 http服务
开始读取数据
读到数据的个数:30
读到数据的个数:30
读到数据的个数:8
java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(SocketInputStream.java:210)
at java.net.SocketInputStream.read(SocketInputStream.java:141)
at java.net.SocketInputStream.read(SocketInputStream.java:127)
at com.ligo.socket.LigoServer3.main(LigoServer3.java:19)
异常的原因是:
一端退出,但退出时并未关闭该连接,另一端如果在从连接中读数据则抛出该异常(Connection reset)。简单的说就是在连接断开后的读和写操作引起的。
解决办法:
把客户端中的第20行或21行代码注释取消后,服务端代码就可以正常运行了