关于Socket中超时的问题

右领军大都督 2011-05-11 09:43:36
我现在需要一个这样的实现:
1.有一个独立的线程负责监听inputStream,程序会阻塞在read方法上,有数据时读取,并处理,然后再次阻塞,片段如下:
while(true){
byte[] bs=new byte[512];
if(inputStream.read(bs)>0){
//处理
}
}
2.另有主线程提供send方法,可随时被调用,并由上述1中的子线程监听到响应并处理,代码段如下:
public void send(String msg){
outputStream.write(msg.getBytes());
}
3.希望对send之后的响应有一个超时机制,就是主线程调用send之后,如果xx秒后子线程没有接到响应,就超时处理,打断read方法的阻塞,跳出该循环,子线程结束。

本来是在子线程的while处用一个标志位进行控制的,可其实read方法还是阻塞在那,根本执行不到下一次循环,所以改标志位没用,我是希望有个设计方法能立即终止read的阻塞,还请大大们指教
...全文
177 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaopengzi 2011-08-11
  • 打赏
  • 举报
回复
也可以把超时那块放在while(flag)里面
xiaopengzi 2011-08-11
  • 打赏
  • 举报
回复
pubic void send(String msg){

byte[] bs = new byte[512];
boolean flag = true;
outputStream.Write(msg.getBytes());
long timeout = 2000;
targetTime = system.currenttimemillis()+timeout;
do{
if(system.currenttimemillis()>targettime){
flag = false;
break;
}
try{
Thread().sleep(10);
}
catch(InterruptedException e){
}

}
while(inputstream.read(bs)==-1)

while(flag){
if(inputstream.read(bs)>0){
//处理;
}
}
}


我对楼主的意思的理解是这样的,不知道对不对,可以参考一下
snepajj 2011-08-10
  • 打赏
  • 举报
回复

ServerSocket ss = new ServerSocket();
ss.setSoTimeout(30000);
这个可以设置超时
meran 2011-08-10
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 ticmy 的回复:]

可以使用线程的interrupt,会让一切blocking的方法抛出异常而返回
[/Quote]
传统 socket 获得的 io流是不可中断阻塞 , 可以用 socketChannel
Ade子夜 2011-08-10
  • 打赏
  • 举报
回复
ding!!1
kcling 2011-08-10
  • 打赏
  • 举报
回复
我也遇到了这方面的问题,请高手解答!
龙四 2011-05-12
  • 打赏
  • 举报
回复
可以使用线程的interrupt,会让一切blocking的方法抛出异常而返回
步入狼途 2011-05-12
  • 打赏
  • 举报
回复
读取之后就把inputStream 关闭如何?这样就不阻塞了吧…………

其实,楼主说的我没大明白……一起期待高手出现吧……
基于vxworks 下的并发服务器访问 #include "ClientList.h" #define SA_LEN sizeof(struct sockaddr_in) #define MYPORT 5000 // 服务端口号 #define BACKLOG 50 //最大连接数 #define BUF_SIZE 200 //缓冲区大小 #define OUT_TIME_SEC 3 //连接超时(在该时间内无数据收发)时间设置(秒/单位) #define CHECK_DELAY 1 //检查超时连接的时间间隔(秒/单位) #define FILE_STATE_OUTTIME 10 //文件状态超时(select()超时 秒/单位) list_client *client_list; //客户端链表 pthread_attr_t pAttr; //线程属性 /********************************************************* * * 功能描述: 检查链表超时的客户连接,并删除客户链表连接超时的节点 * * 参数: 无 * * 返回值: NULL * * 作者:胡士超 * * 完成日期: 2012.08.09 * * *******************************************************/ void * conn_Timeout(void * data) { time_t cur_time; //当前时间 client_node *temp,*next_node,*tmp_node; while (TRUE) { //获取用于刷新读描述符集的客户节点 tmp_node = client_list->client_head.prev; //获取当前时间 time(&cur;_time); //加锁 pthread_mutex_lock(&client;_list->mutex); //遍历客户链表检查超时的客户节点并将其从链表移除 temp = client_list->client_head.next; while (temp != &client;_list ->client_head) { next_node = temp->next; //若该 socket fd是用于刷新的描述符则不移除 if(temp->client_sock_fd == tmp_node->client_sock_fd) { temp = next_node; continue; } //判断是否超时 if( (cur_time - temp->time) > OUT_TIME_SEC) { printf("delete a node fd is %d out time is %d\n",temp->client_sock_fd,(cur_time - temp->time)); //从链表移除 deleteNode_by_sockfd(client_list, temp->client_sock_fd); //刷新读描述符集 if (write(client_list->refresh_fd, "refresh", 7) == ERROR) { perror("client : write failed."); } } temp = next_node; } //解除锁 pthread_mutex_unlock(&client;_list->mutex); //超时检查的间隔 sleep(CHECK_DELAY); } return NULL; } /************************************************** * * 功能描述: 线程函数,创建一个单独线程用来接收客户端发来的请求,并将请求插入客户端链表 * * 参数: 用于监听的socket描述符指针 lsnfd * * 返回值: NULL * * 作者: 胡士超 * * 完成日期: 2012.08.09 * * ***********************

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