使用JAVA完成以下任务,写出实验设计和实验过程;设计网络聊天程序,实现如下功能: (1)聊天两端具有相同的界面,包括能输入消息的文本框、发送消息按钮、消息列表文本框; (2)任意一端均可以实时发送和接收消息,并在自身的消息列表中显示消息记录。
时间: 2023-12-14 19:38:34 浏览: 78
实验设计:
1. 采用Java语言进行开发,使用Swing控件库实现聊天界面。
2. 采用Socket通信实现消息的发送和接收。
3. 采用多线程实现同时进行消息的发送和接收。
实验过程:
1. 设计聊天界面,包括输入消息的文本框、发送消息按钮、消息列表文本框,并实现相应的事件处理方法。
2. 在服务端和客户端分别创建Socket对象,并设置端口号。
3. 在服务端中创建ServerSocket对象,并等待客户端的连接。
4. 在客户端中使用Socket对象连接服务端,并开启线程实现消息的发送和接收。
5. 在服务端中也开启线程实现消息的接收和发送。
6. 实现消息的发送和接收方法,将消息通过Socket通信进行传递,并在自身的消息列表中显示消息记录。
7. 实现关闭窗口时断开连接的方法,避免程序异常退出。
8. 进行测试,确保聊天程序能够正常发送和接收消息。
代码实现:(以服务端为例)
```java
import java.awt.BorderLayout;
import java.awt.Color;
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.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
public class Server extends JFrame {
private static final long serialVersionUID = 1L;
private JTextArea messageArea;
private JTextField messageField;
private JButton sendButton;
private PrintWriter writer;
public Server() {
setTitle("Server");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(400, 300);
setLocationRelativeTo(null);
JPanel bottomPanel = new JPanel();
bottomPanel.setLayout(new BorderLayout());
messageField = new JTextField();
bottomPanel.add(messageField, BorderLayout.CENTER);
sendButton = new JButton("Send");
bottomPanel.add(sendButton, BorderLayout.EAST);
messageArea = new JTextArea();
messageArea.setEditable(false);
messageArea.setBackground(Color.WHITE);
JScrollPane scrollPane = new JScrollPane(messageArea);
getContentPane().add(scrollPane, BorderLayout.CENTER);
getContentPane().add(bottomPanel, BorderLayout.SOUTH);
sendButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String message = messageField.getText();
if (!message.isEmpty()) {
writer.println(message);
writer.flush();
messageField.setText("");
}
}
});
setVisible(true);
try {
ServerSocket serverSocket = new ServerSocket(8888);
messageArea.append("Waiting for client...\n");
Socket socket = serverSocket.accept();
messageArea.append("Client connected.\n");
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
writer = new PrintWriter(socket.getOutputStream());
new Thread(new Runnable() {
@Override
public void run() {
try {
String message;
while ((message = reader.readLine()) != null) {
messageArea.append("Client: " + message + "\n");
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}).start();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
new Server();
}
}
```
阅读全文