`
heartsong
  • 浏览: 11510 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

求教Socket.accept的阻塞问题

阅读更多
我在程序里实现了一个线程池,这个线程池构造时创建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();
    }
}


现在的问题是:
1. 当ReceiveTask接收到"finish"之后,执行了socket.Close(),然后在Debug时,发现此socket.isClosed()仍然是true!?(我怀疑监听在socket.accept()时,再次将这个socket开了?)
2. 上面的代码没有办法执行到pool.addTask(new AnotherTask());,因为也是socket.accept()那里被阻塞了,我应该怎么办?

这个问题今天闹了一天了,search了一堆都没有相关的解决方法,发到这里,希望大家能吧。谢谢谢谢~~~
分享到:
评论
4 楼 zkgale 2007-08-27  
我最近也遇到了类示的问题帮你顶一下
3 楼 heartsong 2007-08-13  
cary 写道
   对你的描述不是太清楚,ACCPET()阻塞,下面的方法执行也没意义,如果想执行,可以设置超时来完成阻塞。
     孙卫琴出了本JAVA网络编程,介绍了不少SOCKET和NIO的通信问题,应该可以解决你的问题,有篇例子也是介绍SOCKET利用线程POOL。


如何设置超时?
2 楼 cary 2007-08-12  
   对你的描述不是太清楚,ACCPET()阻塞,下面的方法执行也没意义,如果想执行,可以设置超时来完成阻塞。
     孙卫琴出了本JAVA网络编程,介绍了不少SOCKET和NIO的通信问题,应该可以解决你的问题,有篇例子也是介绍SOCKET利用线程POOL。
1 楼 heartsong 2007-08-10  
现在我通过另外一种方法暂时是实现了我所要的效果,但我觉得还是有问题

就是在上面那个ReceiveTask里直接调用pool.addTask的方法,往线程池里放入一个Task。
else{
    System.out.println(temp);
    socket.close();
    System.out.println(socket.isClosed());
    pool.addTask(new AnalyzeTask());
}

相关推荐

    公式求教共4页.pdf.zip

    很抱歉,根据您提供的信息,"公式求教共4页.pdf.zip"似乎是一个包含四页公式教学内容的PDF文档的压缩文件,而"赚钱项目"可能是压缩包中的另一个文件或者是一个误输入。然而,没有实际的文件内容,我无法提供具体的IT...

    extjs文件浏览框问题求教

    标题中的“extjs文件浏览框问题求教”表明这是一个关于ExtJS框架中文件选择或浏览功能的编程问题。ExtJS是一个流行的JavaScript库,用于构建富客户端应用程序,它提供了丰富的组件库,包括文件浏览框(FileBrowser)...

    S函数最大功率跟踪采用的是三次插值方法求教指出错误-mppt.mdl

    S函数最大功率跟踪采用的是三次插值方法求教指出错误-mppt.mdl 这是仿真模型和错误原因图 附件: sfun_mppt.m S函数程序   mppt.mdl 插值仿真模型 错误.jpg ...

    求教C++等等一系列的问题

    #### 标题解析:“求教C++等等一系列的问题” 这一标题表明了提问者对于C++及可能的其他编程技术存在疑问。C++是一种广泛应用于系统软件开发、游戏开发等多个领域的高级编程语言。对于初学者来说,掌握C++不仅能够...

    求教一道关于求解最优化问题的编程问题~

    最优化问题在计算机科学和工程领域中广泛应用,例如在机器学习、数据分析、运筹学等领域。这道编程问题要求我们解决一个带有约束条件的最优化问题,采用的是拉格朗日乘子法和牛顿法相结合的方法。 首先,我们要理解...

    卡尔曼滤波求教-chap1_27.mdl

    卡尔曼滤波求教-chap1_27.mdl 在看关于卡尔曼滤波的东西,下面是在教程上看到的一个实例,仿真结果也没有问题,但是输出的结果都是关于变量Y(n)的,我想问一下有没有办法可以显示出X(n)的变化过程,谢谢

    求教电力系统仿真-039THDAT.DAT

    求教电力系统仿真-039THDAT.DAT 小弟要做毕业设计,才对matlab入门。现在要用matlab仿真一个39-bus的电力系统在一个故障(如其中一条母线三相短路)清除后的一小段时间,各种发电机的功角特性图,请大神告知详细...

    卡尔曼滤波求教-chap1_27f.m

    卡尔曼滤波求教-chap1_27f.m 在看关于卡尔曼滤波的东西,下面是在教程上看到的一个实例,仿真结果也没有问题,但是输出的结果都是关于变量Y(n)的,我想问一下有没有办法可以显示出X(n)的变化过程,谢谢

    求教模糊Ts辨识里对于系统结构辨识的确定和归一化数据-一些文献.rar

    所以来求教,关于非线性系统的T-S模糊辨识,广义输入向量的选择问题,模型阶数确定问题,能不能不用试验的方法,我的是四入四出系统。。。,而且辨识完成后,还要做预测控制。而且关于,数据是否需要归一化处理的问题...

    求教一个asp调试的问题

    asp调试的问题

    求教现在的主流3D网络游戏开发都使用哪些技术.doc

    求教现在的主流3D网络游戏开发都使用哪些技术.doc

    socketManage

    Socket管理在IT行业中是网络编程的一个重要组成部分,主要用于实现客户端和服务器之间的通信。"socketManage"这个主题聚焦于一个简单的Socket实例代码,旨在帮助我们理解如何在实际项目中运用Socket进行数据传输。在...

    卡尔曼滤波求教-chap1_27plot.m

    卡尔曼滤波求教-chap1_27plot.m 在看关于卡尔曼滤波的东西,下面是在教程上看到的一个实例,仿真结果也没有问题,但是输出的结果都是关于变量Y(n)的,我想问一下有没有办法可以显示出X(n)的变化过程,谢谢

    S函数最大功率跟踪采用的是三次插值方法求教指出错误-sfun_mppt.m

    S函数最大功率跟踪采用的是三次插值方法求教指出错误-sfun_mppt.m 这是仿真模型和错误原因图 附件: sfun_mppt.m S函数程序   mppt.mdl 插值仿真模型 错误....

    我求教高手的VB毕业设计

    【标题】:“我求教高手的VB毕业设计” 在VB(Visual Basic)中进行数据库操作是常见的编程任务,尤其是在毕业设计项目中。VB提供了一种简单的方式来与数据库交互,特别是像Access这样的桌面数据库管理系统。当你在...

Global site tag (gtag.js) - Google Analytics