Java Swing 图形界面聊天程序:客户端与服务器交互
以下是一个简单的 Java Swing 实现的图形界面聊天程序,包含客户端和服务器两个部分,用户可以在客户端窗口输入信息并发送到服务器,服务器窗口则显示来自客户端的信息,并可进行交互。
客户端程序窗口
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;
public class ClientWindow extends JFrame {
private static final long serialVersionUID = 1L;
private JTextField textField;
private JTextArea textArea;
private Socket socket;
private PrintWriter out;
private BufferedReader in;
private int clientNum;
public ClientWindow(Socket socket, int clientNum) {
super('Client ' + clientNum);
this.socket = socket;
this.clientNum = clientNum;
JPanel panel = new JPanel();
getContentPane().add(panel, BorderLayout.NORTH);
textField = new JTextField();
panel.add(textField);
textField.setColumns(20);
JButton sendButton = new JButton('Send');
panel.add(sendButton);
textArea = new JTextArea(10, 30);
getContentPane().add(textArea, BorderLayout.CENTER);
pack();
setVisible(true);
try {
out = new PrintWriter(socket.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
sendButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String message = textField.getText();
out.println('Client ' + clientNum + ': ' + message);
textField.setText('');
}
});
new Thread(new Runnable() {
@Override
public void run() {
try {
String message;
while ((message = in.readLine()) != null) {
textArea.append(message + '\n');
if (message.equals('bye')) {
break;
}
}
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
服务器端程序窗口
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;
public class ServerWindow extends JFrame {
private static final long serialVersionUID = 1L;
private JTextArea textArea;
private List<ClientWindow> clients;
public ServerWindow() {
super('Server');
JPanel panel = new JPanel();
getContentPane().add(panel, BorderLayout.NORTH);
JButton closeButton = new JButton('Close');
panel.add(closeButton);
textArea = new JTextArea(10, 30);
getContentPane().add(textArea, BorderLayout.CENTER);
pack();
setVisible(true);
clients = new ArrayList<>();
try {
ServerSocket serverSocket = new ServerSocket(12345);
new Thread(new Runnable() {
@Override
public void run() {
try {
while (true) {
Socket socket = serverSocket.accept();
ClientWindow clientWindow = new ClientWindow(socket, clients.size() + 1);
clients.add(clientWindow);
textArea.append('New client connected: ' + socket.getInetAddress().getHostAddress() + '\n');
}
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
} catch (IOException e) {
e.printStackTrace();
}
closeButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
try {
for (ClientWindow clientWindow : clients) {
clientWindow.out.println('bye');
clientWindow.socket.close();
}
dispose();
} catch (IOException ex) {
ex.printStackTrace();
}
}
});
}
}
使用方法
- 运行
ServerWindow类,启动服务器程序窗口。 - 运行
ClientWindow类,启动客户端程序窗口。 - 在客户端程序窗口中输入信息,点击 Send 按钮发送到服务器。
- 在服务器程序窗口中可以看到客户端发送的信息,可以通过 TextArea 组件与客户端进行交互。
- 当客户端发送 'bye' 时,程序结束。
原文地址: https://www.cveoy.top/t/topic/nxSs 著作权归作者所有。请勿转载和采集!