广告
返回顶部
首页 > 资讯 > 后端开发 > JAVA >Java中对Socket设置超时时间
  • 553
分享到

Java中对Socket设置超时时间

Java 2016-12-21 14:12:48 553人浏览 无得
摘要

java中对Socket设置超时时间主要有以下两种方式,我们来看一下:(推荐:java视频教程)方式1:Socket s=new Socket(); s.connect(new InetSocketAddress(host,port),1

java中对Socket设置超时时间主要有以下两种方式,我们来看一下:(推荐:java视频教程

方式1:

Socket s=new Socket(); 
s.connect(new InetSocketAddress(host,port),10000);

方式2:

Socket s=new Socket("127.0.0.1",8080);
s.setSoTimeout(10000);

那么这两种方式设置的超时时间各自代表了什么意义呢?有什么区别呢?

第1种方式

我们先来看一下第1种方式,我们来测试一下:

在 main 方法中我们创建 Socket 连接到

ip :29.212.19.201,端口:2132

public static void main(String[] args) {
    Socket socket = new Socket();
    SocketAddress endpoint = new InetSocketAddress("29.212.19.201", 2132);
    long timeMillis = System.currentTimeMillis();
    try {
      socket.connect(endpoint, 10000);
    } catch (ioException e) {
      e.printStackTrace();
    }
    System.out.println(System.currentTimeMillis()-timeMillis);
    System.out.println("end");
  }

运行这段代码,控制台10秒之前没有任何信息输出,10秒后打印如下信息:

10002
java.net.SocketTimeoutException: connect timed out
  at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
  at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:85)
  at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
  at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
  at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
  at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
  at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
  at java.net.Socket.connect(Socket.java:589)
  at com.wakling.cn.SocketSever.main(SocketSever.java:33)
end

可以看出,我们尝试连接到29.212.19.201:2132时,连接了10秒都没有连接上,于是就报了 java.net.SocketTimeoutException: connect timed out 的异常。

解释一下,上述的 IP 是一个未知的 IP ,即我的 IP 在当前网络环境中访问不到这个 IP ,这样我们的这个 Socket 才会去一直尝试连接到此 IP 直到超时。如果 IP 是一个已知的 IP ,例如本地 127.0.0.1 加上一个未知的端口,那么此 Socket 连接会立马报错。

另外,在不设置连接超时时间的情况下,Socket 默认大概是21s(测试了3次都是21020毫秒)连接超时。如下是不设置连接超时时间的代码:

Socket socket = new Socket("29.212.19.201", 2132);

第2种方式

然后我们来看一下第2种方式,这时候我们需要在我们本地写一套 Socket 服务以及客户端来模拟这个场景。

我们让客户端设置 setSoTimeout 为10s,在服务端代码拿到客户端请求信息后,休眠10s后再处理客户端请求,返回响应。

我们来看一下效果,关键代码如下:

//服务端
System.out.println("进入休眠,10s后醒来");
Thread.sleep(10000);
System.out.println("休眠结束");
//返回响应
OutputStream outputStream = socket.getOutputStream();// 获取一个输出流,向服务端发送信息
PrintWriter printWriter = new PrintWriter(outputStream);// 将输出流包装成打印流
printWriter.print("你好,服务端已接收到您的信息");
printWriter.flush();

//客户端
Socket socket = new Socket("127.0.0.1",2132);
socket.setSoTimeout(10000);//read的超时时间

运行后,等待客户端输出,10s后客户端控制台输出信息如下:

java.net.SocketTimeoutException: Read timed out
  at java.net.SocketInputStream.socketRead0(Native Method)
  at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
  at java.net.SocketInputStream.read(SocketInputStream.java:171)
  at java.net.SocketInputStream.read(SocketInputStream.java:141)
  at sun.NIO.cs.StreamDecoder.readBytes(StreamDecoder.java:284)
  at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326)
  at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
  at java.io.InputStreamReader.read(InputStreamReader.java:184)
  at java.io.BufferedReader.fill(BufferedReader.java:161)
  at java.io.BufferedReader.readLine(BufferedReader.java:324)
  at java.io.BufferedReader.readLine(BufferedReader.java:389)
  at com.wakling.cn.SocketClient.main(SocketClient.java:36)
10020
end

这里10s后客户端报错 java.net.SocketTimeoutException: Read timed out 查看客户端控制台信息正常输出,即使客户端已报超时,服务端仍然继续往下走,只是客户端已经收不到服务端10s后发给自己的消息。

另外经测试发现,服务端休眠很久很久,如500s,在客户端不设置 setSoTimeout 时,默认120s超时。

区别和意义

下面我们就来说一说二者的意义和区别。

方式1是客户端与服务端进行连接的超时时间,即10秒内建立不了连接就报java.net.SocketTimeoutException: connect timed out 连接超时的异常。此时二者未建立连接,更别说服务端收到客户端的消息了。

方式2是设置 inputStream.read() 方法的阻塞时间,即客户端发出请求后等待服务端返回响应的等待时长,超过这个时长将会引发 java.net.SocketTimeoutException: Read timed out 异常。此时二者正常建立连接,服务端接收到了客户端的请求。

两种方式控制超时的侧重点不同,就像打电话一样,方法1是打电话10秒你不接电话我就挂了,方法2是打电话接通后,等你10秒不说话就挂,10秒后说不说话都不听了。

更多java知识请关注Java基础教程栏目。

--结束END--

本文标题: Java中对Socket设置超时时间

