生成代码 java共享白板
时间: 2023-08-09 16:12:30 浏览: 50
以下是一个简单的Java共享白板的代码示例,实现了多客户端之间的共享绘图:
服务器端代码:
```java
import java.io.*;
import java.net.*;
import java.util.*;
public class Server {
private List<Socket> clients = new ArrayList<>();
private ServerSocket server;
public Server(int port) {
try {
server = new ServerSocket(port);
} catch (IOException e) {
e.printStackTrace();
}
}
public void start() {
System.out.println("Server started.");
while (true) {
try {
Socket client = server.accept();
clients.add(client);
System.out.println("New client connected from " + client.getInetAddress().getHostAddress());
new Thread(new ClientHandler(client)).start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
private class ClientHandler implements Runnable {
private Socket client;
private ObjectInputStream in;
private ObjectOutputStream out;
public ClientHandler(Socket client) {
this.client = client;
try {
in = new ObjectInputStream(client.getInputStream());
out = new ObjectOutputStream(client.getOutputStream());
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void run() {
Object data;
while (true) {
try {
data = in.readObject();
for (Socket c : clients) {
if (c != client) {
ObjectOutputStream cOut = new ObjectOutputStream(c.getOutputStream());
cOut.writeObject(data);
cOut.flush();
}
}
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
clients.remove(client);
break;
}
}
}
}
public static void main(String[] args) {
Server server = new Server(8888);
server.start();
}
}
```
客户端代码:
```java
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
import javax.swing.*;
public class Client {
private Socket socket;
private ObjectOutputStream out;
private ObjectInputStream in;
private WhiteBoard board;
public Client(String host, int port) {
try {
socket = new Socket(host, port);
out = new ObjectOutputStream(socket.getOutputStream());
in = new ObjectInputStream(socket.getInputStream());
} catch (IOException e) {
e.printStackTrace();
}
}
public void start() {
SwingUtilities.invokeLater(() -> {
board = new WhiteBoard();
board.setVisible(true);
board.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
try {
socket.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
});
});
Object data;
while (true) {
try {
data = in.readObject();
if (data instanceof WhiteBoardData) {
SwingUtilities.invokeLater(() -> {
board.draw((WhiteBoardData) data);
});
}
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
break;
}
}
}
private class WhiteBoard extends JFrame {
private JPanel canvas;
public WhiteBoard() {
setTitle("White Board");
setSize(800, 600);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
canvas = new JPanel();
canvas.setBackground(Color.WHITE);
canvas.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
try {
out.writeObject(new WhiteBoardData(e.getX(), e.getY(), true));
out.flush();
} catch (IOException ex) {
ex.printStackTrace();
}
}
@Override
public void mouseReleased(MouseEvent e) {
try {
out.writeObject(new WhiteBoardData(e.getX(), e.getY(), false));
out.flush();
} catch (IOException ex) {
ex.printStackTrace();
}
}
});
add(canvas);
}
public void draw(WhiteBoardData data) {
Graphics g = canvas.getGraphics();
g.setColor(Color.BLACK);
if (data.isStart()) {
g.fillOval(data.getX() - 5, data.getY() - 5, 10, 10);
} else {
g.drawLine(data.getX(), data.getY(), data.getLastX(), data.getLastY());
}
}
}
private static class WhiteBoardData implements Serializable {
private int x, y;
private int lastX, lastY;
private boolean start;
public WhiteBoardData(int x, int y, boolean start) {
this.x = x;
this.y = y;
this.start = start;
}
public int getX() {
return x;
}
public int getY() {
return y;
}
public int getLastX() {
return lastX;
}
public int getLastY() {
return lastY;
}
public boolean isStart() {
return start;
}
public void setLastX(int lastX) {
this.lastX = lastX;
}
public void setLastY(int lastY) {
this.lastY = lastY;
}
}
public static void main(String[] args) {
Client client = new Client("localhost", 8888);
client.start();
}
}
```
以上代码实现了一个简单的Java共享白板,可以同时有多个客户端进行绘图,并实时共享绘图数据。