многопоточный сервер: SwingWorker Vs Thread? - PullRequest
1 голос
/ 07 марта 2012

все в заголовке: Я создаю 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 ]

1 голос
/ 08 марта 2012

В этом случае вам, вероятно, не следует использовать SwingWorker. Вы должны иметь поток фоновой обработки, вызывающий SwingUtilities.invokeLater (), когда он будет готов обновить графический интерфейс. Обычно SwingWorker предназначен для вещей, инициируемых событиями графического интерфейса, например, для нажатия кнопки или пункта меню, чтобы графический интерфейс не зависал и вы могли получать обновления в графическом интерфейсе с течением времени. Важным моментом является обеспечение того, чтобы обновления GUI выполнялись на EDT, и SwingUtilities.invokeLater () справится с этим. В качестве альтернативы базовым Thread / Runnable взгляните также на Future, Callable и Executors, которые могут дать вам некоторые идеи, как это структурировать. SwingWorker использует их внутри.

0 голосов
/ 07 марта 2012

Действительно, вам нужно создать цикл, который зацикливался бы, и каждая итерация считывала из входного потока, что-то вроде этого:

//

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) {

                }

            }       
    }

Если вы этого не сделаете, ввод будет прочитан только один раз

...