服务端代码
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("数据已发送中"); 18 //睡眠10秒,让服务器端把数据读完 19 Thread.sleep(10000); 20 //s.close(); 21 } catch (Exception e) { 22 e.printStackTrace(); 23 } 24 } 25 26 27 static byte[] prepareBytes() { 28 byte[] bytes = new byte[68]; 29 for (int i = 0; i < bytes.length; i++) { 30 bytes[i] = 1; 31 } 32 return bytes; 33 } 34 }
服务端开启服务之后,客户端进行连接. 服务端运行的结果是
已经开启 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)
异常的原因是:
解决办法:
把客户端中的第20行代码注释取消后,服务端代码就可以正常运行了
//s.close();
IO异常 java.net.SocketException: Connection reset
原文:https://www.cnblogs.com/martin-cn/p/10910463.html