开发者社区> 问答> 正文

java 关于sock通信问题 serverSocket.accept()阻塞

大神们怎么能让 serverSocket.accept()等待一段时间如果没人连接就退出啊

public List socketAccept(ServerSocket server){
try {
long time=System.currentTimeMillis();
while (System.currentTimeMillis()-time<2000) {//10毫秒后退出
Socket socket = server.accept();
sockets.add(socket);//得到socket连接数
}
} catch (IOException e) {
e.printStackTrace();
try {
server.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
return sockets;
}

如果没有连接Socket socket = server.accept();会一直在这等着,有什么办法跳出循环吗

展开
收起
蛮大人123 2016-03-19 14:08:22 7232 0
1 条回答
写回答
取消 提交回答
  • 我说我不帅他们就打我,还说我虚伪

    在程序里实现了一个线程池,这个线程池构造时创建WorkThread(extends Thread),WorkThread负责从线程池里取Task,然后执行这个Task。
    然后,我的监听器执行
    代码

    ServerSocket sc;   
    sc = new ServerSocket(5600);   
    while (true) {   
        //MDPBeanFactory.isReceiveFinished是获取一个开关变量,当receive接收完成时这个值返回true   
        if(MDPBeanFactory.isReceiveFinished()){   
            //pool是一个线程池管理对象,addTask是往线程池里增加一个线程   
            pool.addTask(new AnotherTask());   
        }else{   
            Socket socket = null;   
            socket = sc.accept();   
            pool.addTask(new ReceiveTask(socket));   
        }   
    }  

    当有Client通过Socket向Server发送数据时,监听器就会创建一个新ReceiveTask(implements Task)对象,并放到线程池里,WorkThread就会执行这个Task。Client发送完成之后,发送一个标识"finish",ReceiveTask收到后,会将Socket.Close();
    ReceiveTask的执行代码:

    代码

    while (!socket.isClosed()) {                   
        ObjectInputStream inStream = null;   
        try{   
            inStream = new ObjectInputStream(socket.getInputStream());   
            String temp = (String)inStream.readObject();   
            if (!temp.equals("finish")   
                System.out.println(temp);      
            else{   
                System.out.println(temp);   
                socket.close();   
                System.out.println(socket.isClosed());   
                //给一个状态开关设置为True,打算在监听器那里监听到为true就创建另一个Task   
                MDPBeanFactory.setReceiveFinished(true);   
            }   
        }catch(IOException e){   
            socket.close();   
        }   
    }  
    2019-07-17 19:08:05
    赞同 展开评论 打赏
问答分类:
问答标签:
问答地址:
相关产品:
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
JAVA开发手册1.5.0 立即下载