手机端的代码我已经写了,也找别人帮忙测试过,没问题,但是我的服务端用了线程池来做,因为怕并发量大的情况,下面直接贴服务端代码了:   第一个类: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的人热情

解决方案 »

  1.   

    1楼的兄弟说对了啊  我也有这感觉,为什么呢?但是我在网上看到好多资料都是这样?
    2楼的兄弟 因为我executor .execute(new MessageOptThread(socket)); 就是线程池要执行的 这段代码要的是一个实现了Runnable 的对象,所以我哪样做了..
    3楼的兄弟 我是用myeclipse这个工具做的... 
      希望兄弟们帮忙啊 我搞两天了.... 
      

  2.   

    现在的情况是,如果在第二个类里面的try的代码加上while(true)去包含整个try的代码,就可以接受到一个手机,多次发送到服务端的消息,但是其他手机就不能发送消息到服务端了,因为while这个死循环会阻塞着,不能跳出去,这样做
    String info = reader.readLine();
    这句话后面加个判断试试:
    if (null == info){
         break;
    }
      

  3.   

    while别放在try前面了,
    String info = reader.readLine();
    这行代码换成下面的试下
    StringBuffer info = null;
    while(null != reader.readLine()){
      info.append(reader.readLine());
    }
    System.out.println(info.toString());
      

  4.   

    Socket socket = serverSocket.accept();
    我第一感觉应该是把这句放到线程里面去执行一下试试。另外我对JAVA的高度不太熟,如果有多几手机连进来那么,第二个手机的连接是阻在哪了呢?是不是多出来一个THREADID了?
      

  5.   

    11楼的兄弟,谢谢你的支持
       那个线程池要的参数是Runnable 这个类型的,这个类是没有start方法的,我在网上也看到executor .execute(new MessageOptThread(socket)); 这样做相当于开了一个线程,会自动去调用run方法,但是我一步一步跟踪发现,是没有去调用run方法的,也许是我用得不对,还请兄弟们指点啊
       现在我么有用线程池,可以实现两个手机发消息和收消息,但是每次有手机访问的时候都会去开启一个线程,这样我就担心了高并发的情况,希望兄弟们给个建议,如果我上面不用线程池了,那么怎么处理高并发呢...谢谢