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行代码注释取消后,服务端代码就可以正常运行了

 

转载于:https://www.cnblogs.com/martin-cn/p/10910463.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值