导读:
Java 1.4在Java API加入了非阻塞I/O(non-blocking I/O),不过Java 1.3和更早的版本都不支持这样的特性。然而,你可以用java.net.Socket类的超时属性来获得一些类似于非阻塞I/O的功能。
要使用超时属性,首先你要创建一个socket,然后设置你期望的超时时间。setSoTimeout方法有一个参数,这个int型参数指定了socket在抛出一个违例前要等待的超时时间,单位是毫秒,像下面的例子:
Socket s = new Socket(server, port);
System.out.println(s.getSoTimeout());
s.setSoTimeout(5000);
InputStream in = s.getInputStream();
现在我们尝试从这个socket中读数据。如果超过了指定的时间还读不到任何数据,程序将抛出一个java.io.InterruptedIOException。你可以捕获这一违例并决定是否尝试进行另一次读取操作:
try {
while ( (bytesRead = in.read(buffer)) != -1 ) {
// do something with the data
System.out.println
(new String(buffer, 0, bytesRead));
}
}
catch (InterruptedIOException e) {
System.err.print("timeout on read");
// 决定是否继续读取
}
在早于1.4的Java版本中,当从socket中读取数据时,你的程序不得不阻塞起来,但并不意味着你的程序这时什么也不能做。
Java 1.4在Java API加入了非阻塞I/O(non-blocking I/O),不过Java 1.3和更早的版本都不支持这样的特性。然而,你可以用java.net.Socket类的超时属性来获得一些类似于非阻塞I/O的功能。 要使用超时属性,首先你要创建一个socket,然后设置你期望的超时时间。setSoTimeout方法有一个参数,这个int型参数指定了socket在抛出一个违例前要等待的超时时间,单位是毫秒,像下面的例子: Socket s = new Socket(server, port); System.out.println(s.getSoTimeout()); s.setSoTimeout(5000); InputStream in = s.getInputStream(); 现在我们尝试从这个socket中读数据。如果超过了指定的时间还读不到任何数据,程序将抛出一个java.io.InterruptedIOException。你可以捕获这一违例并决定是否尝试进行另一次读取操作: try { while ( (bytesRead = in.read(buffer)) != -1 ) { // do something with the data System.out.println (new String(buffer, 0, bytesRead)); }} catch (InterruptedIOException e) { System.err.print("timeout on read"); // 决定是否继续读取} 在早于1.4的Java版本中,当从socket中读取数据时,你的程序不得不阻塞起来,但并不意味着你的程序这时什么也不能做。
本文转自
http://www.cn-java.com/www1/?action-viewnews-itemid-2506
分享到:
相关推荐
在这个例子中,`DataReceiver`类实现了`Callable<String>`接口,负责从Socket读取数据并返回。`main`方法创建了一个`ExecutorService`,然后提交一个`DataReceiver`任务。`future.get()`方法会等待任务完成,如果...
Java中的Socket类是进行网络通信的核心组件,它主要用于实现客户端与服务器之间的TCP连接,从而进行双向数据传输。本文将深入探讨如何使用Socket类接收和发送数据。 首先,我们需要理解Socket类的基本概念。Socket...
在标题"socket非阻塞超时设置"中,我们关注的是如何配置Socket使其在等待数据时不会永久阻塞,并且能够设定一个超时时间。这种方式适用于那些需要快速响应或者避免程序因长时间等待而挂起的场景。 非阻塞模式是...
在Windows环境下进行网络编程时,有时需要对socket连接进行超时控制,特别是在客户端与服务器通信的过程中,如果连接请求长时间没有响应,程序可能会陷入无休止的等待状态,从而导致资源浪费甚至程序卡死。...
Linux 下 Socket 连接超时的一种实现方法 在 Linux 环境下,设置套接字(Socket)连接超时是一件非常重要的事情。下面我们将详细介绍 Linux 下 Socket 连接超时的一种实现方法。 首先,需要创建套接字,并将其设置...
在这个例子中,我们首先设置Socket连接的超时时间为30秒,然后在发送和接收数据时,分别设置3秒的读写超时。每次读写操作后,都会检查`stream_get_meta_data()`返回的`'timed_out'`值,如果超时,则关闭Socket连接并...
`InputStream`的`read`方法通常用于从Socket中读取字节数据。例如,当我们创建一个Socket连接到服务器后,我们可以获取到一个`InputStream`实例,然后通过调用`read`方法来接收服务器发送的数据。当`read`方法被调用...
读取数据时,从输入流中读取字节流并解析为需要的格式。在处理大量数据或实时数据时,可能需要考虑缓冲区管理、数据分包和重组等问题。 以下是Socket长连接、心跳包和数据发送读取的关键知识点: 1. **TCP连接**:...
在读取Socket数据时,如果没有数据可读,read()方法会阻塞等待,直到有数据到达或出现异常。为了防止因长时间等待而阻塞,可以设置Socket的读超时。通过Socket的setSoTimeout(int timeout)方法可以设置一个超时值,...
当数据从网络到达时,TCP协议栈会将数据放入接收缓冲区,而应用程序通过InputStream的read方法读取数据。同样,应用程序写入OutputStream的数据会被复制到发送缓冲区,等待TCP协议栈发送。需要注意的是,即使调用了`...
我们可以使用 read() 方法来从 Socket 服务器读取数据。read() 方法可以从服务器读取数据,并将其存储在 ByteArray 对象中。 4. 同 Socket 服务器进行握手 在与 Socket 服务器建立连接后,我们需要同服务器进行...
在Android开发中,Socket通信是实现设备间网络通信的重要手段,尤其在移动应用与服务器进行实时数据交换时不可或缺。本文将深入探讨如何在Android平台上利用Socket进行数据的发送与接收,以及服务器返回数据的处理。...
在Android应用中使用Socket进行网络通信时,需要在AndroidManifest.xml文件中添加Internet权限: ```xml ``` 此外,考虑到网络操作通常在主线程之外执行以避免阻塞UI,可以使用AsyncTask或其他异步机制来处理...
下面是一个简单的示例,演示如何在客户端(`Socket_client`)和服务器端(`Socket_server`)中使用`setsockopt`设置超时: **服务器端(`Socket_server`):** ```c #include <sys/socket.h> #include #include ...
Java的Socket API提供了一个InputStream,我们可以从这个输入流中读取接收到的数据。在chunked模式下,数据被分为多个块,每个块都有一个十六进制的大小前缀,后面跟着块的实际内容,最后是一块大小为0的块表示数据...
Socket在计算机网络中扮演着桥梁的角色,连接了两个网络进程进行数据传输。Java Socket类(java.net.Socket)代表客户端的连接,ServerSocket类(java.net.ServerSocket)则用于服务器端监听和接受连接请求。它们是...
`Receive`方法用于从Socket接收数据,这里设置了超时时间为5秒,如果在这段时间内没有接收到数据,函数会返回空字符串。接收数据时,使用了`Encoding.Default`进行字节与字符串之间的转换。 `Send`方法则是客户端...
- 接收数据时,可以使用`Socket.ReceiveAsync`或`Socket.BeginReceive`,并在回调函数中检查是否超过预设的超时时间。 4. **自定义Socket类**: - 自定义Socket类可能包含额外的属性和方法来设置和管理超时值,如...
当接收到客户端消息时,我们可以在ChannelInboundHandler的channelRead方法中处理数据,通过ChannelHandlerContext.writeAndFlush()将响应数据写回客户端。 2. **心跳检测**: 心跳检测是确保网络连接活性的重要...