Java局域网聊天小程序攻略
简介
本攻略介绍如何使用Java编写一个局域网聊天小程序。可以在同一局域网内的多台计算机之间进行聊天。
步骤
1. 创建Java项目
创建一个新的Java项目,命名为“ChatApp”。
2. 添加GUI
在项目中创建一个新的GUI类,命名为“ChatWindow”。在界面中添加一个文本区域用于显示聊天记录,一个文本框用于输入聊天内容,一个按钮用于发送消息。
import javax.swing.*;
public class ChatWindow extends JFrame {
private JTextArea chatTextArea;
private JTextField messageTextField;
private JButton sendButton;
public ChatWindow() {
chatTextArea = new JTextArea();
chatTextArea.setEditable(false);
JScrollPane scrollPane = new JScrollPane(chatTextArea);
messageTextField = new JTextField();
sendButton = new JButton("发送");
JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.PAGE_AXIS));
panel.add(scrollPane);
panel.add(messageTextField);
panel.add(sendButton);
this.add(panel);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.pack();
this.setVisible(true);
}
}
3. 创建服务器
创建一个新的服务器类,命名为“ChatServer”。在服务器中监听来自客户端的连接请求,并使用多线程处理每个客户端的消息。
示例代码如下:
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
public class ChatServer {
private ServerSocket serverSocket;
private List<ClientHandler> clients;
public ChatServer(int port) throws IOException {
serverSocket = new ServerSocket(port);
clients = new ArrayList<>();
System.out.println("服务器已启动,正在监听端口 " + port + "...");
while (true) {
Socket socket = serverSocket.accept();
System.out.println("接收到来自 " + socket.getInetAddress().getHostAddress() + " 的连接请求");
ClientHandler client = new ClientHandler(socket, this);
client.start();
clients.add(client);
broadcastMessage("系统消息:欢迎 " + client.getUsername() + " 进入聊天室");
}
}
public void removeClient(ClientHandler client) {
clients.remove(client);
broadcastMessage("系统消息:" + client.getUsername() + " 离开聊天室");
}
public void broadcastMessage(String message) {
for (ClientHandler client : clients) {
client.sendMessage(message);
}
}
public static void main(String[] args) throws IOException {
new ChatServer(8888);
}
}
4. 创建客户端
创建一个新的客户端类,命名为“ChatClient”。在客户端中连接到服务器,并使用多线程处理消息的接收和发送。
示例代码如下:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
public class ChatClient {
private String serverHost;
private int serverPort;
private Socket socket;
private BufferedReader reader;
private PrintWriter writer;
private ChatWindow chatWindow;
public ChatClient(String serverHost, int serverPort) throws IOException {
this.serverHost = serverHost;
this.serverPort = serverPort;
socket = new Socket(serverHost, serverPort);
reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
writer = new PrintWriter(socket.getOutputStream(), true);
chatWindow = new ChatWindow();
chatWindow.setSendButtonActionListener(e -> {
sendMessage();
});
Thread receiveThread = new Thread(() -> {
try {
while (true) {
String message = reader.readLine();
if (message == null) {
break;
}
chatWindow.appendMessage(message);
}
} catch (IOException e) {
e.printStackTrace();
}
});
receiveThread.start();
}
public void sendMessage() {
String message = chatWindow.getMessage();
writer.println(message);
chatWindow.clearMessage();
}
public static void main(String[] args) throws IOException {
String serverHost = "127.0.0.1";
int serverPort = 8888;
new ChatClient(serverHost, serverPort);
}
}
5. 创建消息处理类
创建一个新的消息处理类,命名为“MessageHandler”。在处理消息时,需要判断消息类型,并将不同类型的消息分别处理。
示例代码如下:
public class MessageHandler {
private String message;
private ChatServer chatServer;
private ClientHandler sender;
public MessageHandler(String message, ChatServer chatServer, ClientHandler sender) {
this.message = message;
this.chatServer = chatServer;
this.sender = sender;
}
public void handle() {
if (message.startsWith("@")) {
handlePrivateMessage();
} else {
handlePublicMessage();
}
}
private void handlePrivateMessage() {
int index = message.indexOf(" ");
if (index == -1) {
sender.sendMessage("系统消息:私聊消息格式不正确");
return;
}
String receiverName = message.substring(1, index);
String content = message.substring(index + 1);
for (ClientHandler client : chatServer.getClients()) {
if (client.getUsername().equals(receiverName)) {
client.sendMessage(sender.getUsername() + " 对你说:" + content);
sender.sendMessage("你对 " + client.getUsername() + " 说:" + content);
return;
}
}
sender.sendMessage("系统消息:找不到用户 " + receiverName);
}
private void handlePublicMessage() {
chatServer.broadcastMessage(sender.getUsername() + " 说:" + message);
}
}
6. 创建客户端处理类
创建一个新的客户端处理类,命名为“ClientHandler”。在处理消息时,需要将消息发送给服务器进行转发,并处理服务器发送的消息。
示例代码如下:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Random;
public class ClientHandler extends Thread {
private Socket socket;
private ChatServer chatServer;
private BufferedReader reader;
private PrintWriter writer;
private String username;
public ClientHandler(Socket socket, ChatServer chatServer) throws IOException {
this.socket = socket;
this.chatServer = chatServer;
reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
writer = new PrintWriter(socket.getOutputStream(), true);
username = "Guest" + new Random().nextInt(1000);
writer.println("系统消息:欢迎你," + username);
}
public String getUsername() {
return username;
}
public void sendMessage(String message) {
writer.println(message);
}
@Override
public void run() {
try {
while (true) {
String message = reader.readLine();
if (message == null) {
break;
} else {
MessageHandler messageHandler = new MessageHandler(message, chatServer, this);
messageHandler.handle();
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
chatServer.removeClient(this);
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
示例说明
示例一
假设局域网内有三台计算机,分别为“A”、“B”、“C”。执行以下步骤:
- 在计算机“A”中启动服务器:
java
new ChatServer(8888); - 在计算机“B”中启动客户端:
java
new ChatClient("A计算机的IP地址", 8888); - 在计算机“C”中启动客户端:
java
new ChatClient("A计算机的IP地址", 8888); - 在客户端“B”中输入一个公共消息:
Hello, world!
- 在客户端“C”中可以看到以下聊天记录:
A用户:系统消息:欢迎Guest123进入聊天室
B用户:系统消息:欢迎Guest456进入聊天室
B用户:B 说:Hello, world! - 在客户端“C”中输入一个公共消息:
Hi!
- 在客户端“B”中可以看到以下聊天记录:
A用户:系统消息:欢迎Guest123进入聊天室
B用户:系统消息:欢迎Guest456进入聊天室
B用户:B 说:Hello, world!
C用户:C 说:Hi!
示例二
假设局域网内有两台计算机,分别为“D”、“E”。执行以下步骤:
- 在计算机“D”中启动服务器:
java
new ChatServer(8888); - 在计算机“E”中启动客户端:
java
new ChatClient("D计算机的IP地址", 8888); - 在客户端“E”中输入一个私人消息,发送给“D”:
@Guest123 Hi, D!
- 在客户端“D”中可以看到以下聊天记录:
A用户:系统消息:欢迎Guest123进入聊天室
D用户:Guest123 对你说:Hi, D! - 在客户端“E”中可以看到以下聊天记录:
D用户:系统消息:欢迎Guest456进入聊天室
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java局域网聊天小程序 - Python技术站