使用javaGUI实现服务端界面(相当于老师),有文本输入框、发送按钮、接收消息的文本区 域; 2.客户端界面(相当于学生),有 IP 地址输入框、端口号输入框、连接按钮、 文本输入框、发送按钮、接收消息的文本区域; 3.在运算系统中增加一个"提问"按钮,点击该按钮后,打开客户端对话窗口; 4.服务端与客户端相互独立,先启动服务端,然后客户端才能连接到服务端; 5.实现一对一的服务端与客户端对话功能。无论是客户端还是服务端,发送 消息后,首先在消息区显示发送的消息,然后清空输入框中的数据。消息接收端 也要在消息区显示接收到的消息。给出具体代码
时间: 2024-04-07 13:29:30 浏览: 77
好的,以下是使用Java GUI实现服务端与客户端通信的具体代码实现:
服务端代码:
```
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.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
public class Server extends JFrame implements ActionListener, Runnable {
private static final long serialVersionUID = 1L;
private JTextField inputField;
private JTextArea messageArea;
private JButton sendButton;
private ServerSocket serverSocket;
private Socket clientSocket;
private BufferedReader in;
private PrintWriter out;
public Server() {
super("Server");
// 创建输入框、文本区域和发送按钮
inputField = new JTextField(30);
messageArea = new JTextArea(10, 30);
sendButton = new JButton("发送");
// 将输入框和发送按钮添加到面板中
JPanel inputPanel = new JPanel();
inputPanel.add(inputField);
inputPanel.add(sendButton);
// 将消息区添加到滚动面板中
JScrollPane scrollPane = new JScrollPane(messageArea);
// 将面板添加到窗口中
add(inputPanel, BorderLayout.NORTH);
add(scrollPane, BorderLayout.CENTER);
// 添加事件监听器
inputField.addActionListener(this);
sendButton.addActionListener(this);
// 设置窗口大小和可见性
setSize(400, 300);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
@Override
public void actionPerformed(ActionEvent e) {
// 获取输入框中的文本
String message = inputField.getText();
// 将消息显示在消息区中
messageArea.append("服务端: " + message + "\n");
// 将消息发送给客户端
out.println(message);
out.flush();
// 清空输入框中的文本
inputField.setText("");
}
@Override
public void run() {
try {
// 监听指定的端口号
serverSocket = new ServerSocket(8888);
messageArea.append("等待客户端连接...\n");
// 等待客户端连接请求
clientSocket = serverSocket.accept();
messageArea.append("客户端已连接!\n");
// 获取输入流和输出流
in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
out = new PrintWriter(clientSocket.getOutputStream());
// 循环读取客户端发送的消息
String message;
while ((message = in.readLine()) != null) {
// 将消息显示在消息区中
messageArea.append("客户端: " + message + "\n");
}
// 关闭输入流和输出流
in.close();
out.close();
// 关闭客户端套接字和服务器套接字
clientSocket.close();
serverSocket.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
public static void main(String[] args) {
// 创建服务端窗口
Server server = new Server();
// 启动服务端线程
Thread thread = new Thread(server);
thread.start();
}
}
```
客户端代码:
```
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.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
public class Client extends JFrame implements ActionListener, Runnable {
private static final long serialVersionUID = 1L;
private JTextField ipField;
private JTextField portField;
private JTextField inputField;
private JTextArea messageArea;
private JButton connectButton;
private JButton sendButton;
private Socket clientSocket;
private BufferedReader in;
private PrintWriter out;
public Client() {
super("Client");
// 创建IP地址输入框、端口号输入框、文本输入框、文本区域和发送按钮
ipField = new JTextField(10);
portField = new JTextField(4);
inputField = new JTextField(30);
messageArea = new JTextArea(10, 30);
connectButton = new JButton("连接");
sendButton = new JButton("发送");
// 将输入框和连接按钮添加到面板中
JPanel connectPanel = new JPanel();
connectPanel.add(ipField);
connectPanel.add(portField);
connectPanel.add(connectButton);
// 将输入框和发送按钮添加到面板中
JPanel inputPanel = new JPanel();
inputPanel.add(inputField);
inputPanel.add(sendButton);
// 将消息区添加到滚动面板中
JScrollPane scrollPane = new JScrollPane(messageArea);
// 将面板添加到窗口中
add(connectPanel, BorderLayout.NORTH);
add(inputPanel, BorderLayout.SOUTH);
add(scrollPane, BorderLayout.CENTER);
// 添加事件监听器
connectButton.addActionListener(this);
inputField.addActionListener(this);
sendButton.addActionListener(this);
// 设置窗口大小和可见性
setSize(400, 300);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
@Override
public void actionPerformed(ActionEvent e) {
Object source = e.getSource();
if (source == connectButton) {
// 获取IP地址和端口号
String ipAddress = ipField.getText();
int port = Integer.parseInt(portField.getText());
try {
// 连接服务器
clientSocket = new Socket(ipAddress, port);
messageArea.append("连接成功!\n");
// 获取输入流和输出流
in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
out = new PrintWriter(clientSocket.getOutputStream());
// 启动客户端线程
Thread thread = new Thread(this);
thread.start();
} catch (IOException ex) {
ex.printStackTrace();
}
} else if (source == sendButton || source == inputField) {
// 获取输入框中的文本
String message = inputField.getText();
// 将消息显示在消息区中
messageArea.append("客户端: " + message + "\n");
// 将消息发送给服务端
out.println(message);
out.flush();
// 清空输入框中的文本
inputField.setText("");
}
}
@Override
public void run() {
try {
// 循环读取服务端发送的消息
String message;
while ((message = in.readLine()) != null) {
// 将消息显示在消息区中
messageArea.append("服务端: " + message + "\n");
}
// 关闭输入流和输出流
in.close();
out.close();
// 关闭客户端套接字
clientSocket.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
public static void main(String[] args) {
// 创建客户端窗口
Client client = new Client();
}
}
```
希望这些代码可以帮助您实现Java GUI服务端与客户端通信功能。
阅读全文