使用JAVA语言,编写一个基于Socket通信,使用四个窗口拼接绘制四叶玫瑰线,每个客户端是一个窗口,通过服务端传输的数据给客户端,在每个客户端绘制一瓣图形的代码。需要每行都有注释。
时间: 2023-12-03 20:42:45 浏览: 39
以下是使用JAVA语言编写的基于Socket通信的四叶玫瑰线绘制程序,包括服务端和客户端:
服务端代码:
```java
import java.net.*;
import java.io.*;
// 服务端类
public class Server {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = null;
Socket clientSocket = null;
try {
// 创建服务端套接字,绑定端口号为8080
serverSocket = new ServerSocket(8080);
System.out.println("服务端已启动,等待客户端连接...");
// 接收客户端连接请求,创建客户端套接字
clientSocket = serverSocket.accept();
System.out.println("客户端已连接:" + clientSocket.getInetAddress().getHostAddress());
// 从客户端接收数据并发送回客户端
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
String inputLine;
while ((inputLine = in.readLine()) != null) {
System.out.println("服务端接收到数据:" + inputLine);
out.println(inputLine);
}
} catch (IOException e) {
System.err.println("服务端异常:" + e.getMessage());
} finally {
// 关闭服务端套接字和客户端套接字
if (clientSocket != null) {
clientSocket.close();
}
if (serverSocket != null) {
serverSocket.close();
}
}
}
}
```
客户端代码:
```java
import java.awt.*;
import java.net.*;
import java.io.*;
import javax.swing.*;
// 客户端类
public class Client {
public static void main(String[] args) throws IOException {
String serverHostname = "localhost";
int serverPort = 8080;
Socket socket = null;
try {
// 创建客户端套接字,连接服务端
socket = new Socket(serverHostname, serverPort);
System.out.println("已连接到服务端:" + socket.getInetAddress().getHostAddress());
// 创建绘图窗口
JFrame frame = new JFrame();
frame.setSize(400, 400);
frame.setTitle("四叶玫瑰线");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
// 获取绘图面板
JPanel panel = new JPanel() {
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
// 绘制四叶玫瑰线
double k = 2 * Math.PI / 4;
double r = 150;
for (double t = 0; t <= Math.PI * 2; t += 0.01) {
double x = r * Math.cos(k * t) * Math.cos(t);
double y = r * Math.cos(k * t) * Math.sin(t);
g.drawLine(200, 200, (int) (200 + x), (int) (200 + y));
}
}
};
frame.add(panel);
// 发送数据给服务端
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
out.println("绘制四叶玫瑰线");
// 接收服务端发送的数据并更新绘图窗口
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String inputLine;
while ((inputLine = in.readLine()) != null) {
System.out.println("客户端接收到数据:" + inputLine);
panel.repaint();
}
} catch (UnknownHostException e) {
System.err.println("客户端异常:" + e.getMessage());
} catch (IOException e) {
System.err.println("客户端异常:" + e.getMessage());
} finally {
// 关闭客户端套接字
if (socket != null) {
socket.close();
}
}
}
}
```
说明:
1. 服务端创建一个ServerSocket对象,并绑定端口号为8080,等待客户端连接请求;
2. 客户端创建一个Socket对象,连接服务端;
3. 客户端创建一个绘图窗口,绘制四叶玫瑰线;
4. 客户端向服务端发送一条消息,表示需要绘制四叶玫瑰线;
5. 服务端接收客户端的消息,并将消息原样发送回客户端;
6. 客户端接收服务端的消息,并更新绘图窗口。
注意事项:
1. 为了简化代码,服务端和客户端都运行在本地,因此服务端的主机名为localhost;
2. 为了方便起见,客户端只实现了单个窗口绘制四叶玫瑰线的功能。如果需要多个客户端同时绘制四叶玫瑰线,可以在客户端程序中添加更多的窗口,并且每个窗口都需要向服务端发送一条消息;
3. 代码中的注释并非完整的注释,只是为了帮助理解代码的功能和作用。在实际开发中,应该尽可能详细地注释代码,以便他人理解和维护。