Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 612|回复: 0

Q&A: 【求高手】socket通讯服务端用线程池出问题,希望朋

[复制链接]

该用户从未签到

发表于 2011-10-22 17:49:31 | 显示全部楼层 |阅读模式
手机端的代码我已经写了,也找别人帮忙测试过,没问题,但是我的服务端用了线程池来做,因为怕并发量大的情况,下面直接贴服务端代码了:   第一个类:MessageListener
    // 保留线程池的大小

int corePoolSize = 1000;

int maxPoolSize = 2000;
               BlockingQueue queue = new LinkedBlockingDeque();

ThreadPoolExecutor executor = new ThreadPoolExecutor(corePoolSize,
                maxPoolSize, 1, TimeUnit.DAYS, queue);



try {

// 监听9420端口

serverSocket = new ServerSocket(9420);


while (true) {

// 监听消息

Socket socket = serverSocket.accept();

System.out.println("进来了...");

while (true) {
                                        //启动一个任务

executor .execute(new MessageOptThread(socket));

break;

}
下面是第二个类:MessageOptThread
public class MessageOptThread implements Runnable {


private static String encoding = "UTF-8";


private Socket socket = null;


/**

* 构造有socket对象的对象

*

* @param socket

*/

public MessageOptThread(Socket socket) {

// TODO Auto-generated constructor stub

this.socket = socket;

try {

// 保持长连接

socket.setKeepAlive(true);

} catch (Exception e) {

// TODO: handle exception

}

run();

}


public void run() {

// TODO Auto-generated method stub

try {

    System.out.println("发送消息的地址" + socket.getInetAddress() + ":" + socket.getPort());

BufferedReader reader = new BufferedReader(

new InputStreamReader(socket.getInputStream(), encoding));

String info = reader.readLine();


System.out.println(info);

} catch (Exception e) {

e.printStackTrace();

}

}



}



现在的情况是,如果在第二个类里面的try的代码加上while(true)去包含整个try的代码,就可以接受到一个手机,多次发送到服务端的消息,但是其他手机就不能发送消息到服务端了,因为while这个死循环会阻塞着,不能跳出去,访问第一个类的Socket socket = serverSocket.accept();  代码。如果这个try里面不加while这个死循环,那么手机只能发一次消息,第二次就不能发了,但是其他手机可以发消息给服务端,但是也只能访问一次,第二次就不能发了,因为我调试发现   如果不加循环,那么第一次执行到输出的时候,又会再执行一次 String info = reader.readLine();到这一句,去阻塞着,现在不知道怎么解决这个问题?只要能监听多个手机的发送消息就可以了,求解啊.....
回复

使用道具 举报

该用户从未签到

发表于 2011-10-22 17:49:36 | 显示全部楼层

Re:Q

启动线程用start吧,可以给每个线程取个不同的名字试试。
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2011-10-22 17:49:46 | 显示全部楼层

Re:Q

楼上的哥们是刷广告的吧?取名字也行?
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2011-10-22 17:49:54 | 显示全部楼层

Re:Q

1.建议以后代码贴的规范一点,乱七八糟的

2.你的问题在run(); 这里
既然你的MessageOptThread已经实现线程接口了,那就应该创建线程而不是去调用run方法
改成
new Thread(this).start();

3.run方法中可以写while死循环,但是最好把catch处理一下,如果是socket已经中断,主动回收该线程或者break一下比较合适
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

GMT+8, 2025-1-9 20:46 , Processed in 0.406571 second(s), 45 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表