基於GUI的簡單聊天室01
阿新 • • 發佈:2019-04-25
pack java.awt action true while循環 one cat launch system
運用了Socket編程,gui,流的讀入和寫出,線程控制等
思路:
1、首先是在客戶端中先建立好聊天的GUI
2、建立服務器端,設置好端口號(用SocketServer),其中需要兩個boolean變量來分別表示服務器是否已經開啟和是否有客戶端連接進來,
利用while循環來讓服務器在開啟的情況下不斷接收客戶端的信息。利用DataOutputStream來進行通訊
3、客戶端連接服務器(Socket)
首先是客戶端的類
1 import java.awt.BorderLayout; 2 import java.awt.event.ActionEvent; 3import java.awt.event.ActionListener; 4 import java.awt.event.WindowAdapter; 5 import java.awt.event.WindowEvent; 6 import java.io.DataOutputStream; 7 import java.io.IOException; 8 import java.net.Socket; 9 import java.net.UnknownHostException; 10 11 import javax.swing.JFrame;12 import javax.swing.JTextArea; 13 import javax.swing.JTextField; 14 15 /** 16 * 完成圖形界面 17 * @author Administrator 18 * 19 */ 20 public class ChatClient extends JFrame{ 21 JTextField jTextField = new JTextField(); 22 JTextArea jTextArea = new JTextArea(); 23 Socket s;24 DataOutputStream bo; 25 public static void main(String[] args) { 26 new ChatClient().launchFrame(); 27 } 28 29 public void launchFrame() { 30 setLocation(200, 150); 31 this.setSize(450, 450); 32 this.add(jTextArea,BorderLayout.NORTH); 33 this.add(jTextField,BorderLayout.SOUTH); 34 jTextField.addActionListener(new TFListener()); 35 //pack(); 36 this.addWindowListener(new WindowAdapter() { 37 @Override 38 public void windowClosing(WindowEvent arg0) { 39 disConnect(); 40 System.exit(0); 41 } 42 });; 43 44 setVisible(true); 45 connect(); 46 } 47 48 /** 49 * 建立連接的方法 50 * @throws IOException 51 * @throws UnknownHostException 52 */ 53 public void connect() { 54 try { 55 s = new Socket("127.0.0.1",8888); 56 bo = new DataOutputStream(s.getOutputStream()); 57 } catch (UnknownHostException e) { 58 e.printStackTrace(); 59 } catch (IOException e) { 60 e.printStackTrace(); 61 } 62 System.out.println("連接成功"); 63 } 64 /** 65 * 斷開連接,關閉資源的方法 66 */ 67 public void disConnect() { 68 try { 69 s.close(); 70 bo.close(); 71 } catch (IOException e1) { 72 e1.printStackTrace(); 73 } 74 75 } 76 77 /** 78 * 內部類,實現監聽 79 * 將文本框中的輸入打印到文本域中 80 * 81 */ 82 private class TFListener implements ActionListener{ 83 84 @Override 85 public void actionPerformed(ActionEvent e) { 86 String content = jTextField.getText().trim(); 87 jTextArea.setText(content); 88 jTextField.setText(""); 89 //將文本發送到服務器 90 try { 91 System.out.println(s); 92 bo.writeUTF(content); 93 bo.flush(); 94 } catch (IOException e1) { 95 e1.printStackTrace(); 96 } 97 } 98 99 } 100 }
然後是服務器的類
import java.io.DataInputStream; import java.io.EOFException; import java.io.IOException; import java.net.BindException; import java.net.ServerSocket; import java.net.Socket; public class ChatSever { public static void main(String[] args) { // 布爾類型變量表示服務器是否開著 boolean started = false; ServerSocket ss = null; Socket s = null; DataInputStream bi = null; // 建立服務端,8888為端口號 try { ss = new ServerSocket(8888); } catch (BindException e) { System.out.println("Socket has been used !"); System.out.println("請重啟服務器 !"); System.exit(0); }catch (IOException e) { e.printStackTrace(); } // 服務器開啟後,started變為true try { started = true; // 接受客戶端的連接 while (started) { // 布爾類型變量bConnected表示有沒有用戶連接 boolean bConnected = false; s = ss.accept(); // 服務器連接後bConnected為true bConnected = true; System.out.println("一個客戶連接"); bi = new DataInputStream(s.getInputStream()); while (bConnected) { String str = bi.readUTF(); System.out.println(str); //bi.close(); } } } catch (EOFException e) { System.out.println("Client close!"); } catch (Exception e) { e.printStackTrace(); } finally { try { if (bi != null) bi.close(); if (s != null) s.close(); } catch (IOException e1) { e1.printStackTrace(); } } } }
基於GUI的簡單聊天室01