2013-03-03 138 views
2

我想创建一个简单的聊天程序使用java,它包含窗体,客户端窗体和服务器窗体,客户端窗体包含一个TextField和一个按钮(发送按钮),并且服务器窗体包含一个TextArea。一个简单的客户端/服务器聊天程序

当我单击发送按钮时,它应该将TextField中的写入文本发送到服务器表单中的TextArea。

它第一次工作,但当我第二次点击按钮时,它将无法正常工作。

这是我的服务器形式使用的代码:

public class Server extends javax.swing.JFrame implements Runnable { 

    private Thread th; 

    public Server() { 
     initComponents(); 
     th = new Thread(this); 
     th.start(); 
    } 

    // The main method was here 

    @Override 
    public void run() { 

     // Etablir la connexion 
     try { 
      ServerSocket ecoute; 
      ecoute = new ServerSocket(1111); 
      Socket service = null; 
      System.out.println("Serveur en attente d'un client !"); 
      while (true) { 

       service = ecoute.accept(); 
       System.out.println("Client connécté !"); 
       DataInputStream is = new DataInputStream(service.getInputStream()); 
       jTextArea1.setText("Client dit : "+ is.readUTF().toUpperCase()); 
       service.close(); 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 

     } 
    } 
} 

,这是客户端形式的代码:

public class Client extends javax.swing.JFrame { 

    DataOutputStream os; 

    private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) { 
     try { 
      os.writeUTF(jTextField1.getText()); 
     } catch (IOException ex) { 
      Logger.getLogger(Client.class.getName()).log(Level.SEVERE,null, ex); 
     } 
    } 

    public static void main(String args[]) { 
     java.awt.EventQueue.invokeLater(new Runnable() { 

      public void run() { 
       Client c = new Client(); 
       c.setVisible(true); 

       try { 
        Socket s = new Socket("localhost", 1111); 
        c.os = new DataOutputStream(s.getOutputStream()); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 

} 
+0

“*它第一次工作,但当我第二次点击按钮时,它将无法工作。*”。那么会发生什么呢?请明确点。 – Lion 2013-03-03 17:54:57

+0

@Lion什么都没有发生,它什么都做,它看起来像操作事件只有一次 – 2013-03-03 18:01:00

+0

没有例外记录?这似乎很奇怪.. – ddmps 2013-03-03 18:04:12

回答

2

您的问题是在服务器的代码: 在服务器端收到来自不同客户的各种消息, 每个接受,即每个客户端,你必须创建一个线程来处理它的请求,因为你使用的是TCP连接。 ( - 你只接受一个请求,然后关闭连接)。

我清理了与代码套接字无关的部分(即与客户端中的GUI有关的一些不完整的部分),因此我提出了适用于许多同时客户端连接的不同版本,并且您可以看到所有消息到达服务器,而不仅仅是第1条消息。

服务器的代码:

import java.io.*; 
import java.net.*; 


public class Server { 

    public static void run() { 
     try 
     { 
      ServerSocket ecoute; 
      ecoute = new ServerSocket(1111); 
      Socket service = null; 
      System.out.println("serveur en attente d'un client!"); 
      while(true) 
      { 
       service = ecoute.accept(); 
       System.out.println("client connécté!"); 
//    ##call a new thread 
       WorkerThread wt = new WorkerThread(service); 
       wt.start(); 
      } 
     } 
     catch(IOException e) 
     { 
      e.printStackTrace(); 
     } 
    } 

    public static void main(String args[]) { 
     run(); 
    } 
} 


class WorkerThread extends Thread { 
    Socket service; 
    WorkerThread(Socket service) { 
     this.service = service; 
    } 

    public void run() { 
    boolean flag=true; //you can change this flag's condition, to test if the client disconects 
    try 
    { 
     while (flag){ 
      DataInputStream is = new DataInputStream(service.getInputStream()); 
      System.out.println("client dit: " + is.readUTF().toUpperCase()); 
     } 
     service.close(); 
    } 
    catch(IOException e) 
     { 
      e.printStackTrace(); 
     } 
    } 
} 

客户代码:

import java.io.*; 
import java.io.*; 
import java.net.*; 
import java.util.logging.*; 


public class Client { 

DataOutputStream os; 

public static void main(String args[]) { 
java.awt.EventQueue.invokeLater(new Runnable() { 

     public void run() { 
       Client c = new Client(); 
     try { 
      Socket s = new Socket("localhost", 1111); 
      c.os = new DataOutputStream(s.getOutputStream()); 
      while (true){ 
       String str = Input.read_string(); 
       c.os.writeUTF(str); 
      } 
     } catch (IOException e) { 
      // TODO auto-generated catch block 
      e.printStackTrace(); 
     } 
      } 
     }); 
    } 
} 

public class Input{ 
    public static String read_string(){ 
     String read=""; 
     try{ 
      read = new BufferedReader(new InputStreamReader(System.in), 1).readLine(); 
     }catch (IOException ex){ 
      System.out.println("error reading from the input stream!"); 
     } 
     return read; 
    } 
} 

之后,你需要,你可能知道,送所有那些到达的消息服务器到聊天室中的所有客户端。

+0

okey,感谢您的帮助 – 2013-03-03 19:25:39

1

Server代码,您while(true)节 - 你是在读完一次之后关闭套接字,而在客户端则不会重新打开Socket(和新的InputStream)。我建议你在while(true)部分有另一个循环,它将继续读取并显示新的数据,直到达到EOF。

+0

我不知道我在哪里使用其他while(true)loop – 2013-03-03 18:54:38

+0

他不需要在客户端重新打开一个套接字,因为他使用的是TCP。他需要在服务器端继续处理消息,并且服务器端的一个简单的(真正的)循环是不够的,因为它只支持一个客户端... – 2013-03-03 19:12:54