运用了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();
}
}
}
}
来源:https://www.cnblogs.com/happyeven/p/10765829.html