2014-01-29 43 views
0

我們剛剛開始網絡編程學校,現在我有一個問題,我的功課(IM不是最好的程序員)。 所以基本上我有一個Java聊天室3類。 ClientHandler在客戶端連接到服務器,服務器主類和存儲我的GUI的客戶機類時將startet作爲線程獲取。多線程JavaChat與GUI

所以每次我通過終端連接到服務器(通過telnet本地主機10023)ClientHandler中的一個新的線程獲取開始,我可以通過與其他用戶終端聊天。 但是整個事情如何與我的gui一起工作? Sry爲我的壞英語順便說一句。 Serveclass:

import java.io.IOException; 
    import java.net.ServerSocket; 
    import java.net.Socket; 
    import java.util.HashMap; 
    import java.util.HashSet; 
    import java.util.Map; 
    import java.util.Map.Entry; 
    import java.util.Set; 
    import java.util.TreeMap; 


    public class Server { 
     static Set<ClientHandler> clients = new HashSet<>(); 
     public static void broadcastMessage(String message) throws IOException { 
      for(ClientHandler c: clients) { 
       if(!(clients.equals(c.username))) { 
        c.sendMessage(message); 
       } 
      } 
     } 

     private void startServer() { 
      try(ServerSocket server = new ServerSocket(10023)) { 
       while(true){ 
        Thread thread = new Thread(new ClientHandler(server.accept())); 
        thread.start(); 
       } 
      }catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 

     public static void main(String[] args) { 
      new Server().startServer(); 
     } 
    } 

ClientHandler的:

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.PrintWriter; 
import java.net.Socket; 


public class ClientHandler implements Runnable { 
    private Socket client = null; 
    private Server server = null; 
    BufferedReader reader = null; 
    PrintWriter writer = null; 
    public String username; 
    public ClientHandler(Socket client) throws IOException { 
     this.client = client; 
     this.server = server; 
     this.reader = new BufferedReader(new InputStreamReader(client.getInputStream())); 
     this.writer = new PrintWriter(client.getOutputStream()); 
    } 
    @Override 
    public void run() { 
     try { 
      Server.clients.add(this); 
      writer.println("Please enter your username: "); 
      writer.flush(); 
      username = reader.readLine(); 
      try { 
       while(true) { 
        String message; 
        message = reader.readLine(); 
        if(!(message.trim().equals(""))) { 
         Server.broadcastMessage(message); 
        } 
       } 
      }catch(Exception e) {} 
      writer.println("Verbindung geschlossen"); 
      writer.flush(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    public void sendMessage(String message) throws IOException { 
     //ClientFrame.taChat.append(message); 
     writer.println(username + ": " + message); 
     writer.flush(); 
    } 
} 

而且我ClientFrame:

import java.awt.EventQueue; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import java.awt.BorderLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.net.Socket; 
import java.util.HashMap; 

import javax.swing.JButton; 
import javax.swing.JTextField; 
import javax.swing.JScrollPane; 
import javax.swing.JTextArea; 


public class ClientFrame { 

    static JFrame mainFrame; 
    static JTextField tfMessage; 
    static JTextArea taUser = new JTextArea(); 
    static JTextArea taChat = new JTextArea(); 
    /** 
    * Launch the application. 
    */ 
    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       try { 
        ClientFrame window = new ClientFrame(); 
        //Socket socket = new Socket("127.0.0.1", 10023); 
        window.mainFrame.setVisible(true); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 

      } 
     }); 
    } 

    /** 
    * Create the application. 
    */ 
    public ClientFrame() { 
     initialize(); 
    } 

    /** 
    * Initialize the contents of the frame. 
    */ 
    private void initialize() { 
     mainFrame = new JFrame(); 
     mainFrame.setTitle("ChatServer - Harisch"); 
     mainFrame.setBounds(200, 100, 450, 300); 
     mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     mainFrame.setLocationRelativeTo(null); 

     JPanel pSouth = new JPanel(); 
     mainFrame.getContentPane().add(pSouth, BorderLayout.SOUTH); 
     pSouth.setLayout(new BorderLayout(0, 0)); 

     JButton bnDisconnect = new JButton("Disconnect"); 
     pSouth.add(bnDisconnect, BorderLayout.WEST); 

     tfMessage = new JTextField(); 
     pSouth.add(tfMessage, BorderLayout.CENTER); 
     tfMessage.setColumns(10); 

     JButton bnSend = new JButton("Send"); 
     pSouth.add(bnSend, BorderLayout.EAST); 

     JScrollPane spUser = new JScrollPane(); 
     mainFrame.getContentPane().add(spUser, BorderLayout.EAST); 


     taUser.setEditable(false); 
     taUser.setColumns(10); 
     spUser.setViewportView(taUser); 

     JScrollPane spChat = new JScrollPane(); 
     mainFrame.getContentPane().add(spChat, BorderLayout.CENTER); 

     //  bnSend.addActionListener(new ActionListener() { 
     //   
     //   @Override 
     //   public void actionPerformed(ActionEvent arg0) { 
     //    
     //    if(tfMessage.getText() != "") { 
     //     ServerMain.messages.put("test", tfMessage.getText()); 
     //    } 
     //    
     //   } 
     //  }); 

     taChat.setEditable(false); 

    } 

} 
+1

不要讓你的變量靜態的,除非你知道你做了什麼。 – Sam

+0

我同意@Sam。這些領域都不應該是靜態的。對不起,這看起來像是在學習基本的Java之前創建一個非常複雜的程序。首先學習第一件事,比如如何創建基本的行爲良好的符合OOP的對象。 –

+0

就像我說的,我不是beste程序員^^我從來沒有真正得到這個靜態的東西,什麼時候使用它 – user3248787

回答

1

你ClientFrame類只需要你正在使用終端的內容。它應該打開一個套接字到端口10023,然後單擊發送按鈕時發送文本到它。它還應該監聽收到的消息並在收到時顯示它們。

+0

好的謝謝:)但我該怎麼做?我的意思是我知道如何用套接字連接到服務器,但我如何監聽傳入的消息? – user3248787

+0

在開始聊天程序之前,您應該嘗試編寫簡單的客戶端/服務器乒乓程序。這意味着你有一個連接到服務器併發送「ping」消息的客戶端。服務器用「pong」響應來自每個客戶端的每個「ping」。如果你能做到這一點,你的聊天程序將不再是一個挑戰。 – Sam