IO異常 java.net.SocketException: Connection reset


 

服務端代碼

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM