在使用socket进行通信连接时出现java.net.SocketException: Connection reset的解决方案

这篇具有很好参考价值的文章主要介绍了在使用socket进行通信连接时出现java.net.SocketException: Connection reset的解决方案。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

产生原因

  1. 在创建客户端和服务端后,出现java.net.SocketException: Connection reset的错误。
    • 导致的原因

      1. 客户端或者服务端其中一端还在传输数据的途中,另外一端的socket被关闭(或者主动0关闭,或者运行异常退出导致的关闭),这时,客户端的第一个数据包传输过来后就会引发该异常。
      2. 一端在退出时,未断开连接,另外一端仍旧在连接中读取数据,就会抛出该异常,简单来说就是连接断开后其中一端仍旧在进行读写操作导致的。
    • 看错误代码:未及时关闭客户端连接,导致服务端仍旧在连接中读取数据。

      1. 客户端代码:
package com.net.TCP;

import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;

//模拟客户端
public class TcpClient {
    public static void main(String[] args) {
        OutputStream os=null;
        Socket socket =null;
        //1.获取服务端的IP地址+端口号
        try {
            //获取IP地址
            InetAddress getByName = InetAddress.getByName("127.0.0.1");
            //获取端口号
            int port=8080;
            //创建一个Socket连接
            socket = new Socket(getByName, port);
            System.out.println("12");
            //向连接发送数据,使用IO流
            os= socket.getOutputStream();
            os.write("你还号码".getBytes());
            Thread.sleep(3000); // 1000毫秒,即1秒钟
        } catch (Exception e) {
            e.printStackTrace();
        }
       //未对连接进行关闭
        }
    }
}

	2. 服务端代码:
package com.net.TCP;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

