一、远程控制TCP版
1、主要技术过程
由客户端来控制服务器,服务器不断将自己的桌面截图通过套接字发送给客户端,客户端得到截图,画在面板上,客户端的鼠标动作全部发送给服务器,服务器接收到客户端发来的鼠标动作,执行相应动作。
客户端:不断接收图片的线程,和发送鼠标动作和位置。
服务器:线程不断发送图片,线程不断接收鼠标坐标和位置。
注意事项:鼠标事件得到的左键滑轮右键按下时候的值,和robot函数执行mousePress()方法传入的参数对应的左键滑轮右键额值不一样,需要做一下转换,不能直接来拿用。
2、实现过程
2.1客户端UI
a、采用
BorderLayout布局模式,中间放滚动面板,再放到中间,最下面可以填写ip 端口和链接服务器按钮
2.2客户端连接服务器
// 按钮监听器
class MyListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
// 获得Ip@端口
String ip = ipField.getText();
String port = portField.getText();
int intPort = Integer.parseInt(port);
try {
// 创建客户端套接字,连接服务端
Socket socket = new Socket(ip, intPort);
OutputStream ops = socket.getOutputStream();
// 需要发送int,String,要包装成对象流
oos = new ObjectOutputStream(ops);
// 不停的接受服务端发来的图片
RecieveThread rt = new RecieveThread(socket, panel);
rt.start();
} catch (Exception e1) {
// 弹出错误提示框
JOptionPane.showMessageDialog(null, "网络异常,无法连接服务器!");
e1.printStackTrace();
}
}
}
2.3客户端发送鼠标信息
class MyMouseListener implements MouseListener, MouseMotionListener {
@Override
public void mousePressed(MouseEvent e) {
// 得到鼠标的位置
int x = e.getX();
int y = e.getY();
// 得到按下的是哪一个键
int btnNum = e.getButton();
String type = "pressed";
if (oos != null) {
try {
oos.writeInt(x);
oos.writeInt(y);
oos.writeInt(btnNum);
oos.writeObject(type);
oos.flush();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
@Override
public void mouseReleased(MouseEvent e) {
int x = e.getX();
int y = e.getY();
// 得到按下的是哪一个键
int btnNum = e.getButton();
String type = "released";
if (oos != null) {
try {
oos.writeInt(x);
oos.writeInt(y);
oos.writeInt(btnNum);
oos.writeObject(type);
oos.flush();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
public void mouseDragged(MouseEvent e) {
}
public void mouseMoved(MouseEvent e) {
int x = e.getX();
int y = e.getY();
// 得到按下的是哪一个键
int btnNum = e.getButton();
String type = "moved";
if (oos != null) {
try {
oos.writeInt(x);
oos.writeInt(y);
oos.writeInt(btnNum);
oos.writeObject(type);
oos.flush();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
}
}
2.4连击服务器之后启动线程,不断获取套接字输入流发来的图片
// 创建客户端套接字,连接服务端
Socket socket = new Socket(ip, intPort);
OutputStream ops = socket.getOutputStream();
// 需要发送int,String,要包装成对象流
oos = new ObjectOutputStream(ops);
// 不停的接受服务端发来的图片
RecieveThread rt = new RecieveThread(socket, panel);
rt.start();
2.5绘制收到的图片
try {
// 从Socket上获得输入流
InputStream ips = socket.getInputStream();
// 由于接受的是对象流
ObjectInputStream ois = new ObjectInputStream(ips);
while (true) {
// 读取对象,由于发送的是ImageIcon,这里可以强制转型成ImageIcon
Object obj = ois.readObject();
ImageIcon icon = (ImageIcon) obj;
//获得图像大小(即为服务端桌面大小)
int width = icon.getIconWidth();
int height = icon.getIconHeight();
//修改panel大小为服务端桌面大小
panel.setPreferredSize(new Dimension(width,height));
//获得画布
Graphics g = panel.getGraphics();
g.drawImage(icon.getImage(), 0,0, null);
}
} catch (Exception e) {
e.printStackTrace();
}
2.6服务器端,一旦客户机连接上,启动线程,向其发送图片,这个时候可以将套接字的字节输出流,包装成对象输出路,这样方便操作。
// 初始化服务端的方法
public void initServer() throws IOException {
// 创建服务端套接字对象
ServerSocket server = new ServerSocket(10010);
System.out.println("服务器已经启动,等待连接");
// 等待客户端连接,如果有客户端连接上,会收到客户端套接字
Socket socket = server.accept();
System.out.println("一个客户端连上了"+socket.getRemoteSocketAddress());
// 启动一个线程来给客户端发送服务端桌面
SendThread st = new SendThread(socket);
st.start();
//启动一个线程来接收客户端发来的控制消息
RecieveThread rt = new RecieveThread(socket);
rt.start();
}
2.7服务器发送图片主要代码
try {
//从套接字上获得输出流
OutputStream ops = socket.getOutputStream();
//包装成对象流
ObjectOutputStream oos = new ObjectOutputStream(ops);
// 创建一个机器人对象,用来截屏
Robot robot = new Robot();
while (true) {
// 获得屏幕的分辨率
Toolkit tool = Toolkit.getDefaultToolkit();
Dimension dim = tool.getScreenSize();
// 要截取的起始点
Point p = new Point(0, 0);
// 指定截取的区域
Rectangle rect = new Rectangle(p, dim);
// 开始截屏,获得截取到的图像
BufferedImage img = robot.createScreenCapture(rect);
//由于BufferedImage没有实现序列化,不能写到IO中
//将BufferedImage包装成可写入IO的图像对象
ImageIcon icon = new ImageIcon(img);
//写出对象
oos.writeObject(icon);
oos.flush();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} catch (Exception e1) {
e1.printStackTrace();
}
}
2.8服务器接收鼠标信息,做出动作
Robot robot = new Robot();
InputStream ips = socket.getInputStream();
// 接收的是对象流的消息,包装成对象输入流
ObjectInputStream ois = new ObjectInputStream(ips);
while (true) {
// 收和发的顺序要一致
int x = ois.readInt();
int y = ois.readInt();
int btnNum = ois.readInt();
String type = (String) ois.readObject();
//这里函数参数对应的鼠标左键中建和右键的值,和鼠标事件得到的值不一样,在这里需要做一下转换
int btnMask = InputEvent.BUTTON1_MASK;
if (btnNum == MouseEvent.BUTTON1) {
btnMask = InputEvent.BUTTON1_MASK;
} else if (btnNum == MouseEvent.BUTTON2) {
btnMask = InputEvent.BUTTON2_MASK;
} else if (btnNum == MouseEvent.BUTTON3) {
btnMask = InputEvent.BUTTON3_MASK;
}
if ("pressed".equals(type)) {
// 移送光标到xy
robot.mouseMove(x, y);
robot.mousePress(btnMask);// 按下对应的鼠标按键
} else if ("released".equals(type)) {
// 移送光标到xy
robot.mouseMove(x, y);
robot.mouseRelease(btnMask);
} else if ("moved".equals(type)) {
// 移送光标到xy
robot.mouseMove(x, y);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
相关推荐
总的来说,这个MFC版的远程控制软件利用了MFC的强大UI设计能力和TCP的稳定通信特性,实现了丰富的远程操作功能。开发这样的系统需要深入理解Windows编程、网络通信和多线程技术,同时也需要注意安全性和性能优化。...
远程控制技术则是通过网络在一台计算机上操作另一台计算机,实现远程管理和监控。在这个主题中,我们将深入探讨易语言在实现远程控制方面的应用。 首先,易语言远程控制源码是用于构建远程控制软件的基础。源码是...
### TCP远程控制命令协议解析 #### 一、概述 TCP远程控制命令协议是基于TCP/IP协议族中的传输控制协议(TCP)的一种应用层协议。它主要用于实现无线局域网内的可靠网络通信,通过构建C/S架构(即客户端/服务器架构...
【VB远程控制技术详解】 VB(Visual Basic)是微软公司推出的一种面向对象的、基于事件驱动的编程语言,因其易学易用而受到广大程序员的欢迎。在远程控制领域,VB同样可以发挥重要作用,实现远程桌面连接、文件传输...
1. **连接建立**:远程控制通常通过网络协议(如TCP/IP)建立连接。客户端和服务器端需要进行身份验证和加密通信,以确保数据的安全传输。常见的连接方式有TCP连接、HTTP/HTTPS隧道、P2P等。 2. **隐藏机制**:免杀...
1. **远程控制原理**:远程控制基于TCP/IP协议,通过建立安全的网络连接,将用户的输入指令传输到远程设备,并将远程设备的屏幕反馈回本地。常见的远程桌面协议有RDP(远程桌面协议)、VNC(虚拟网络计算)和...
TCP/IP传输文件远程控制聊天室是一种基于C/S(Client/Server)开发模型的网络应用程序,它允许客户端通过网络与服务器进行交互,实现文件的上传和下载,以及远程控制功能。在此系统中,服务端能够同时处理最多10个...
基于TCP-IP协议实现上位机对UR机器人的远程控制.pdf基于TCP-IP协议实现上位机对UR机器人的远程控制.pdf基于TCP-IP协议实现上位机对UR机器人的远程控制.pdf基于TCP-IP协议实现上位机对UR机器人的远程控制.pdf基于TCP-...
本主题聚焦于“基于TCP/IP协议实现上位机对UR机器人的远程控制”,这是一项利用网络通信技术来实现远程操作和监控UR机器人的重要技术。下面我们将详细探讨这一技术的原理、步骤以及实现过程中可能遇到的关键知识点。...
本资源提供的“易语言远程控制实现源码”是一个基于易语言编写的远程控制程序的源代码,对于想要学习远程控制技术或易语言编程的开发者来说,是一个很好的学习材料。 远程控制技术是一种允许一个设备或程序(通常...
在易语言中实现远程控制,可能需要使用到如TCP/IP协议库进行网络通信,以及创建进程、读写注册表等技术来模拟本地操作。 CGepfoXF.e和uL4iLwqJ.e这两个文件可能是易语言编译后的可执行文件,分别代表客户端(Client...
首先,要实现远程控制桌面,我们需要理解基础的网络通信概念,如套接字(Sockets)编程和TCP/IP协议。C#中的System.Net命名空间提供了用于网络通信的类,如TcpClient和TcpListener,它们可以帮助我们建立客户端和...
标题中的“TCP.rar_DEMO_TCP传文件_tcp_tcp 传文件_远程控制”表明这是一个关于TCP协议的示例项目,特别关注的是如何通过TCP协议进行文件传输以及实现远程控制功能。TCP(Transmission Control Protocol)是一种面向...
1. **网络通信协议**:远程控制需要一种可靠的网络协议,如TCP/IP,来确保数据的完整性和顺序。同时,为了减少延迟,可能会使用UDP或其他优化的协议。 2. **加密技术**:为了保护隐私和数据安全,远程控制软件会...
本教程将详细讲解如何在Linux环境下实现TCP远程控制,包括客户端与服务器端的通信机制。 首先,理解TCP的基本概念至关重要。TCP通过三次握手建立连接,确保数据传输前双方都已经准备好。在握手过程中,客户端发送一...
在本资源"TCP远程视频控制.rar"中,我们可以推测这是一个使用TCP协议实现的远程视频控制系统,可能由易语言(E语言)编写。易语言是一种中文编程语言,设计目标是降低编程的难度,使不懂英文的用户也能进行软件开发...
远程控制的基本原理是通过网络通信协议,如TCP/IP,将用户的输入指令从一台计算机(客户端)传输到另一台计算机(服务器端),同时将服务器端的屏幕反馈信息发送回客户端。这种交互过程使得用户仿佛直接操作远程...
远程控制的核心技术包括套接字编程、网络通信协议(如TCP/IP)和数据编码解码。在Delphi中,我们可以使用TClientSocket和TServerSocket组件来实现客户端和服务器端的通信。TClientSocket用于建立到服务器的连接,...
DELPHI远程控制源码是一种基于DELPHI编程语言实现的远程桌面控制解决方案。DELPHI,全称为Borland Delphi,是一款强大的Windows应用程序开发工具,它使用Object Pascal语言,以其高效的编译器和直观的可视化设计界面...