使用java语言基于Socket通信,使用四个窗口拼接绘制四叶玫瑰线,每个窗口绘制一瓣图形
时间: 2024-03-09 07:47:08 浏览: 189
好的,这里是一个使用 Java 语言基于 Socket 通信,使用四个窗口拼接绘制四叶玫瑰线的示例程序。
我们可以使用 Java Swing 库来创建窗口并绘制图形。在每个窗口中,我们可以使用极坐标来计算每个点的坐标,然后将这些点连接起来,形成图形。我们可以使用 Java 的 Socket 类进行通信,将计算好的图形数据传输给客户端并在客户端上进行绘制。
以下是一个简单的示例程序,其中包含了服务器端和客户端的代码。这个程序使用了多线程技术,可以同时处理多个客户端的连接。
服务器端代码:
```java
import java.io.*;
import java.net.*;
public class Server {
public static void main(String[] args) {
try {
// 创建服务器 Socket
ServerSocket serverSocket = new ServerSocket(8888);
while (true) {
// 等待客户端连接
Socket socket = serverSocket.accept();
// 创建线程处理客户端请求
Thread thread = new Thread(new ClientHandler(socket));
thread.start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
// 客户端处理线程
static class ClientHandler implements Runnable {
private Socket socket;
public ClientHandler(Socket socket) {
this.socket = socket;
}
public void run() {
try {
// 创建输出流
OutputStream outputStream = socket.getOutputStream();
PrintWriter writer = new PrintWriter(outputStream);
// 计算四叶玫瑰线
int a = 100;
int n = 2;
int width = 400;
int height = 400;
int[][] data = new int[4][];
for (int i = 0; i < 4; i++) {
data[i] = new int[width / 2];
for (int j = 0; j < width / 2; j++) {
double theta = j * 2 * Math.PI / (width / 2);
double r = a * Math.cos(2 * n * theta + i * Math.PI / 2);
int x = (int) (r * Math.cos(theta));
int y = (int) (r * Math.sin(theta));
data[i][j] = (x << 16) | y;
}
}
// 发送数据
writer.println(width / 2);
writer.println(height / 2);
for (int i = 0; i < 4; i++) {
for (int j = 0; j < width / 2; j++) {
writer.println(data[i][j]);
}
}
writer.flush();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
```
在这个程序中,我们创建了一个 ServerSocket 对象,监听 8888 端口。当有客户端连接时,就创建一个新的线程来处理客户端请求。在处理线程中,我们计算了四叶玫瑰线的数据,并将数据发送给客户端。
客户端代码:
```java
import java.awt.*;
import java.io.*;
import java.net.*;
import javax.swing.*;
public class Client {
public static void main(String[] args) {
// 创建窗口
JFrame frame = new JFrame("Four-Leaf Rose");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(400, 400);
frame.setLayout(new GridLayout(2, 2));
// 创建四个画布
Canvas canvas1 = new Canvas();
Canvas canvas2 = new Canvas();
Canvas canvas3 = new Canvas();
Canvas canvas4 = new Canvas();
frame.add(canvas1);
frame.add(canvas2);
frame.add(canvas3);
frame.add(canvas4);
try {
// 连接服务器
Socket socket = new Socket("localhost", 8888);
// 创建输入流
InputStream inputStream = socket.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
// 读取数据
int width = Integer.parseInt(reader.readLine());
int height = Integer.parseInt(reader.readLine());
int[][] data = new int[4][];
for (int i = 0; i < 4; i++) {
data[i] = new int[width / 2];
for (int j = 0; j < width / 2; j++) {
data[i][j] = Integer.parseInt(reader.readLine());
}
}
socket.close();
// 在画布上绘制图形
Graphics g1 = canvas1.getGraphics();
Graphics g2 = canvas2.getGraphics();
Graphics g3 = canvas3.getGraphics();
Graphics g4 = canvas4.getGraphics();
for (int i = 0; i < width / 2; i++) {
g1.drawLine(width / 4, height / 4, width / 4 + (data[0][i] >> 16), height / 4 + (data[0][i] & 0xFFFF));
g2.drawLine(width / 4, height / 4, width / 4 + (data[1][i] >> 16), height / 4 + (data[1][i] & 0xFFFF));
g3.drawLine(width / 4, height / 4, width / 4 + (data[2][i] >> 16), height / 4 + (data[2][i] & 0xFFFF));
g4.drawLine(width / 4, height / 4, width / 4 + (data[3][i] >> 16), height / 4 + (data[3][i] & 0xFFFF));
}
} catch (IOException e) {
e.printStackTrace();
}
frame.setVisible(true);
}
}
```
在这个程序中,我们创建了一个 JFrame 对象,包含了四个 Canvas 对象,用于绘制四叶玫瑰线的四瓣图形。我们使用 Socket 类连接服务器,并获取计算好的图形数据。然后,在每个画布上绘制图形。
需要注意的是,在服务器端和客户端中,我们使用了 int[][] 数组来存储图形数据。每个元素都是一个 32 位整数,其中高 16 位存储 x 坐标,低 16 位存储 y 坐标。在客户端中,我们使用位运算符来获取 x 和 y 坐标。
希望这个示例程序能够帮到您!
阅读全文