运用了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();
}
}
}
}