使用JAVA事件处理实现双人简易聊天窗口
时间: 2023-07-15 22:11:30 浏览: 48
以下是一个简单的双人聊天窗口的实现,使用Java Swing和Socket编写:
```java
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.ServerSocket;
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 ChatServer extends JFrame {
private static final long serialVersionUID = 1L;
private JTextArea chatArea;
private JTextField inputField;
private JButton sendButton;
private ServerSocket serverSocket;
private Socket clientSocket;
private PrintWriter out;
private BufferedReader in;
public ChatServer() {
super("Chat Server");
initializeGUI();
// 等待客户端连接
try {
serverSocket = new ServerSocket(8888);
clientSocket = serverSocket.accept();
// 初始化输入输出流
out = new PrintWriter(clientSocket.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
// 创建一个线程用于接收客户端消息
Thread thread = new Thread(new IncomingReader());
thread.start();
} catch (IOException e) {
e.printStackTrace();
}
}
private void initializeGUI() {
chatArea = new JTextArea();
chatArea.setEditable(false);
inputField = new JTextField();
inputField.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
sendMessage(inputField.getText());
}
});
sendButton = new JButton("Send");
sendButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
sendMessage(inputField.getText());
}
});
JPanel panel = new JPanel();
panel.setLayout(new BorderLayout());
panel.add(inputField, BorderLayout.CENTER);
panel.add(sendButton, BorderLayout.EAST);
getContentPane().add(chatArea, BorderLayout.CENTER);
getContentPane().add(panel, BorderLayout.SOUTH);
setSize(400, 300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
private void sendMessage(String message) {
out.println(message);
inputField.setText("");
chatArea.append("Server: " + message + "\n");
}
public static void main(String[] args) {
new ChatServer();
}
// 用于接收客户端消息的线程
private class IncomingReader implements Runnable {
@Override
public void run() {
try {
String message;
while ((message = in.readLine()) != null) {
chatArea.append("Client: " + message + "\n");
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
```
以上代码实现了一个简单的聊天服务器,可以启动一个ServerSocket并监听客户端连接。它提供了一个聊天窗口,其中包括一个文本框和一个发送按钮。当用户在文本框中输入消息并按下发送按钮或回车键时,消息将被发送到客户端并显示在聊天窗口中。
```java
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 ChatClient extends JFrame {
private static final long serialVersionUID = 1L;
private JTextArea chatArea;
private JTextField inputField;
private JButton sendButton;
private Socket socket;
private PrintWriter out;
private BufferedReader in;
public ChatClient() {
super("Chat Client");
initializeGUI();
// 连接服务器
try {
socket = new Socket("localhost", 8888);
// 初始化输入输出流
out = new PrintWriter(socket.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
// 创建一个线程用于接收服务器消息
Thread thread = new Thread(new IncomingReader());
thread.start();
} catch (IOException e) {
e.printStackTrace();
}
}
private void initializeGUI() {
chatArea = new JTextArea();
chatArea.setEditable(false);
inputField = new JTextField();
inputField.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
sendMessage(inputField.getText());
}
});
sendButton = new JButton("Send");
sendButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
sendMessage(inputField.getText());
}
});
JPanel panel = new JPanel();
panel.setLayout(new BorderLayout());
panel.add(inputField, BorderLayout.CENTER);
panel.add(sendButton, BorderLayout.EAST);
getContentPane().add(chatArea, BorderLayout.CENTER);
getContentPane().add(panel, BorderLayout.SOUTH);
setSize(400, 300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
private void sendMessage(String message) {
out.println(message);
inputField.setText("");
chatArea.append("Client: " + message + "\n");
}
public static void main(String[] args) {
new ChatClient();
}
// 用于接收服务器消息的线程
private class IncomingReader implements Runnable {
@Override
public void run() {
try {
String message;
while ((message = in.readLine()) != null) {
chatArea.append("Server: " + message + "\n");
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
```
以上代码实现了一个简单的聊天客户端,可以连接到聊天服务器并向其发送消息。它也提供了一个聊天窗口,其中包括一个文本框和一个发送按钮。当用户在文本框中输入消息并按下发送按钮或回车键时,消息将被发送到服务器并显示在聊天窗口中。同时,它也创建了一个线程用于接收服务器的消息,并将其显示在聊天窗口中。