手机端的代码我已经写了,也找别人帮忙测试过,没问题,但是我的服务端用了线程池来做,因为怕并发量大的情况,下面直接贴服务端代码了: 第一个类: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 stubthis.socket = socket;try {// 保持长连接socket.setKeepAlive(true);} catch (Exception e) {// TODO: handle exception}run();}
public void run() {// TODO Auto-generated method stubtry { 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();到这一句,去阻塞着,现在不知道怎么解决这个问题?只要能监听多个手机的发送消息就可以了,求解啊.....希望版主顶一下,因为好几次我发帖子都么有人回一下啊....感觉还没有eoe的人热情
// 保留线程池的大小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 stubthis.socket = socket;try {// 保持长连接socket.setKeepAlive(true);} catch (Exception e) {// TODO: handle exception}run();}
public void run() {// TODO Auto-generated method stubtry { 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();到这一句,去阻塞着,现在不知道怎么解决这个问题?只要能监听多个手机的发送消息就可以了,求解啊.....希望版主顶一下,因为好几次我发帖子都么有人回一下啊....感觉还没有eoe的人热情
解决方案 »
- 请教:使用NDK,是否可以调用Linux系统调用
- android mms 更新时间格式(在setting中设置完时间格式的显示:mm/dd/yyy),短信或者mms中:信息的显示日期格式的更新机制是怎样的?
- android怎么将一个文本文件写入pc机
- Android AChartEngine柱形图如何设置柱形宽度?(急)
- 如何解决被垃圾回收的情况
- 菜鸟问关于桌面文件夹的问题
- 我是菜鸟,求帮忙
- 请问android SQL如何获取表的某一行某一列的数据
- 如何从RequestListener接口下的onComplete方法中获取json字符串,并返回
- checkBox和radiobutton显示问题
- win7下:安装完了jdk,可是在安装android时还是提示我没安装jdk,咋回事?
- 无法模拟发送短信
2楼的兄弟 因为我executor .execute(new MessageOptThread(socket)); 就是线程池要执行的 这段代码要的是一个实现了Runnable 的对象,所以我哪样做了..
3楼的兄弟 我是用myeclipse这个工具做的...
希望兄弟们帮忙啊 我搞两天了....
String info = reader.readLine();
这句话后面加个判断试试:
if (null == info){
break;
}
String info = reader.readLine();
这行代码换成下面的试下
StringBuffer info = null;
while(null != reader.readLine()){
info.append(reader.readLine());
}
System.out.println(info.toString());
我第一感觉应该是把这句放到线程里面去执行一下试试。另外我对JAVA的高度不太熟,如果有多几手机连进来那么,第二个手机的连接是阻在哪了呢?是不是多出来一个THREADID了?
那个线程池要的参数是Runnable 这个类型的,这个类是没有start方法的,我在网上也看到executor .execute(new MessageOptThread(socket)); 这样做相当于开了一个线程,会自动去调用run方法,但是我一步一步跟踪发现,是没有去调用run方法的,也许是我用得不对,还请兄弟们指点啊
现在我么有用线程池,可以实现两个手机发消息和收消息,但是每次有手机访问的时候都会去开启一个线程,这样我就担心了高并发的情况,希望兄弟们给个建议,如果我上面不用线程池了,那么怎么处理高并发呢...谢谢