`
chenhua_1984
  • 浏览: 1234954 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

客户端套接字(Socket)超时

阅读更多

客户端套接字的超时 (timeout)就是指在客户端通过Socket和服务器进行通讯的过程中,由于网络延迟,网络阻塞等原因,造成服务器并未及时响应客户端的一种现象。 在一段时间后,客户端由于未收到服务端的响应而抛出一个超时错误; 其中客户端所等待的时间就是超时时间。

 

由于生产超时错误的一端都是被动端;也就是说,这一端是在接收数据,而不是发送数 据。对于客户端Socket来说,只有两个地方是在接收数据;一个是在连接服务器时;另一个是在连接服务器成功后,接收服务器发过来的数据时。因此,客户 端超时也分为两种类型:连接超时和读取数据超时。

 

一、连接超时

 

这种超时在前面的例子中已经使用过。在Socket类中只有通过connect方法的第二个参数才能指定连接超时的时间。由于使用connect方法连接服务器必须要指定IP和端口;因此,无效的IP或端口将会引发连接超时错误。

 

二、读取数据超时

 

在连接服务器成功后,Socket所做的最重要的两件事就是“接收数据”和“发送数 据”;而在接收数据时可能因为网络延迟、网络阻塞等原因,客户端一直处于等待状态;而客户端在等待一段时间后,如果服务器还没有发送数据到客户端,那么客 户端Socket将会抛出一个超时错误。

 

我们可以通过Socket类的setSoTimeout方法来设置读取数据超时的时 间;时间的单位是毫秒。这个方法必须在读取数据之前调用才会生效。如果将超时时间设为0,则不使用超时时间;也就是说,客户端什么时候和服务器断开,将完 全取决于服务端程序的超时设置。如下面的语句将读取数据超时时间设为5秒。

Socket socket = new Socket();
socket.setSoTimeout(5000);
socket.connect(… …);
socket.getInputStream().read();

 要注意的是不要将设置连接超时和读取数据超时设置得太小,如果值太小,如100,可能会造成服务器的数据还没来得及发过来,客户端就抛出超时错误的现象。下面的代码给出了一个用于测试连接超时和读取数据超时的例子。

package mynet;

import java.net.*;

public class SocketTimeout
{
    public static void main(String[] args)
    {
        long time1 = 0, time2 = 0;
        Socket socket = new Socket();
        try
        {
            if (args.length < 4)
            {
                System.out.println("参数错误!");
                return;
            }

            time1 = System.currentTimeMillis();
            socket.connect(new InetSocketAddress(args[0], Integer
                    .parseInt(args[1])), Integer.parseInt(args[2]));
            socket.setSoTimeout(Integer.parseInt(args[3]));
            time1 = System.currentTimeMillis();
            socket.getInputStream().read();
        }
        catch (SocketTimeoutException e)
        {
            if (!socket.isClosed() && socket.isConnected())
                System.out.println("读取数据超时!");
            else
                System.out.println("连接超时");
        }
        catch (Exception e)
        {
            System.out.println(e.getMessage());
        }
        finally
        {
            time2 = System.currentTimeMillis();
            System.out.println(time2 - time1);
        }
    }
}

 SocketTimeout类的main方法需要4个参数:IP(域名)、端口、连接超时、读取数据超时。下面让我们来用一组数据来测试这个例子。

测试1 :无效IP引发的超时错误

 

执行如下命令:

java mynet.SocketTimeout 192.168.18.24 80 3000 5000

 运行结果:

连接超时
3045
 

注 意:192.168.18.24是一个无效的IP;如果这个IP在网络环境中存在,请换其它的无效的IP.在这个测试用例中不能将无效的IP换成无效的域 名;这是因为如果使用了域名来连接服务器,Java会先通过DNS将域名映射成相应的IP;如果这个域名是无效的,在映射的过程中就会出错;因此,程序也 就不会执行连接服务器操作,自然也就不会抛出“连接超时”错误了。

 

测试2 :无效端口引发的超时错误

 

执行如下命令:

java mynet.SocketTimeout  www.ptpress.com.cn 8888 3000 5000

 运行结果:

连接超时
3075
 
测试3 :读取数据超时错误

执行如下命令: 
java mynet.SocketTimeout www.ptpress.com.cn 80 3000 5000

 运行结果:

读取数据超时!
5008

 

测试4 :将读取数据超时设为0的效果

 

执行如下命令:

java mynet.SocketTimeout www.ptpress.com.cn 80 3000 0

 运行结果:

Connection reset
131519

 

从前3个测试的输出结果不难看 出,每个测试用例都将连接超时和读取数据超时分别设为3000和5000毫秒;而它们的运行结果并不是3000和5000毫秒,而是在所设定的超时时间的 左右摇摆;这主要是因为系统所输出的时间并不都是超时时间;如有一些时间是Java处理错误、向控制台输出信息的时间。另外,由于系统计时的误差,也会影 响到超时时间的准确性。但不管怎样,超时时间总会在所设定的时间周围摇摆。

 

对于测试4,将读取数据超时设为0后,SocketTimeout类经过了2分多钟(131519毫秒)才抛出Connection reset错误。这个抛出错误的时间和服务端程序的超时设置有关;也就是这个错误是由于服务端程序主动将客户端网络连接断开而产生的。

 

 

 

 

分享到:
评论

相关推荐

    基于Python进行TCP套接字编程的基础知识 实验报告

    熟悉基于Python进行UDP套接字编程的基础知识,掌握使用UDP套接字发送和接收数据包,以及设置正确的套接字超时,了解Ping应用程序的基本概念,并理解其在简单判断网络状态,例如计算数据包丢失率等统计数据方面的意义...

    clientSocketToDemo:演示Socket clientServer以了解套接字超时如何工作

    clientSocketToDemo 演示套接字客户端/服务器,了解套接字超时的工作方式

    Python程序设计:即时聊天程序(案例).pptx

    生成socket套接字,连接服务器IP地址与端口 使用utf-8编码发送消息 输出从服务器端接收到的消息 任务 即时聊天程序 设计思路 服务器端编写思路 生成socket套接字,绑定所连接的IP地址与端口 设置连接超时时间 接收从...

    JAVA项目源码之本地监听与远程端口扫描的实现.rar

    对于远程端口扫描,可以创建一个客户端套接字并尝试连接目标主机的各个端口,通过捕获连接成功的异常来确定哪些端口是开放的。 异常处理:在实现过程中,需要注意处理各种可能出现的异常情况,例如网络连接超时、...

    C#以流方式读socket超时设置的实例

    本文实例为大家分享了C#以流方式读socket超时设置的具体代码,供大家参考,具体内容如下 ... // 新建客户端套接字 TcpClient tcpclnt = new TcpClient(); Console.WriteLine(连接.....); // 连接服务器

    套接字:Hoa \ Socket库

    连接支持超时,选项,上下文,加密,远程信息等。此类连接以及抽象连接处理程序允许并排嵌入和“合并”同一进程内的许多连接。 。 安装 使用 ,要将此库包含到依赖项中,您需要 : $ composer require hoa/socket...

    NetCoreServer:超快速和低延迟异步套接字服务器和客户端C#.NET Core库,支持TCP,SSL,UDP,HTTP,HTTPS,WebSocket协议和10K连接问题解决方案

    NetCore服务器 超快速和低延迟异步套接字服务器和客户端C#.NET Core库,支持TCP,SSL,UDP,HTTP,HTTPS,WebSocket协议和解决方案。内容产品特点跨平台(Linux,OSX,Windows) 异步通讯支持的传输协议: , , ,...

    网络编程教程,很好的一本写linux网络编程书,这是我上传的源码

     第十三章 UNIX域套接字和并发服务器的预创建技术  13.1 UNIX域套接字  13.1.1 UNIX域的地址结构  13.1.2 UNIX(套接字使用的示例  13.1.3 传递文件描述符  13.2 并发服务器的预创建技术  ...

    linux网络编程

    15socket编程(十) 用select改进第八章点对点聊天程序 16socket编程(十一) 套接字I/O超时设置方法 用select实现超时 read_timeout函数封装 write_timeout函数封装 accept_timeout函数封装 connect_timeout函数...

    Java CP/IP Socket编程

    1.5 什么是套接字..........9 1.6 练习..........10 第2章基本套接字..........10 2.1 套接字地址..........10 2.2 TCP套接字..........17 2.2.1 TCP客户端..........17 2.2.2 TCP服务器端..........22 2.2.3...

    socket.io-promise

    指定超时后,套接字将自动解除绑定 'pong' 事件处理程序。 例子 示例 1。 var socketio = require ( 'socket.io' ) , socketiosocket = require ( 'socket.io/lib/socket' ) , promise = require ( 'promise' )...

    2018年C++教程网的linux网络编程视频共41集百度云下载链接.rar

    套接字I/O超时设置方法 用select实现超时 read_timeout函数封装 write_timeout函数封装 accept_timeout函数封装 connect_timeout函数封装 17socket编程(十二) select限制 poll 18socket编程(十三) epoll使用 ...

    socket.io.play:具有播放框架2.0的socket.io

    socket.io在服务器广告浏览器之间提供独立于浏览器的双向实时套接字式通信。 从 Socket.IO旨在使每个浏览器和移动设备中的实时应用成为可能,从而模糊了不同传输机制之间的差异。 它是JavaScript中100%的实时免...

    C++教程网《Linux网络编程》视频百度云地址

    套接字I/O超时设置方法 用select实现超时 read_timeout函数封装 write_timeout函数封装 accept_timeout函数封装 connect_timeout函数封装 17socket编程(十二) select限制 poll 18socket编程(十三) ...

    Linux网络编程 视频 教程

    套接字I/O超时设置方法 用select实现超时 read_timeout函数封装 write_timeout函数封装 accept_timeout函数封装 connect_timeout函数封装 17socket编程(十二) select限制 poll 18socket编程(十三) ...

    C++教程网视频:linux网络编程

    套接字I/O超时设置方法 用select实现超时 read_timeout函数封装 write_timeout函数封装 accept_timeout函数封装 connect_timeout函数封装 17socket编程(十二) select限制 poll 18socket编程(十三) ...

    c++教程网的linux网络编程视频下载

    套接字I/O超时设置方法 用select实现超时 read_timeout函数封装 write_timeout函数封装 accept_timeout函数封装 connect_timeout函数封装 17socket编程(十二) select限制 poll 18socket编程(十三) ...

    [免费]2018年C++教程网的linux网络编程视频百度云下载链接.rar

    套接字I/O超时设置方法 用select实现超时 read_timeout函数封装 write_timeout函数封装 accept_timeout函数封装 connect_timeout函数封装 17socket编程(十二) select限制 poll 18socket编程(十三) ...

Global site tag (gtag.js) - Google Analytics