Java远程操控
远程操控原理:
远程操控的实质就是操控方发送鼠标事件,接收被操控方发送来的截图。
被操控方截图发送,获取鼠标事件然后用一个机器人对象来操控鼠标键盘。
Java实现C/S远程操控:
单纯的C/S远程操控是很简单的,只要一方接受截图发送事件,另一边做相反操作就可以了。
但若是两个通过服务器的连接,让两个客户端实现远程操控,难度就大大提高。
这两天我就是在我的HuaXinIM聊项目中实现了有服务器转发操作的远程操作,我知道服务器只要转发这几个条件,但是死活搞了很久,用了几个线程死循环来做,也获取了几个输入输出流,代码结构相当复杂,混乱,后来我重新编写,只用了原来的输入输出流,线程也删除了,讲读写的代码都封装到方法里面,终于把问题解决了。
但是其中测试操控鼠标的时候,卡住了,应该是单机测试的局限,服务器即客户端,所以不断的递归返回新的新事件,截图确确实实的可以实现。
有服务器转发的远程控制部分代码:
服务端转发截图:
else if( type.equals("getPicture") ){
int length = ois.readInt();
byte[] bytes = new byte[length];
ois.readFully(bytes);
SocketDistanceControl.getPicture(length, bytes);
}
public static void getPicture(int length,byte[] bytes) {//截图的收发:被控制方发送截图给控制方
try {
String msg = "<choice>getPicture</choice>";
coos.writeUTF(msg);
coos.flush();
coos.writeInt(length);//发送一个int值
coos.flush();
coos.write(bytes);//发送图片数组
coos.flush();
} catch (Exception e) {
e.printStackTrace();
}
}
服务器转发鼠标事件:
else if( type.equals("getObject") ){
Object object = ois.readObject();
// SocketDistanceControl.getEvent(object);
}
public static void getEvent(Object object){
try{
String msg = "<choice>getObject</choice>";
bcoos.writeUTF(msg);
bcoos.flush();
bcoos.writeObject(object);
bcoos.flush();
}catch(Exception e){
e.printStackTrace();
}
}
客户端的接收截图:
else if(getType(Msg,"choice").equals("getPicture")){
int imageLength = ois.readInt();
byte[] data = new byte[imageLength];
ois.readFully(data);
DistanceControl.getPicture(imageLength, data);
}