浏览 8879 次
锁定老帖子 主题:求教Socket.accept的阻塞问题
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-08-10
然后,我的监听器执行 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(); } } 现在的问题是: 1. 当ReceiveTask接收到"finish"之后,执行了socket.Close(),然后在Debug时,发现此socket.isClosed()仍然是true!?(我怀疑监听在socket.accept()时,再次将这个socket开了?) 2. 上面的代码没有办法执行到pool.addTask(new AnotherTask());,因为也是socket.accept()那里被阻塞了,我应该怎么办? 这个问题今天闹了一天了,search了一堆都没有相关的解决方法,发到这里,希望大家能吧。谢谢谢谢~~~ 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-08-10
现在我通过另外一种方法暂时是实现了我所要的效果,但我觉得还是有问题
就是在上面那个ReceiveTask里直接调用pool.addTask的方法,往线程池里放入一个Task。 else{ System.out.println(temp); socket.close(); System.out.println(socket.isClosed()); pool.addTask(new AnalyzeTask()); } |
|
返回顶楼 | |
发表时间:2007-08-12
对你的描述不是太清楚,ACCPET()阻塞,下面的方法执行也没意义,如果想执行,可以设置超时来完成阻塞。
孙卫琴出了本JAVA网络编程,介绍了不少SOCKET和NIO的通信问题,应该可以解决你的问题,有篇例子也是介绍SOCKET利用线程POOL。 |
|
返回顶楼 | |
发表时间:2007-08-13
cary 写道 对你的描述不是太清楚,ACCPET()阻塞,下面的方法执行也没意义,如果想执行,可以设置超时来完成阻塞。
孙卫琴出了本JAVA网络编程,介绍了不少SOCKET和NIO的通信问题,应该可以解决你的问题,有篇例子也是介绍SOCKET利用线程POOL。 如何设置超时? |
|
返回顶楼 | |