用NIO socket读取网络数据,找了好久没找到,NIO下设置读超时的API,只好自己写了一个。
思路是设置守护进程,启动后等待 一定的时间,如果在等待一定的时间后还没被唤醒,则抛出超时异常。
//设置超时守护进程
TimeOutThread t = new TimeOutThread(5000,new TimeoutException("reading timeOut"));
t.start();
count=client.read(protocalNum);
count=client.read(functionNum);
count=client.read(messageLen);
messageLen.rewind();
int length = messageLen.asIntBuffer().get(0);
receivebuffer = ByteBuffer.allocate(length-12);
receivebuffer.clear();
count=client.read(receivebuffer);
t.cancel();
notifyAll();
TimeOutThread.java
private long timeOut ;
private boolean isCanceled = false;
private TimeoutException exception;
public TimeOutThread(long timeOut,TimeoutException exception){
super();
this.timeOut = timeOut;
this.exception = exception;
this.setDaemon(true);
}
public synchronized void cancel(){
this.isCanceled = true;
}
public synchronized void run(){
try{
wait(timeOut);
if(!isCanceled){
throw exception;
}
}
catch(InterruptedException e){
e.printStackTrace();
}
}
TimeOutException.java 就不写了。
分享到:
相关推荐
本文将深入探讨这两种协议的工作原理,并提供它们在Java环境中的实现。 **Xmodem协议** Xmodem是最简单的文件传输协议之一,每一步传输128字节的数据块。它通过校验和机制来检测数据传输中的错误。Xmodem协议分为两...
在Java的Socket编程中,我们可以通过设置Socket对象的`setSoTimeout(int timeout)`方法来指定一个超时时间,超过这个时间如果没有接收到数据,就会抛出这个异常。 在描述中提到的博文链接指向了一个具体的博客文章...
RESTEasy本身并不直接提供设置请求超时的API,但我们可以利用Java的HttpURLConnection或者第三方库,如Apache HttpClient,来实现这个功能。例如,以下代码展示了使用HttpURLConnection设置连接超时和读取超时: ``...
总结来说,实现一个Java版日历,主要涉及`java.util.Calendar`类或`java.time`包中的类,通过获取和设置日期属性,以及循环遍历日期来显示日历。同时,考虑用户交互和可能的扩展功能,可以使日历应用更加实用和完整...
在Java中,实现串口通信通常会用到第三方库,如RXTX库或JSerialComm库。这些库为Java提供了访问串行端口的API,使得开发者可以方便地读写串口数据。RXTX库是一个开源的Java库,它提供了与操作系统交互的底层接口,...
this.time = System.nanoTime() + timeout; this.task = t; this.n = atomic.getAndIncrement(); } / * 返回与此对象相关的剩余延迟时间,以给定的时间单位表示 */ @Override public long getDelay...
在Java中,我们可以使用`java.util.Timer`类、`java.util.TimerTask`类以及Java 8引入的`java.time`包中的接口来实现时间监听功能。下面将详细介绍这些方法。 1. **使用Timer和TimerTask** `java.util.Timer`类...
添加了一个新方法connect(SocketFactory fact, String host, int port, int timeout) ,以允许用户更好地控制套接字,尤其是加密。 connectTLS() API方法已删除。 大多数重载的connect()方法都已删除。 在下载
在Java中,我们可以使用开源库如`com.github.fge:java-timezone-tools`来实现SNTP功能: ```java import com.github.fge.ntp.NTPClient; import com.github.fge.ntp.TimeResponse; TimeResponse response = new ...
标题提到的"java实现的日期操作类"通常指的是使用这些类来完成特定的日期计算任务,如获取星期几或计算未来的日期。 `java.util.Date`是Java早期用来表示日期和时间的类,但它的API设计并不理想,易用性较差。因此...
通过上述分析可以看出,`java.util.TimeZone`提供了丰富的时区信息,这对于实现跨时区的数据处理和时钟同步等功能至关重要。开发者可以根据实际需求选择合适的时区标识符,并利用Java提供的API进行时区相关的操作,...
4. **并发编程与线程**:在多线程环境中,可以使用Java的`Thread.sleep()`来模拟超时,或者使用`Future.get(long timeout, TimeUnit unit)`方法获取异步任务的结果,如果超时则抛出`TimeoutException`。 5. **...
Java 控制台实现课程表是一个基础的编程项目,它涵盖了数据结构、IO 流和对象序列化的知识。在这个项目中,我们将使用 Java 语言在控制台上创建一个简单的课程表系统,用户可以通过输入命令来实现对课程表的增、删、...
例如,如果`timeOut`为30,则转换后表示缓存将在30秒后失效。 使用Java Map实现缓存,我们需要考虑以下几个关键点: 1. **缓存初始化**:创建Map实例,可以是HashMap、ConcurrentHashMap或其他适合并发访问的实现...
import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; public class MessageBoard { private String filePath = "messageboard.txt"; public void saveMessage(Message message...
本文将详细探讨如何在Java中实现每天定点执行任务,主要涉及的核心知识点包括Java的定时框架如ScheduledExecutorService和Quartz Scheduler,以及如何配置任务定时器。 首先,`ScheduledExecutorService` 是Java...
本文将详细解析如何在Linux环境中利用Java语言实现`ping`和`traceroute`的功能,并结合C#的相关知识进行探讨。 首先,`ping`是一个简单但实用的网络工具,用于测试主机之间是否可达以及网络的延迟时间。在Linux中,...
本篇文章将深入探讨如何通过Java程序实现显示当前时间的功能。 首先,Java标准库中的`java.util.Date`类是获取当前时间的基本方法。你可以创建一个Date对象,它会自动初始化为当前时间。例如: ```java import ...
public HttpReader(URL u, int connect_timeout, int read_timeout) { ... } // 获取内容长度 public static long getContentLength() { ... } // 读取数据 public int read(byte[] b, int off, int len) ...
key 是缓存的唯一标识符,value 是缓存的实际数据,timeOut 是缓存的超时时间,expired 是一个布尔值,表示缓存是否已经失效。 CacheManager 类 CacheManager 类是缓存管理器,负责管理缓存的创建、获取、删除和...