请用java编写图形用户界面,教师为服务器端,学生为客户端,一个服务端可以接受多个客户端连接。2. 要求完成教师白板的建立,实现教师在白板上画图,学生端能够实时刷新。3. 教师可以传输文件给学生。4. 学生可以向教师提问,问答内容所有学生都能看到
时间: 2024-03-23 16:42:40 浏览: 14
这是一个比较复杂的问题,需要用到Java的GUI编程和网络编程知识。以下是一个简单的代码示例,仅供参考。
服务端代码:
```java
import java.io.*;
import java.net.*;
import java.util.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Server extends JFrame implements ActionListener {
private JTextArea textArea;
private JButton sendButton;
private ServerSocket serverSocket;
private List<Socket> clientSockets;
public Server() {
super("教师端");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
textArea = new JTextArea();
JScrollPane scrollPane = new JScrollPane(textArea);
add(scrollPane, BorderLayout.CENTER);
sendButton = new JButton("发送");
sendButton.addActionListener(this);
add(sendButton, BorderLayout.SOUTH);
setSize(400, 300);
setVisible(true);
try {
serverSocket = new ServerSocket(8888);
clientSockets = new ArrayList<Socket>();
while (true) {
Socket socket = serverSocket.accept();
clientSockets.add(socket);
new Thread(new ClientHandler(socket)).start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
public void actionPerformed(ActionEvent e) {
String message = textArea.getText();
textArea.setText("");
broadcast("教师:" + message);
}
private void broadcast(String message) {
for (Socket socket : clientSockets) {
try {
PrintWriter out = new PrintWriter(socket.getOutputStream());
out.println(message);
out.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
}
private class ClientHandler implements Runnable {
private Socket socket;
public ClientHandler(Socket socket) {
this.socket = socket;
}
public void run() {
try {
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
while (true) {
String message = in.readLine();
if (message == null) {
break;
}
textArea.append(message + "\n");
}
clientSockets.remove(socket);
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
new Server();
}
}
```
客户端代码:
```java
import java.io.*;
import java.net.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
public class Client extends JFrame implements ActionListener {
private JPanel panel;
private JTextArea textArea;
private JTextField textField;
private JButton sendButton;
private Socket socket;
private BufferedImage image;
private Graphics2D graphics;
public Client() {
super("学生端");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
panel = new JPanel();
panel.setLayout(new BorderLayout());
add(panel);
textArea = new JTextArea();
textArea.setEditable(false);
JScrollPane scrollPane = new JScrollPane(textArea);
panel.add(scrollPane, BorderLayout.CENTER);
textField = new JTextField();
panel.add(textField, BorderLayout.SOUTH);
sendButton = new JButton("发送");
sendButton.addActionListener(this);
panel.add(sendButton, BorderLayout.EAST);
setSize(400, 300);
setVisible(true);
try {
socket = new Socket("localhost", 8888);
new Thread(new ServerHandler()).start();
} catch (IOException e) {
e.printStackTrace();
}
image = new BufferedImage(400, 300, BufferedImage.TYPE_INT_RGB);
graphics = (Graphics2D)image.getGraphics();
graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
graphics.setPaint(Color.WHITE);
graphics.fillRect(0, 0, 400, 300);
panel.getGraphics().drawImage(image, 0, 0, null);
new Thread(new ServerImageHandler()).start();
}
public void actionPerformed(ActionEvent e) {
String message = textField.getText();
textField.setText("");
try {
PrintWriter out = new PrintWriter(socket.getOutputStream());
out.println("学生:" + message);
out.flush();
} catch (IOException ex) {
ex.printStackTrace();
}
}
private void drawLine(int x1, int y1, int x2, int y2) {
graphics.drawLine(x1, y1, x2, y2);
panel.getGraphics().drawImage(image, 0, 0, null);
try {
ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());
out.writeObject(new DrawLineMessage(x1, y1, x2, y2));
out.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
private void clear() {
graphics.setPaint(Color.WHITE);
graphics.fillRect(0, 0, 400, 300);
panel.getGraphics().drawImage(image, 0, 0, null);
try {
ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());
out.writeObject(new ClearMessage());
out.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
private class ServerHandler implements Runnable {
public void run() {
try {
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
while (true) {
String message = in.readLine();
if (message == null) {
break;
}
textArea.append(message + "\n");
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
private class ServerImageHandler implements Runnable {
public void run() {
try {
ObjectInputStream in = new ObjectInputStream(socket.getInputStream());
while (true) {
Object message = in.readObject();
if (message instanceof DrawLineMessage) {
DrawLineMessage drawLineMessage = (DrawLineMessage)message;
graphics.drawLine(drawLineMessage.x1, drawLineMessage.y1, drawLineMessage.x2, drawLineMessage.y2);
panel.getGraphics().drawImage(image, 0, 0, null);
} else if (message instanceof ClearMessage) {
ClearMessage clearMessage = (ClearMessage)message;
graphics.setPaint(Color.WHITE);
graphics.fillRect(0, 0, 400, 300);
panel.getGraphics().drawImage(image, 0, 0, null);
}
}
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
private class DrawLineMessage implements Serializable {
public int x1, y1, x2, y2;
public DrawLineMessage(int x1, int y1, int x2, int y2) {
this.x1 = x1;
this.y1 = y1;
this.x2 = x2;
this.y2 = y2;
}
}
private class ClearMessage implements Serializable {
}
public static void main(String[] args) {
new Client();
}
}
```
这个示例实现了教师和学生之间的简单聊天和绘图交互。实现文件传输和问答功能需要更多的代码和协议设计。