2012-07-08 103 views
1

我正试图保持多线程服务器程序的连接打开状态。当我点击一个按钮时,我希望它向所有连接的客户端发送测试消息。与套接字保持连接

public void run() { 
    try { 
     Scanner in = new Scanner(socket.getInputStream()); 
     PrintWriter out = new PrintWriter(socket.getOutputStream()); 
     readUpdate(out, in); 
     while(true){sendUpdate(out);} 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

使用多CPU的方式。

这是我的sendUpdate方法。

private void sendUpdate(final PrintWriter out) { 
    new Thread(new Runnable() { 

     public void run() { 
      if(Server.send) { 
       try { 
        if (Server.command != "idle") { 
         System.out.println("Sending"); 
         out.println("[email protected]" + Server.command); 
         out.flush(); 
         Server.send = false; 
         Thread.sleep(100); 
        } 
       } catch (Exception ex) { 
       } 
      } 
     } 
    }).start(); 
} 

如果有人可以帮助我保持连接打开,并准备发送数据,我将不胜感激。

+1

'而(真){sendUpdate(出);}'创造这么多线程这个产量:o ..只是不创建'setUpdate()'方法中的新线程。 – 2012-07-08 16:19:38

+0

套接字将保持打开状态,直到您或客户端关闭它为止。将循环移到线程的'run'方法中。 – 2012-07-08 16:46:34

+0

我试过了,我帮了忙,但是我的CPU使用率每个客户端连接了大约80%,我只能连接四个。 – user1497561 2012-07-08 16:53:54

回答

1

如果您的服务器可以发起消息,客户端也可以发起消息,那么您可能需要单独的线程读取和写入。一个线程对于请求 - 响应风格的通信很有意义,您可以阻止下一个客户端请求,执行一些服务器端处理,响应客户端,然后再次阻止。

但是,如果您需要在两个单独的条件(从客户端接收消息并单击服务器上的按钮)上阻止,则应该有两个单独的线程。否则,你会发现自己需要反复唤醒你的线程来检查是否有任何一个条件是真的。

因此,创建两个线程,并给一个你的Scanner(即readUpdate逻辑)和其他你的PrintWriter。这是你的输出处理程序可以是什么样子:

public class WriteHandler implements Runnable { 
    private final PrintWriter out; 
    private final BlockingQueue<String> messageQueue = new LinkedBlockingQueue<String>(); 

    //initialize the above in a constructor; 

    public void run() { 
     while(true) { 
      String nextMessageToWrite = messageQueue.poll(); 
      out.println(nextMessageToWrite); 
     } 
    } 

    public void send(String message) { 
     messageQueue.add(message); 
    } 
} 

这将使用blocking queue,比支票睡眠循环更好的并发机制。然后单击该按钮时,你可以有这样的事情:

public void actionPerformed() { 
    for (WriteHandler handler : handlers) { 
     handler.send("PING!"); 
    } 
}