//模拟TCP协议发送消息:三次握手
//模拟服务端接受数据
public class TcpService {
    public static void main(String[] args) {
        try {
            //1.客户端需要拥有一个端口号
            ServerSocket serverSocket = new ServerSocket(8080);
            //等待客户连接
            Socket accept = serverSocket.accept();
            //读取客户信息
            InputStream is = accept.getInputStream();
            //使用管道流输出数据
                //创建管道流对象
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            //创建管道流缓冲区
            byte[] b=new  byte[1024];
            int len;
            while ((len= is.read(b))!=-1){
                System.out.println("23");
                //通过管道流输出数据
                bos.write(b,0,len);
            }
            System.out.println(bos.toString());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

只需要对两端的连接和数据流及时关闭就可以解决该问题文章来源地址https://www.toymoban.com/news/detail-707507.html

  • 更改后客户端:
package com.net.TCP;

import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;

//模拟客户端
public class TcpClient {
    public static void main(String[] args) {
        OutputStream os=null;
        Socket socket =null;
        //1.获取服务端的IP地址+端口号
        try {
            //获取IP地址
            InetAddress getByName = InetAddress.getByName("127.0.0.1");
            //获取端口号
            int port=8080;
            //创建一个Socket连接
            socket = new Socket(getByName, port);
            System.out.println("12");
            //向连接发送数据,使用IO流
            os= socket.getOutputStream();
            os.write("你还号码".getBytes());
            Thread.sleep(3000); // 1000毫秒,即1秒钟
        } catch (Exception e) {
            e.printStackTrace();
        }
        finally {
            try {
                os.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

  • 更改后服务端:
package com.net.TCP;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

//模拟TCP协议发送消息:三次握手
//模拟服务端接受数据
public class TcpService {
    public static void main(String[] args) {
        ByteArrayOutputStream bos =null;
        InputStream is =null;
        Socket accept =null;
        try {
            //1.客户端需要拥有一个端口号
            ServerSocket serverSocket = new ServerSocket(8080);
            //等待客户连接
             accept = serverSocket.accept();
            //读取客户信息
             is = accept.getInputStream();
            //使用管道流输出数据
                //创建管道流对象
            bos = new ByteArrayOutputStream();
            //创建管道流缓冲区
            byte[] b=new  byte[1024];
            int len;
            while ((len= is.read(b))!=-1){
                System.out.println("23");
                //通过管道流输出数据
                bos.write(b,0,len);
            }
            System.out.println(bos.toString());
        } catch (IOException e) {
            e.printStackTrace();
        }
        finally {
            try {
                bos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                accept.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

到了这里,关于在使用socket进行通信连接时出现java.net.SocketException: Connection reset的解决方案的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • rabbitmq之java.net.SocketException: Connection reset与MissedHeartbeatException分析

    一、前言 在android前端中接入了rabbitmq消息队列来处理业务,在手机网络环境错综复杂,网络信号不稳定,可能导致mq的频繁断开与连接,在日志中,发现有很多这样的日志,java.net.SocketException: Connection reset,接下来通过源码调试来分析下该错误可能产生的原因。MissedHeartbeat

    2024年01月21日
    浏览(39)
  • 解决JDK7调用https报:java.net.SocketException: Connection reset错误

            大多数现代的 HTTPS 连接将使用 TLS 1.2 协议 或 TLS 1.3 协议,具体取决于服务器和客户端支持的版本以及其之间的协商,而 JDK7及以下 版本默认使用是 TLS v1 协议,所以在调用HTTPS接口时,会出现java.net.SocketException: Connection reset报错;         下面是不同JDK版本的默

    2024年04月26日
    浏览(33)
  • Unable to open debugger port (127.0.0.1:13928):java.net.SocketException “

    Unable to open debugger port (127.0.0.1:13928):java.net.SocketException “Interrupted function call: accept failed” 一、问题描述 准备debug启动项目时,报标题错误。 二、原因分析 出现这个报错的原因是因为端口被占用导致的。 三、解决办法 解决方法:关闭占用端口的进程。 第一步:cmd打开命令行窗

    2024年02月03日
    浏览(52)
  • java.net.SocketException: No buffer space available (maximum connections reached?): connect

            最近,有项目反馈调用第三方接口失败,查不到数据。现场用soapUI工具试了下,点执行按钮,一闪而过,接口没有任何返回值。一开始以为是第三方服务问题,后来查看日志,发现是自己的问题,报错如下:         Caused by: java.net.SocketException: No buffer space av

    2024年02月16日
    浏览(39)
  • java.net.SocketTimeoutException: Read timed out,tcp连接心跳[TCP Keep-Alive],socket模拟http

     读超时con.setReadTimeout(3 * 60 * 60 * 1000);已设置为3小时。 日志 日志发现 等待了 3小时,抛出了异常 经过排查,是因为 后端防火墙,连接空闲20分钟,连接就会被丢弃。 解决办法是,使用 socket.setKeepAlive(true); 注意HttpURLConnection的connection.setRequestProperty(\\\"Connection\\\", \\\"keep-alive\\\");是不

    2024年02月07日
    浏览(36)
  • .Net6使用WebSocket与前端进行通信

    1. 创建类WebSocketTest: 2. 在program.cs中进行绑定 3. 使用websocket在线工具模拟请求:

    2024年02月03日
    浏览(48)
  • ASP.NET Core 中使用 WebSocket 协议进行实时通信

    介绍 在 ASP.NET Core 中使用 WebSocket 协议创建实时通信的完整示例涉及几个步骤。在此示例中,我们将创建一个简单的聊天应用程序,用户可以在其中实时发送和接收消息。此示例假设您对 ASP.NET Core 和 C# 有基本了解。 步骤1.创建一个新的ASP.NET Core项目 首先,使用 Visual Studio 或

    2024年01月25日
    浏览(51)
  • 基于.net6的WPF程序使用SignalR进行通信

    之前写的SignalR通信,是基于.net6api,BS和CS进行通信的。 .net6API使用SignalR+vue3聊天+WPF聊天_signalr wpf_故里2130的博客-CSDN博客 今天写一篇关于CS客户端的SignalR通信,后台服务使用.net6api 。其实和之前写的差不多,主要在于服务端以后台进程的方式存在,而客户端以exe方式存在,

    2024年02月16日
    浏览(51)
  • ES启动报错:Caused by: java.net.SocketException: No buffer space available (maximum connections reached?)

    线上服务的es突然挂掉导致网站无法正常访问,看了下是es服务停止了,于是重启后出现了如下报错,对于报错信息的重点关注: Caused by: java.net.SocketException: No buffer space available (maximum connections reached?): connect 看报错信息是连接数太多,耗尽了某种资源。 查看当前所有的连接,

    2024年02月07日
    浏览(44)
  • socket是如何进行通信的

    Socket通信的原理大致分为以下几个步骤: 服务器端建立Socket,开始侦听整个网络中的连接请求。 当检测到来自客户端的连接请求时,向客户端发送收到连接请求的信息,并建立与客户端之间的连接。 当完成通信后,服务器关闭与客户端的Socket连接。 客户端的步骤如下: 建

    2024年02月04日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包