一、远程控制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();
}
}
相关推荐
TCP远程控制命令协议 TCP远程控制命令协议 TCP远程控制命令协议 TCP远程控制命令协议 TCP远程控制命令协议 TCP远程控制命令协议
基于TCP_IP协议的家电远程控制系统设计,基于TCP_IP协议的家电远程控制系统设计
基于TCP-IP协议实现上位机对UR机器人的远程控制.pdf基于TCP-IP协议实现上位机对UR机器人的远程控制.pdf基于TCP-IP协议实现上位机对UR机器人的远程控制.pdf基于TCP-IP协议实现上位机对UR机器人的远程控制.pdf基于TCP-...
TCP远程视频控制.rar
功能 远程屏幕 远程cmd 远程进程 远程文件操作等
本文介绍了上位机对UR机器人远程控制的实现方法。UR机器人上具有特定功能的TCP/IP端口,并给出上位机示例程序
在linux环境下实现TCP远程控制,即实现客户端与服务器端的通信
一个远程控制的demo,tcp同步,包括传文件和控制
该程序是我用TCP写的一个小的同步广播,远程控制,群发文件以及 上传文件的小DOME 希望对能用的上的朋友一个小帮助吧
简单的TCP远程控制程序并发服务器模型:服务器在同一时刻可以响应多个 客户的请求。
利用CSocket进行网络传输 服务端能同时连接10个客户端 客户端能同时给服务端上传文件, 和下载文件, 客户端没五秒给客户端发一次握手消息, 客户端可以给服务端发送控制指令控制服务端,
尝试做一个用于远程控制的简单工具, 一般为局域网环境下使用(热点), 使用两种协议 [可选TCP/UDP(默认)], 使用两种截屏方式 [可选D3D/GDI(默认,且Qt自带)]
TCP在同一网络之下的远程控制
RS swm200A系列 c# 代码 有arb调用
Remote Administrator 的最新客户端,可以远程控制你的计 算机,你可以在本地看见远程计算机的屏幕显示,本地的鼠标、 键盘的有关反应也会传送到远程计算机。 它有以下特点: 1.运行速度快。 2.Radmin支持被控端以...
linux下基于TCP协议的远程终端管理系统
基于TCPIP协议的远程控制的设计与实现
VB网络编程,TCP/IP编程。 取得机器地址 远程机器地址 构建客户机服务机
可以远程控制你的计算机,你可以在本地看见远程计算机的屏幕显示,本地的鼠标、键盘的有关反应也会传送到远程计算机。 它有以下特点: 1.运行速度快。 2.Radmin支持被控端以服务的方式运行、支持多个连接和IP 过滤...
XU – 远程控制和文件传输是一个基于TCP\IP协议,聚远程控制和文件传输两种功能为一体, 操作简单,使用方使。能在 windows98\windows me\windows NT\windows2000\windowsXP系统中 稳定运行