`
jiaguwen123
  • 浏览: 413885 次
  • 性别: Icon_minigender_2
  • 来自: 深圳
社区版块
存档分类
最新评论

客户端套接字(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错误。这个抛出错误的时间和服务端程序的超时设置有关;也就是这个错误是由于服务端程序主动将客户端网络连接断开而产生的。
分享到:
评论

相关推荐

    套接字socket编程文档

    在IT领域,套接字(Socket)编程是网络通信的核心技术之一,它为应用程序提供了低级别的、进程间的通信机制。套接字允许不同计算机上的进程相互通信,无论是同在一个局域网还是跨越互联网。本篇文章将深入探讨套接字...

    socket同步套接字服务器客户端

    总的来说,Socket同步套接字服务器客户端程序涉及网络编程的基本原理和实践,包括TCP/IP协议、套接字API的使用、多线程(或多进程)编程以及错误处理。通过学习和实践这样的项目,开发者可以深入理解网络通信的本质...

    socket 套接字 Java 套接字 编程

    Java套接字编程是网络通信的核心技术之一,主要用于实现客户端与服务器之间的数据交换。本文将深入探讨Java中的Socket编程,包括基本概念、工作原理、创建和使用Socket的过程,以及常见问题和解决策略。 1. 基本...

    流式套接字实现简单的客户端服务端通信过程

    - Java的`java.net.Socket`和`ServerSocket`类分别代表客户端和服务器端的套接字。 4. **错误处理和优化** - 网络通信中,错误处理非常重要,如网络中断、超时等,需要通过异常捕获或者返回值检查来处理。 - ...

    Socket套接字—Java套接字编程

    7. **套接字选项**:Socket类提供了setSoTimeout(int timeout)方法设置超时时间,防止因客户端无响应导致服务器端阻塞。此外,还有其他选项如禁用Nagle算法(setTcpNoDelay(true)),设置缓冲区大小等。 8. **实践...

    套接字通信socket

    1. **初始化**:首先,通过`socket()`函数创建套接字句柄,指定协议族和套接字类型。 2. **绑定**:使用`bind()`函数将套接字与特定的IP地址和端口号关联,使得其他机器可以通过这个地址和端口找到并连接到该服务器...

    socket套接字通信

    1. **创建套接字**:客户端程序首先需要创建一个套接字,这是通过调用`socket()`函数完成的,该函数会返回一个套接字描述符,用于后续操作。 2. **服务器端初始化**:服务器端也需要创建套接字,然后绑定到特定的IP...

    完整的套接字数据库客户端

    例如,使用Python的socket库可以创建一个简单的TCP套接字客户端,连接到MySQL服务器,发送SQL查询,并接收返回的结果。 下面是一些可能包含在"完整的套接字数据库客户端"中的关键知识点: 1. **TCP/IP协议栈**:...

    C语言利用socket套接字实现客户端和服务器端TCP通信实例

    本篇将详细探讨如何利用C语言的socket套接字实现客户端和服务器端的TCP通信。 TCP(Transmission Control Protocol)是一种面向连接的、可靠的传输协议,它通过三次握手建立连接,并在数据传输过程中进行确认和重传...

    socket客户端,可连接多个服务器

    Socket,也被称为套接字,是操作系统提供的一种通信接口,允许应用程序通过网络进行数据传输。在TCP/IP协议栈中,Socket分为两种类型:基于流的TCP Socket和基于数据报的UDP Socket。在这个案例中,由于提到了“重连...

    套接字socket编程文档.rar_MultiGet-1.1.4_linux_linux socket_linux 编程_soc

    "套接字socket编程文档"可能包含了详细的代码示例,从创建套接字到实现完整的客户端-服务器通信流程,读者可以通过这些例子加深对Socket编程的理解。 七、MultiGet-1.1.4项目介绍 MultiGet是一个多线程下载工具,它...

    c++MFC基于TCP异步套接字socket局域网源码

    综上所述,"c++ MFC基于TCP异步套接字socket局域网源码"是一个很好的学习示例,它涵盖了网络编程中的许多核心概念和技术,包括TCP连接、异步事件处理、多路复用以及客户端-服务器通信模型。通过分析和理解这个源码,...

    同步套接字服务器客户端程序

    同步套接字(Synchronous Socket)是网络编程中一种基础且重要的通信机制,它基于TCP/IP协议栈,用于实现两台计算机之间的数据传输。在这个场景中,我们讨论的是一个已经测试成功的服务器和客户端程序,这通常涉及到...

    服务端向多客户端通信_C语言_sockettcp_socket_tcp_linux_

    总之,利用C语言的TCP Socket在Linux下实现服务端向多客户端通信,需要理解套接字API的使用,掌握TCP连接的过程,以及如何在服务端处理并发连接。这个过程涉及的代码示例可以在提供的"服务端向多客户端通信"文件中...

    C++ TCP客户端非阻塞连接超时测试源码

    程序可能使用了套接字API(如`socket()`, `fcntl()`, `connect()`, `select()`等)来创建、配置和管理套接字,以及处理连接请求。 在实现非阻塞连接超时时,开发者通常会使用以下步骤: 1. 创建套接字:使用`...

    利用windows中的套接字机制来设计的客户端/服务器通信

    在IT领域,网络通信是不可或缺的一部分,而套接字(Socket)则是实现网络通信的基础工具。Windows操作系统提供了丰富的API函数,使得开发者可以利用套接字机制构建客户端/服务器(Client/Server)通信模型。本文将...

    TCP网口套接字聊天程序

    在TCP聊天程序中,服务器和客户端都会创建套接字,服务器套接字用于监听和接受客户端的连接请求,客户端套接字则用于向服务器发起连接。 3. **服务器端**:服务器端首先创建一个监听套接字,绑定到特定的IP地址和...

    套接字数据库客户端

    在IT领域,套接字(Socket)是一种网络通信协议,用于实现不同计算机之间的数据传输。在本场景中,"套接字数据库客户端"是指利用套接字技术与数据库服务器进行交互的应用程序。这类客户端允许用户或系统通过网络连接...

    socket 流式套接字

    流式套接字是Socket编程中的基础概念,主要用于网络数据通信。它基于TCP(传输控制协议),提供了一种可靠的、面向连接的字节流服务。TCP确保数据在发送方和接收方之间完整无误地传输,即使在网络环境不稳定的情况下...

    socket客户端

    总结来说,这个"socket客户端"代码使用C#实现了基本的TCP套接字连接,可以作为参考来构建C/S架构的即时通讯系统。尽管代码可能还有待优化,但已具备了基本的功能,可以在实际项目中根据需求进行扩展和改进。

Global site tag (gtag.js) - Google Analytics