服務端代碼
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行代碼注釋取消后,服務端代碼就可以正常運行了
