给出上述问题的完整代码
时间: 2024-03-11 07:46:12 浏览: 58
以下是一个简单的基于 Java Socket 编写的服务端和客户端聊天系统的完整代码,您可以在这个代码基础上进行修改和扩展。
服务端代码:
```java
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
public class Server extends JFrame implements ActionListener {
private JTextArea textArea;
private JTextField textField;
private JButton button;
private ServerSocket serverSocket;
private Socket socket;
private BufferedReader reader;
private BufferedWriter writer;
private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
private String chatLogFileName = "chat.log";
public Server() {
setTitle("Server");
setSize(500, 500);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel = new JPanel();
panel.setLayout(new BorderLayout());
textArea = new JTextArea();
textArea.setEditable(false);
JScrollPane scrollPane = new JScrollPane(textArea);
panel.add(scrollPane, BorderLayout.CENTER);
textField = new JTextField();
panel.add(textField, BorderLayout.SOUTH);
button = new JButton("Send");
button.addActionListener(this);
panel.add(button, BorderLayout.EAST);
add(panel);
setVisible(true);
try {
serverSocket = new ServerSocket(8888);
appendText("Server started.");
socket = serverSocket.accept();
appendText("Client connected.");
reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
writer = new BufferedWriter(new FileWriter(chatLogFileName, true));
String line;
while ((line = reader.readLine()) != null) {
appendText("Client: " + line);
writer.write(sdf.format(new Date()) + " Client: " + line + "\n");
writer.flush();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
serverSocket.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() == button) {
String text = textField.getText();
if (!text.isEmpty()) {
try {
writer.write(sdf.format(new Date()) + " Server: " + text + "\n");
writer.flush();
socket.getOutputStream().write((text + "\n").getBytes());
appendText("Server: " + text);
textField.setText("");
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
}
private void appendText(String message) {
textArea.append(sdf.format(new Date()) + " " + message + "\n");
textArea.setCaretPosition(textArea.getDocument().getLength());
}
public static void main(String[] args) {
new Server();
}
}
```
客户端代码:
```java
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
public class Client extends JFrame implements ActionListener {
private JTextArea textArea;
private JTextField textField;
private JButton button;
private Socket socket;
private BufferedReader reader;
private BufferedWriter writer;
private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
private String chatLogFileName = "chat.log";
public Client() {
setTitle("Client");
setSize(500, 500);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel = new JPanel();
panel.setLayout(new BorderLayout());
textArea = new JTextArea();
textArea.setEditable(false);
JScrollPane scrollPane = new JScrollPane(textArea);
panel.add(scrollPane, BorderLayout.CENTER);
textField = new JTextField();
panel.add(textField, BorderLayout.SOUTH);
button = new JButton("Send");
button.addActionListener(this);
panel.add(button, BorderLayout.EAST);
add(panel);
setVisible(true);
try {
socket = new Socket("localhost", 8888);
appendText("Connected to server.");
reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
writer = new BufferedWriter(new FileWriter(chatLogFileName, true));
String line;
while ((line = reader.readLine()) != null) {
appendText("Server: " + line);
writer.write(sdf.format(new Date()) + " Server: " + line + "\n");
writer.flush();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() == button) {
String text = textField.getText();
if (!text.isEmpty()) {
try {
writer.write(sdf.format(new Date()) + " Client: " + text + "\n");
writer.flush();
socket.getOutputStream().write((text + "\n").getBytes());
appendText("Client: " + text);
textField.setText("");
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
}
private void appendText(String message) {
textArea.append(sdf.format(new Date()) + " " + message + "\n");
textArea.setCaretPosition(textArea.getDocument().getLength());
}
public static void main(String[] args) {
new Client();
}
}
```
上述代码实现了一个简单的服务端和客户端聊天系统,可以进行一对一的聊天,并且可以将聊天记录保存到文件中。在服务端和客户端启动时,会自动读取之前的聊天记录,并显示在对应的文本区域中。同时,程序也实现了发送消息后自动清空文本输入框的功能。