Java 实现桌面共享-简单案例

服务器端(共享桌面)

import java.awt.AWTException;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class ScreenSharingServer {
    private static final int PORT = 12345;
    private static final int QUALITY = 80; // 图像质量 (0-100)

    public static void main(String[] args) {
        try (ServerSocket serverSocket = new ServerSocket(PORT)) {
            System.out.println("等待客户端连接...");
            Socket clientSocket = serverSocket.accept();
            System.out.println("客户端已连接");

            try (OutputStream os = clientSocket.getOutputStream();
                 DataOutputStream dos = new DataOutputStream(os)) {

                Robot robot = new Robot();
                Rectangle screenRect = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize());

                while (true) {
                    // 捕获屏幕图像
                    BufferedImage screenImage = robot.createScreenCapture(screenRect);

                    // 将图像转换为字节数组
                    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
                    ImageIO.write(screenImage, "JPEG", byteArrayOutputStream);
                    byte[] imageBytes = byteArrayOutputStream.toByteArray();

                    // 发送图像数据大小
                    dos.writeInt(imageBytes.length);

                    // 发送图像数据
                    dos.write(imageBytes);

                    // 刷新输出流
                    dos.flush();

                    // 延时一小段时间,否则可能会导致客户端无法实时显示
                    Thread.sleep(30);
                }
            } catch (IOException | InterruptedException | AWTException e) {
                e.printStackTrace();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

客户端(接收桌面) 

import java.awt.image.BufferedImage;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;
import java.util.Arrays;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class ScreenSharingClient {
    private static final String SERVER_IP = "127.0.0.1";
    private static final int PORT = 12345;

    public static void main(String[] args) {
        try (Socket clientSocket = new Socket(SERVER_IP, PORT)) {
            System.out.println("连接到服务器");

            try (InputStream is = clientSocket.getInputStream();
                 DataInputStream dis = new DataInputStream(is)) {

                JFrame frame = new JFrame("远程桌面");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setSize(800, 600);
                JLabel label = new JLabel();
                frame.add(label);
                frame.setVisible(true);

                while (true) {
                    // 读取图像数据大小
                    int imageSize = dis.readInt();

                    // 读取图像数据
                    byte[] imageBytes = new byte[imageSize];
                    int bytesRead = 0;
                    while (bytesRead < imageSize) {
                        int count = dis.read(imageBytes, bytesRead, imageSize - bytesRead);
                        if (count < 0) {
                            break;
                        }
                        bytesRead += count;
                    }

                    // 将字节数组转换为图像
                    BufferedImage image = ImageIO.read(new ByteArrayInputStream(imageBytes));

                    // 显示图像
                    ImageIcon icon = new ImageIcon(image.getScaledInstance(frame.getWidth(), frame.getHeight(), Image.SCALE_SMOOTH));
                    label.setIcon(icon);
                    frame.repaint();

                    // 刷新图像显示
                    try {
                        Thread.sleep(30);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
  • 这只是一个基础示例,在实际应用中需要考虑诸多因素,比如网络延迟、丢包、图像压缩效率等,可能需要采用更复杂的协议和算法来保证桌面共享的稳定性和流畅性。

  • 为了保证代码的正常运行,需要导入相应的类,例如在代码中使用了 ImageIO 类,需要在代码上方添加 import javax.imageio.ImageIO; 等导入语句,同时确保项目中包含了必要的依赖库。

  • 由于涉及到网络通信,需要确保服务器和客户端之间的网络是连通的,并且防火墙等安全设置不会阻止相应的端口通信。

  • 该示例中使用了 JPEG 格式对图像进行压缩传输,在实际应用中可以根据需要选择其他更合适的图像压缩格式和参数,以平衡图像质量和传输效率。

你可能感兴趣的:(java,开发语言,后端)