基于GUI的简单聊天室01
运用了Socket编程,gui,流的读入和写出,线程控制等
思路:
1、首先是在客户端中先建立好聊天的GUI
2、建立服务器端,设置好端口号(用SocketServer),其中需要两个boolean变量来分别表示服务器是否已经开启和是否有客户端连接进来,
利用while循环来让服务器在开启的情况下不断接收客户端的信息。利用DataOutputStream来进行通讯
3、客户端连接服务器(Socket)
首先是客户端的类
1 import java.awt.BorderLayout; 2 import java.awt.event.ActionEvent; 3 import 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(); } } } }