如何设置DatagramSocket.receive()超时,解除阻塞,并不抛出exception

问题描述

正常情况下DatagramSocket.receive()是阻塞到收到包为止,我想设置一个timeout时间,比如一秒,超过一秒就解除阻塞,继续执行下面的语句。不要跟我说setSoTimeout(),会抛出异常的,要求是“继续执行下面的语句”。

解决方案

解决方案二:
setSoTimeoutpublicvoidsetSoTimeout(inttimeout)throwsSocketException启用/禁用带有指定超时值的SO_TIMEOUT,以毫秒为单位。将此选项设为非零的超时值时,对此DatagramSocket调用receive()将只阻塞此时间长度。如果超过超时值,将引发java.net.SocketTimeoutException,虽然DatagramSocket仍旧有效。选项必须在进入阻塞操作前被启用才能生效。超时值必须是>0的数。超时值为0被解释为无穷大超时值。参数:timeout-指定的以毫秒为单位的超时值。抛出:SocketException-如果底层协议出现错误,例如UDP错误。从以下版本开始:JDK1.1另请参见:getSoTimeout()摘自JDKAPI文档.
解决方案三:
使用nio,NioDatagramSocket()非阻塞UDPsocket。或者使用timer计时器,里面可以设置超时时间。
解决方案四:
该回复于2011-03-08 13:34:26被版主删除
解决方案五:
防止异常。加个trycatch就行了,为什么这么担心。
解决方案六:
该回复于2011-03-08 16:19:42被版主删除

时间: 2024-12-03 05:50:27

如何设置DatagramSocket.receive()超时,解除阻塞,并不抛出exception的相关文章

DatagramSocket.receive()方法无响应的解决

之前看网上说用发送命令行的方式获取客户端的mac地址,具体方法不复述了. 其中用到这个receive()方法,朋友在测试的时候发现会无响应,发现是window的系统防火墙开启以后出现的. 无法保证每个用户都是关闭系统防火墙的,所以看了一下api,发现一个解决方法. 直接贴代码看吧 [java] view plaincopyprint? DatagramSocket ds=new DatagramSocket();          DatagramPacket dpk = new Datagra

Windows 和 Linux下使用socket下载网页页面内容(可设置接收/发送超时)的代码

主要难点在于设置recv()与send()的超时时间,具体要注意的事项,请看代码注释部分,下面是代码:   [cpp] view plaincopyprint?   #include <stdio.h>   #include <sys/types.h>   #include <stdlib.h>   #include <string.h>   #include <errno.h>   #include <string.h>     

boost::asio设置同步连接超时

boost::asio设置同步连接超时   CSDN上求助无果,只好用自创的非主流方法了.asio自带的例子里是用deadline_timer的async_wait方法来实现超时的,这种方法需要单独写一个回调函数,不利于把连接和超时封装到单个函数里.传统的Winsock编程可以先把socket设为非阻塞,然后connect,再用select来判断超时,asio也可以这样做,唯一"非主流"的是asio里没有一个类似select的函数,所以得调用原始的Winsock API,也就牺牲了跨平

Jedis 设置key的超时时间

一分钟之内只能发送一次短信, 若用户刷新页面,然后输入原来的手机号,则继续计时 方案:服务器端要记录时间戳 方法名:sMSWaitingTime 功能:返回倒计时剩余时间,单位秒   Java代码   /***       * 倒计时还剩余多长时间       * @param mobile : 手机号       * @return : second       */       public int sMSWaitingTime(String mobile) {           Http

JSP相关:如何设置session的超时时间

问题描述 JSP相关:如何设置session的超时时间 百度了下,说是在web.xml里设置,好像不起作用呢,好像有好几个web.xml文件,是不是我改错了,哪位高手能给个详细的修改方法? 解决方案 一般都是在tomcat目录下conf下的web.xml文件,有的也可以直接在web服务器上设置 解决方案二: http://lhp--2006.iteye.com/blog/1312273http://blog.csdn.net/hu_shengyang/article/details/802143

[20150821]简单编写解除阻塞的脚本.txt

[20150821]简单编写解除阻塞的脚本.txt --主要是在rac环境下查杀阻塞的会话,以前的一些脚本不好用. SELECT    'alter system kill session '''          || blocking_session          || ','          || blocking_session_serial#          || ',@'          || blocking_inst_id          || ''' immedia

ios-使用afnetworking 请求网络超时后,为什么弹出两个提示“请求超时”的alertview?

问题描述 使用afnetworking 请求网络超时后,为什么弹出两个提示"请求超时"的alertview? afnetworking 是在哪调用 alertview 的show方法的? 我在它的代码里没找到,而且为什么会调用两次? 解决方案 afnetworking 应该不会自动弹警告窗的,不过2.0版本我没有用过,你可以搜索一下工程中有使用 UIAlertView 或者 UIAlertController 的地方,然后看看它在哪被调用了 解决方案二: 设置 AFNetworking

Jetty超时过期,checkIdleTimeout方法抛出的

问题描述 Jetty超时过期,checkIdleTimeout方法抛出的 各位:求助~ 我在用jetty+cometd做comet服务,continuation机制已经加入,但是日志中出现了这样的异常 java.util.concurrent.TimeoutException: Idle timeout expired: 40002/40000 ms at org.eclipse.jetty.io.IdleTimeout.checkIdleTimeout(IdleTimeout.java:153

eclipse设置鼠标在错误处悬停时弹出更正提示

问题描述 eclipse设置鼠标在错误处悬停时弹出更正提示 eclipse如何设置鼠标在错误处悬停时弹出更正提示,就是相当于按ctrl+1 的功能,以前是会自动弹出提示的,现在不知道为什么不可以了