本文链接: https://www.lsjlt.com/news/1741.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java中对Socket设置超时时间
    java中对Socket设置超时时间主要有以下两种方式,我们来看一下:(推荐:java视频教程)方式1:Socket s=new Socket(); s.connect(new InetSocketAddress(host,port),1...
    99+
    2016-12-21
    Java
  • java中Socket设置超时时间的两种方式
    目录Socket设置超时时间的两种方式方法1方法2整理一下二者的区别设置socket超时时间的那些坑Socket设置超时时间的两种方式 方法1 调用Socket的connct 方法打...
    99+
    2022-11-13
    java Socket Socket设置超时时间 java Socket超时设置
  • Java如何设置session超时时间
    小编给大家分享一下Java如何设置session超时时间,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!在一般系统登录后,都会设置一个当前session失效的时间,...
    99+
    2023-06-06
  • Java中Socket设置连接超时的代码分享
    前言大家都知道Java的Socket如果连接不到指定IP和Port的主机,就会抛出IOException异常,而通常情况下,从连接到出现IOException会有一段不定的时长,就是所谓的超时时长,如果超时时长过长,在开发时会影响测试,如果...
    99+
    2023-05-31
    java socket 连接超时
  • SpringBoot设置接口超时时间
    SpringBoot设置接口访问超时时间有两种方式一、在配置文件application.properties中加了spring.mvc.async.request-timeout=20000,意思是设置超时时间为20000ms即20s,二、...
    99+
    2015-11-02
    java教程 SpringBoot
  • php.ini怎么设置超时时间
    本教程操作环境:windows7系统、PHP7.1版,DELL G3电脑php.ini 中缺省的最长执行时间是 30 秒,这是由 php.ini 中的 max_execution_time 变量指定,倘若你有一个需要颇多时间才能完成的工作,...
    99+
    2021-08-07
    php.ini 超时时间
  • java怎么设置接口调用超时时间
    在 Java 中,我们可以使用 `java.net.URLConnection` 或 `java.net.HttpURLConnec...
    99+
    2023-10-26
    java
  • redis怎么设置hash超时时间
    Redis中的hash类型是没有超时时间的,但是可以通过设置hash中每个field的值为一个带有超时时间的字符串或者其他数据类型来...
    99+
    2023-09-01
    redis
  • golang在GRPC中设置client的超时时间
    超时 建立连接 主要就2函数Dail和DialContext。 // Dial creates a client connection to the given target. ...
    99+
    2022-11-12
  • mybatis设置sql执行时间超时时间的方法
    存在这样的场景,当一些比较耗时的查询时,如果不中断,则会导致数据库堵塞,进而会拖垮整个数据库服务的正常运行。 1.如果你使用的是HikariCP连接池的话,可以在配置文件设置conn...
    99+
    2022-11-13
  • mysql事务超时时间怎么设置
    在MySQL中,事务超时时间是由两个参数控制的:innodb_lock_wait_timeout和innodb_rollback_o...
    99+
    2023-10-26
    mysql
  • Oracle空闲超时时间如何设置
    本文小编为大家详细介绍“Oracle空闲超时时间如何设置”,内容详细,步骤清晰,细节处理妥当,希望这篇“Oracle空闲超时时间如何设置”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。Oracle空闲超时时间设置远...
    99+
    2023-07-06
  • mysql怎么设置session的超时时间
    本篇内容介绍了“mysql怎么设置session的超时时间”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! ...
    99+
    2022-10-18
  • PHP连接超时时间怎么设置
    在我们使用PHP进行网络请求时,有时候我们需要调整连接超时时间来适应不同的网络环境和请求类型。本文将介绍PHP连接超时时间,其原理和设置方法。连接超时时间是指当我们进行网络请求时,如果服务器无法响应请求,那么客户端需要等待多长时间后才会超时...
    99+
    2023-05-14
    php
  • php怎么设置超时等待时间
    在使用 PHP 进行开发时,有时需要执行耗时较长的操作,例如网络请求、数据库查询、文件操作等。在这种情况下,PHP 默认的超时时间可能不足以完成这些操作,导致程序出错。为了解决这个问题,我们需要设置 PHP 的超时等待时间。PHP 的超时等...
    99+
    2023-05-14
  • php如何设置会话超时时间
    这篇文章主要介绍“php如何设置会话超时时间”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“php如何设置会话超时时间”文章能帮助大家解决问题。什么是PHP会话PHP会话是一个用于在服务端存储数据的机...
    99+
    2023-07-06
  • php怎么设置会话超时时间
    PHP以其易学易用和功能强大的特点,成为了Web开发的标准语言之一。然而,在Web应用程序中,会话超时的问题困扰着很多开发者。会话超时是指当用户一段时间内没有任何操作时,服务端会话会自动过期,会话数据会被清空。在某些情况下,我们希望控制会话...
    99+
    2023-05-14
  • Oracle空闲超时时间设置方式
    目录oracle空闲超时时间设置Oracle长连接超时设置方法一方法二总结Oracle空闲超时时间设置 远程连接oracle 会出现超时连接断开的问题,所以需要修改oracle配置。 修改超时时间10分钟 ALTER P...
    99+
    2023-04-12
    Oracle空闲超时 Oracle时间设置 Oracle超时时间设置
  • jdbc怎么设置连接超时时间
    在JDBC中,可以使用`java.sql.Statement`或`java.sql.Connection`对象的`setQueryT...
    99+
    2023-10-27
    jdbc
  • PHP连接超时时间如何设置
    本篇内容主要讲解“PHP连接超时时间如何设置”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“PHP连接超时时间如何设置”吧!连接超时时间是指当我们进行网络请求时,如果服务器无法响应请求,那么客户端...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作