`

TCP-简单的远程控制-客户端控制服务端

阅读更多
简单的TCP远程控制-客户端控制服务端

TCP的传输是可靠地,面向对象的,同时传输效率比较低。
TCP的远程控制需要用到两个套接字,客户端套接字:Socket ;服务端套接字:ServerSocket
远程控制服务端
创建服务端的套接字
ServerSocket sever = new ServerSocket(端口号);
等待客户端的连接,一单有客户端连接,就会自动接收客户端套接字
Socket socket = server.accept();
此时的客户端需要做两件事,启动一个发送线程,将服务端的信息发送给客户端;另外,还要不停接收客户端传过来的信息指令。
1、接收线程:
在接收客户端数据时,需要用到Robot类,该类控制鼠标和键盘的应用系统生成的本机系统的输入事件
Robot robot = new Robot();
取得scoket的输入流,包装成对象输入流接收,将传过来的数据看成一个个对象
远程控制桌面,接收的数据有:鼠标的位置坐标,动作,参数。由于系统的参数,与客户端得到的鼠标按下键的值不一样,要进行转换。
鼠标的参数用int  num 接收
定义一个int mask = Input Event.BUTTON1_MASK;
if(num = MouseEvent.BUTTON1){
mask = InputEvent.BUTTON1_MASK;
}else if(num = MouseEvent.BUTTON2){
mask = InputEvent.BUTTON2_MASK;
}else if(num = MouseEvent.BUTTON3){
mask = InputEvent.BUTTON3_MASK;
}

根据得到的鼠标动作,确定是按下还是松开还是移动;根据接收到鼠标的位置坐标 X ,Y ,将光标移到指定位置;根据鼠标参数,按下对应的鼠标按键
if("pressed".equals(type)){
//移送光标到x,y
robot.mouseMove(x,y);
//按下对应的鼠标按键
robot.mousePress(mask);
}else if("released".equals(type)){
robot.mouseMove(x,y);
robot.mouseRelease (mask);
}else if("move".equals(type)){
robot.mouseMove(x,y);
}

2、发送线程
从套接字获取输出流, 包装成对象流输出,创建Robot对象,用于截图

截图之前,需要先获取电脑屏幕的分辨率
//获取默认工具包
Toolkit tool = Toolkit.getDefaultToolkit();
Dimension dim = tool.getScreenSize();

确定截取的起始位置
Point p = new Point(0,0);

截取的矩形区域
Rectangle rect = new Rectangle(p,dim);

开始截屏,截取得到图片, BufferedImage 具有可访问图像数据缓冲区的 Image,BufferedImage 对象的左上角坐标都为 (0, 0)。
BufferedImage img = robot.createScreenCapture(rect);

由于BufferedImage没有实现序列化,所以不能写到IO中。将BufferedImage包装成可以写入IO的图像对象
ImageIcon icon = new ImageIcon(img);

清空缓存,由于需要不停的截图,所以可以加上while 循环,设定睡眠时间,给线程喘口气的机会


远程控制客户端:

写一个简单的界面接收服务端传过来的图片,设置一个连接按钮盒连接服务器 的IP和端口的文本框

给按钮添加一个监听器
创建客户端套接字,从界面获取IP和端口
Socket  socket = new Socket(ip,Port);
包装对象流输出

启动一个线程,不停接收服务端发来的图片
创建对象输入流
创建接收对象
Object obj = ois.readObject();

由于发送的是ImageIcon ,需要强转为ImageIcon
ImageIcon icon = (ImageIcon) obj;
获得图像的大小,即为服务端桌面大小
修改面板的大小,设置为服务端桌面大小

获得画布,在panel上画出得到的图像
Graphics g = panel.getGraphics();
g.drawImage(icon.getImage(),0,0, null);

添加鼠标监听器:实现MouseListener,MouseMotionListener 接口
将鼠标按下,松开,移动时的鼠标动作和位置,按键值 对象流的方式输出

//得到鼠标位置
int x = e.getX();
int y = e.getY();
//得到鼠标按下的是哪个键
int num = e.getButton();
String type = "pressed";
if(oos!=null){
try {
oos.writeInt(x);
oos.writeInt(y);
oos.writeInt(num);
oos.writeObject(type);
oos.flush();
} catch (IOException e1) {
e1.printStackTrace();
}
}


这样就实现了简单的远程控制,客户端可以控制服务端

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics