本文目录导读:

我来为您提供一个完整的Java远程控制案例,包括服务器端(被控端)和客户端(控制端)的完整实现。
项目结构
remote-control/
├── src/
│ ├── server/
│ │ ├── RemoteServer.java
│ │ ├── ScreenCapture.java
│ │ └── CommandExecutor.java
│ └── client/
│ ├── RemoteClient.java
│ └── ScreenViewer.java
服务器端(被控端)
RemoteServer.java - 主服务器类
package server;
import java.io.*;
import java.net.*;
import java.awt.*;
import java.awt.image.*;
import javax.imageio.*;
import java.util.concurrent.*;
public class RemoteServer {
private ServerSocket serverSocket;
private Socket clientSocket;
private boolean running = true;
private final int PORT = 5000;
public void start() {
try {
serverSocket = new ServerSocket(PORT);
System.out.println("远程控制服务器已启动,等待连接...");
System.out.println("服务器IP: " + InetAddress.getLocalHost().getHostAddress());
while (running) {
clientSocket = serverSocket.accept();
System.out.println("客户端已连接: " + clientSocket.getInetAddress());
handleClient(clientSocket);
}
} catch (IOException e) {
e.printStackTrace();
}
}
private void handleClient(Socket socket) {
// 使用线程池处理客户端请求
ExecutorService executor = Executors.newFixedThreadPool(2);
// 屏幕捕获线程
executor.submit(() -> {
try {
sendScreen(socket);
} catch (Exception e) {
System.err.println("屏幕传输错误: " + e.getMessage());
}
});
// 命令接收线程
executor.submit(() -> {
try {
receiveCommands(socket);
} catch (Exception e) {
System.err.println("命令接收错误: " + e.getMessage());
}
});
}
private void sendScreen(Socket socket) {
try {
OutputStream os = socket.getOutputStream();
Robot robot = new Robot();
Rectangle screenRect = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize());
while (running && !socket.isClosed()) {
try {
BufferedImage image = robot.createScreenCapture(screenRect);
// 压缩图片以提高传输效率
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(image, "jpg", baos);
byte[] imageBytes = baos.toByteArray();
// 发送图片大小和图片数据
DataOutputStream dos = new DataOutputStream(os);
dos.writeInt(imageBytes.length);
dos.write(imageBytes);
dos.flush();
// 控制传输频率
Thread.sleep(100); // 10fps
} catch (Exception e) {
break;
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
private void receiveCommands(Socket socket) {
try {
InputStream is = socket.getInputStream();
DataInputStream dis = new DataInputStream(is);
while (running && !socket.isClosed()) {
String command = dis.readUTF();
System.out.println("收到命令: " + command);
// 执行命令
if (command.startsWith("SHELL:")) {
CommandExecutor.execute(command.substring(6));
} else if (command.startsWith("MOUSE:")) {
handleMouseCommand(command.substring(6));
} else if (command.startsWith("KEY:")) {
handleKeyCommand(command.substring(4));
} else if (command.equals("SHUTDOWN")) {
shutdown();
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
private void handleMouseCommand(String command) {
try {
Robot robot = new Robot();
String[] parts = command.split(",");
if (parts[0].equals("CLICK")) {
robot.mousePress(InputEvent.BUTTON1_MASK);
robot.mouseRelease(InputEvent.BUTTON1_MASK);
} else if (parts[0].equals("MOVE")) {
int x = Integer.parseInt(parts[1]);
int y = Integer.parseInt(parts[2]);
robot.mouseMove(x, y);
}
} catch (Exception e) {
e.printStackTrace();
}
}
private void handleKeyCommand(String command) {
try {
Robot robot = new Robot();
if (command.equals("ENTER")) {
robot.keyPress(KeyEvent.VK_ENTER);
robot.keyRelease(KeyEvent.VK_ENTER);
}
// 可以扩展其他键盘操作
} catch (Exception e) {
e.printStackTrace();
}
}
public void shutdown() {
running = false;
try {
if (clientSocket != null) clientSocket.close();
if (serverSocket != null) serverSocket.close();
System.out.println("服务器已关闭");
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
new RemoteServer().start();
}
}
CommandExecutor.java - 命令执行器
package server;
import java.io.*;
import java.util.Scanner;
public class CommandExecutor {
public static void execute(String command) {
try {
Process process = Runtime.getRuntime().exec(command);
// 读取命令输出
BufferedReader reader = new BufferedReader(
new InputStreamReader(process.getInputStream())
);
String line;
StringBuilder output = new StringBuilder();
while ((line = reader.readLine()) != null) {
output.append(line).append("\n");
System.out.println("命令输出: " + line);
}
process.waitFor();
} catch (Exception e) {
System.err.println("命令执行错误: " + e.getMessage());
}
}
}
客户端(控制端)
RemoteClient.java - 客户端主类
package client;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
public class RemoteClient extends JFrame {
private Socket socket;
private DataOutputStream dos;
private ScreenViewer screenViewer;
private JTextField ipField;
private JButton connectButton;
private JLabel statusLabel;
public RemoteClient() {
initUI();
}
private void initUI() {
setTitle("远程控制客户端");
setSize(1200, 800);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 顶部控制面板
JPanel controlPanel = new JPanel();
controlPanel.setLayout(new BorderLayout());
// 连接设置面板
JPanel connectionPanel = new JPanel(new FlowLayout());
connectionPanel.add(new JLabel("服务器IP:"));
ipField = new JTextField("localhost", 15);
connectionPanel.add(ipField);
connectButton = new JButton("连接");
connectButton.addActionListener(e -> connectToServer());
connectionPanel.add(connectButton);
// 命令输入面板
JPanel commandPanel = new JPanel();
commandPanel.setLayout(new BorderLayout());
JTextField commandField = new JTextField();
commandField.addActionListener(e -> {
if (socket != null && socket.isConnected()) {
sendCommand("SHELL:" + commandField.getText());
commandField.setText("");
}
});
commandPanel.add(new JLabel("命令:"), BorderLayout.WEST);
commandPanel.add(commandField, BorderLayout.CENTER);
statusLabel = new JLabel("未连接");
statusLabel.setHorizontalAlignment(SwingConstants.CENTER);
controlPanel.add(connectionPanel, BorderLayout.NORTH);
controlPanel.add(commandPanel, BorderLayout.CENTER);
controlPanel.add(statusLabel, BorderLayout.SOUTH);
add(controlPanel, BorderLayout.NORTH);
// 屏幕显示区域
screenViewer = new ScreenViewer();
add(screenViewer, BorderLayout.CENTER);
}
private void connectToServer() {
try {
String serverIP = ipField.getText();
socket = new Socket(serverIP, 5000);
dos = new DataOutputStream(socket.getOutputStream());
statusLabel.setText("已连接: " + serverIP);
connectButton.setText("已连接");
connectButton.setEnabled(false);
// 启动屏幕接收线程
new Thread(() -> receiveScreen()).start();
} catch (IOException ex) {
JOptionPane.showMessageDialog(this,
"连接失败: " + ex.getMessage(),
"错误", JOptionPane.ERROR_MESSAGE);
}
}
private void receiveScreen() {
try {
DataInputStream dis = new DataInputStream(socket.getInputStream());
while (socket != null && !socket.isClosed()) {
int size = dis.readInt();
byte[] imageBytes = new byte[size];
dis.readFully(imageBytes);
ByteArrayInputStream bais = new ByteArrayInputStream(imageBytes);
Image image = Toolkit.getDefaultToolkit().createImage(imageBytes);
SwingUtilities.invokeLater(() -> {
screenViewer.updateImage(image);
});
}
} catch (Exception e) {
e.printStackTrace();
}
}
private void sendCommand(String command) {
try {
if (dos != null) {
dos.writeUTF(command);
dos.flush();
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
new RemoteClient().setVisible(true);
});
}
}
ScreenViewer.java - 屏幕显示器
package client;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class ScreenViewer extends JPanel {
private Image currentImage;
private boolean mouseClick = false;
public ScreenViewer() {
setBackground(Color.DARK_GRAY);
// 鼠标事件处理
addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
mouseClick = true;
}
@Override
public void mouseReleased(MouseEvent e) {
mouseClick = false;
}
});
addMouseMotionListener(new MouseMotionAdapter() {
@Override
public void mouseMoved(MouseEvent e) {
// 发送鼠标位置
sendMousePosition(e.getX(), e.getY());
}
});
}
private void sendMousePosition(int x, int y) {
// 通过回调通知客户端发送鼠标位置
// 简单起见,这里只做演示
System.out.println("鼠标位置: " + x + ", " + y);
}
public void updateImage(Image image) {
this.currentImage = image;
repaint();
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (currentImage != null) {
// 保持比例缩放
Dimension screenSize = new Dimension(currentImage.getWidth(null), currentImage.getHeight(null));
double scaleX = getWidth() / (double) screenSize.width;
double scaleY = getHeight() / (double) screenSize.height;
double scale = Math.min(scaleX, scaleY);
int width = (int)(screenSize.width * scale);
int height = (int)(screenSize.height * scale);
g.drawImage(currentImage, 0, 0, width, height, this);
} else {
g.setColor(Color.WHITE);
g.setFont(new Font("SansSerif", Font.BOLD, 24));
g.drawString("等待屏幕图像...", getWidth()/2 - 100, getHeight()/2);
}
}
}
增强功能示例
文件传输功能
// 添加文件传输功能到服务器
public void sendFile(String filePath) {
try {
File file = new File(filePath);
if (!file.exists()) {
System.out.println("文件不存在: " + filePath);
return;
}
// 发送文件传输命令
dos.writeUTF("FILE:" + file.getName());
dos.writeLong(file.length());
FileInputStream fis = new FileInputStream(file);
byte[] buffer = new byte[8192];
int bytesRead;
while ((bytesRead = fis.read(buffer)) != -1) {
dos.write(buffer, 0, bytesRead);
}
fis.close();
dos.flush();
System.out.println("文件发送完成: " + filePath);
} catch (Exception e) {
e.printStackTrace();
}
}
使用说明
启动服务器
java server.RemoteServer
启动客户端
java client.RemoteClient
测试命令
SHELL:dir- 在Windows上执行目录列表SHELL:pwd- 显示当前目录MOUSE:CLICK- 模拟鼠标点击SHUTDOWN- 关闭服务器
安全注意事项
- 身份验证:生产环境必须添加身份验证机制
- 加密传输:建议使用SSL/TLS加密所有通信
- 防火墙限制:仅允许受信任的IP地址连接
- 会话管理:实现会话超时和访问控制
- 操作日志:记录所有远程操作
这个案例提供了一个基础的远程控制系统,可以根据实际需求进行扩展和增强,注意在生产环境中使用时要充分考虑安全性。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播