多线程服务器:SwingWorker与线程?

时间:2012-03-07 11:00:42

标签: java multithreading swingworker

全部在标题中: 我创建了一个java客户端,当我点击一个按钮时,它向服务器发送一条消息,几个客户端可以同时连接,这是我的源代码:

客户:

  private void simulerMessageActionPerformed(java.awt.event.ActionEvent evt) {                                               
    try {
        log.append("wait for connexion..\n");
        socket=new Socket(ip.getText(),Integer.parseInt(port.getText()));

        log.append("Connexion to the server ok");

         BufferedReader in = new BufferedReader( new  InputStreamReader(socket.getInputStream())  ); ligne.      
         PrintWriter out = new PrintWriter( new BufferedWriter( new OutputStreamWriter(socket.getOutputStream())), true); 


         String str = "test1";
         log.append("\n"+str+"\n");
         out.println(str); 


         in.close();
         out.close();
         socket.close();
    } catch (UnknownHostException ex) {
        Logger.getLogger(Simulator.class.getName()).log(Level.SEVERE, null, ex);
    } catch (IOException ex) {
        Logger.getLogger(Simulator.class.getName()).log(Level.SEVERE, null, ex);
    }






  }             

服务器:

  private void demarreActionPerformed(java.awt.event.ActionEvent evt) { 
  sw=new SwingWorker<String,Void> (){

  protected String doInBackground() throws Exception {
    try {

            server = new ServerSocket(Integer.parseInt(port.getText()));
      } catch (IOException ex) {
    return "already in use";

        }    
            String str1="waiting for connexion";
            String str2="Connexion ok";

            log.append(str1+"\n");
            PrintWriter out=null;
            BufferedReader in=null;
            Socket socClient=null;
     while(ecoute){
       try{
          socClient = server.accept();  
         }catch(java.net.SocketException e){

           return "[user] Server Stoped";
          }
                    log.append(str2+"\n");
                     in = new BufferedReader(
                                    new InputStreamReader(socClient.getInputStream())
                                   );
                   out = new PrintWriter(
                     new BufferedWriter(
                        new OutputStreamWriter(socClient.getOutputStream())), 
                     true);
                    String str = in.readLine();
                    log.append(str+"\n");



         }



     return "fatal error";
       }

       protected void done(){
       String m="";
            try {
                m=get();
            } catch (InterruptedException ex) {
                Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
            } catch (ExecutionException ex) {
                Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
            }
        log.append(m+"\n");

        }
      };
    sw.execute();
   }   

目前我的服务器在发送有效的消息时包含一个小错误,但之后所有收到的消息都为空...请参阅: enter image description here

我认为问题来自于我在服务器socClient = server.accept();之后没有创建线程? 如果是最好的情况呢?:

  • 在SwingWorker中使用SwingWorker。

  • 使用Runnable接口创建经典线程。

否则解决这个问题的解决方案是什么? 谢谢^^。

2 个答案:

答案 0 :(得分:1)

在这种情况下,您可能不应该使用SwingWorker。当它准备好更新GUI时,你应该让后台处理线程调用SwingUtilities.invokeLater()。通常,SwingWorker用于由GUI事件启动的事件,例如单击按钮或菜单项,以便GUI不会挂起,并且您可以随时间更新GUI。重要的是确保您的GUI更新在EDT上完成,SwingUtilities.invokeLater()将处理它。作为基本Thread / Runnable的替代方案,请看看Future,Callable和Executors,这可能会给你一些如何构建它的想法。 SwingWorker在内部使用它们。

答案 1 :(得分:0)

实际上,您需要创建一个循环的线程,并且每次迭代都从输入流中读取,类似于:

//

thread = new Thread(this);
thread.start();

public void run() {

            while(true){
                System.out.println("thread is running");
                try {
                    String temp = in.readUTF();
                    System.out.println(temp);
                    chattArea.append(temp);
                } catch (IOException e) {

                }

            }       
    }

如果您不这样做,输入将只读一次