亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

java實現遠程桌面的實例代碼

2024-07-13 10:16:44
字體:
來源:轉載
供稿:網友

java實現遠程桌面的實例代碼

控制端將鼠標事件傳遞到服務端

服務端拿到鼠標事件之后傳輸到客戶端

客戶端拿到鼠標事件之后,通過robot類即可完成,并且截屏將圖片發給服務器,服務器再發給控制端

java,遠程桌面

被我簡化之后得到

java,遠程桌面

//先介紹一下robot類的簡單使用import java.awt.AWTException;import java.awt.Robot;import java.awt.event.InputEvent;/** * 使用robot * @author 啞元 * */public class RobotTest { public static void main(String[] args) throws AWTException {  Robot r = new Robot();  r.mouseMove(300, 500);//鼠標移動  r.mousePress(InputEvent.BUTTON1_MASK ); //鼠標按下  r.mouseRelease(InputEvent.BUTTON1_MASK);//鼠標松開  r.keyPress((int)'A'); //鍵盤按下 (int)'A'表示將A轉換成鍵盤對應的key  r.keyRelease((int)'A'); //鍵盤松開 }}//屏幕抓取import java.awt.AWTException;import java.awt.Rectangle;import java.awt.Robot;import java.awt.image.BufferedImage;import javax.swing.ImageIcon;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.WindowConstants;/** * 抓取本地桌面圖片 * @author 啞元 * */public class ScreenTest { public static void main(String[] args) throws AWTException, InterruptedException {  Robot robot = new Robot();   JFrame jframe = new JFrame();  jframe.setSize(1200, 700);  JLabel label = new JLabel();  jframe.add(label);  //四個參數x y width height  jframe.setVisible(true);  jframe.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE );  //構建一個死循環動態截取  while(true){   BufferedImage image = robot.createScreenCapture(new Rectangle(0,0,1366,768));//截取屏幕   label.setIcon(new ImageIcon(image));   Thread.sleep(50);  }  }}

//遠程控制原理講解
//分為server端和client端,
//原本server端只作為轉發,作為演示,就不寫轉發
//也就是client端控制server端E
/**
* 這里我采用的是,在client端也就是操控端,接收到server端發送過來的screen之后,然后發送鼠標事件過去
* 然后再用robot處理
* 傳輸方式用socket+io即可處理
* 屏幕截取和圖片壓縮采用了robot的屏幕截取功能和jdk自帶的圖片編碼器,將其轉換成一個字節數組
* 發送給server端之后,robot通過io+socket可以直接拿到object對象,強制轉換成InputEvent(keyEvent和MouseEvent都繼承)之后
* 通過判斷event類型,分別處理即可,這里在服務端需要用到兩個線程,一個是屏幕截取和發送給客戶端,一個是用來監聽客戶端
* 傳遞過來的事件
*/

//下面是具體實現代碼

//server主程import java.awt.AWTException;import java.awt.Event;import java.awt.Robot;import java.awt.event.InputEvent;import java.awt.event.KeyEvent;import java.awt.event.MouseEvent;import java.io.DataOutputStream;import java.io.IOException;import java.io.ObjectInputStream;import java.net.ServerSocket;import java.net.Socket;/** * 服務端 * @author 啞元 * */public class Server { public static void main(String[] args) throws IOException {  ServerSocket server = new ServerSocket(80);  System.out.println("服務器已經正常啟動");  Socket socket = server.accept();//等待接收請求,阻塞方法  System.out.println("有客戶端連接");  DataOutputStream dos = new DataOutputStream(socket.getOutputStream());  //將客戶端與服務器端鏈接的輸出流交個ImageThread處理  ImageThread imageThread = new ImageThread(dos);  new Thread(imageThread).start();  new Thread(new EventThread(new ObjectInputStream(socket.getInputStream()))).start(); }}/** * 用來處理接收過來的鼠標事件或者鍵盤事件 */class EventThread implements Runnable{ private ObjectInputStream ois; private Robot robot; public EventThread(ObjectInputStream ois) {  this.ois = ois; } @Override public void run() {  try {   robot = new Robot();   while(true){    InputEvent event = (InputEvent)ois.readObject();//得知由客戶端傳遞過來的是一個object對象    actionEvent(event);//處理事件   }  } catch (AWTException e) {   e.printStackTrace();  } catch (ClassNotFoundException e) {   e.printStackTrace();  } catch (IOException e) {   e.printStackTrace();  }finally{   try {    ois.close();   } catch (IOException e) {    e.printStackTrace();   }  } } /**  * 事件處理,用來判斷事件類型,并用robot類執行  * @param event  */ public void actionEvent(InputEvent event){  System.out.println(event);  if(event instanceof KeyEvent){   KeyEvent e = (KeyEvent)event;   int type = e.getID();//拿到事件類型   if(type==Event.KEY_PRESS){    robot.keyPress(e.getKeyCode());   }else if(type == Event.KEY_RELEASE){    robot.keyRelease(e.getKeyCode());   }  }else if(event instanceof MouseEvent){   MouseEvent e = (MouseEvent)event;   int type = e.getID();   if(type == Event.MOUSE_MOVE){    robot.mouseMove(e.getX(),e.getY());   }else if(type == Event.MOUSE_DOWN){    robot.mousePress(getMouseKey(type));   }else if(type == Event.MOUSE_UP){    robot.mouseRelease(getMouseKey(type));   }else if(type == Event.MOUSE_DRAG){    robot.mouseMove(e.getX(), e.getY());//鼠標拖動   }  } } /**  * 返回鼠標的真正事件,鼠標時間不能直接處理,需要進過轉換  * @return  */ public int getMouseKey(int button){  if(button == MouseEvent.BUTTON1){//鼠標左鍵   return InputEvent.BUTTON1_MASK;  }else if(button == MouseEvent.BUTTON2){//鼠標右鍵   return InputEvent.BUTTON2_MASK;  }else if(button == MouseEvent.BUTTON3){//滾輪   return InputEvent.BUTTON3_MASK;  }else{   return 0;  } }}//屏幕截取器和發送器,這里需要拿到socket的out流import java.awt.AWTException;import java.awt.Dimension;import java.awt.Rectangle;import java.awt.Robot;import java.awt.Toolkit;import java.awt.image.BufferedImage;import java.io.ByteArrayOutputStream;import java.io.DataOutputStream;import java.io.IOException;import com.sun.image.codec.jpeg.*;/** * 用來將圖片數據發送 * @author 啞元 * */public class ImageThread implements Runnable{ DataOutputStream dos = null; //數據輸出流 public ImageThread(DataOutputStream dos){  this.dos = dos; } @Override public void run() {  try {   Robot robot = new Robot();   //截取整個屏幕   Dimension dimension = Toolkit.getDefaultToolkit().getScreenSize();   /*   int width = (int)dimension.getWidth();   int height = (int)dimension.getWidth();   Rectangle rec = new Rectangle(0,0,width,height);   */   Rectangle rec = new Rectangle(dimension);   BufferedImage image;   byte imageBytes[];   while(true){    image = robot.createScreenCapture(rec);    imageBytes = getImageBytes(image);    dos.writeInt(imageBytes.length);    dos.write(imageBytes);    dos.flush();    Thread.sleep(50); //線程睡眠   }  } catch (AWTException e) {   e.printStackTrace();  } catch (ImageFormatException e) {   e.printStackTrace();  } catch (IOException e) {   e.printStackTrace();  } catch (InterruptedException e) {   e.printStackTrace();  }finally{   try {    if(dos!= null) dos.close();   } catch (IOException e) {    e.printStackTrace();   }  } } /**  * 壓縮圖片  * @param 需要壓縮的圖片  * @return 壓縮后的byte數組  * @throws IOException   * @throws ImageFormatException   */ public byte[] getImageBytes(BufferedImage image) throws ImageFormatException, IOException{  ByteArrayOutputStream baos = new ByteArrayOutputStream();  //壓縮器壓縮,先拿到存放到byte輸出流中  JPEGImageEncoder jpegd = JPEGCodec.createJPEGEncoder(baos);  //將iamge壓縮  jpegd.encode(image);  //轉換成byte數組  return baos.toByteArray();  }}--------------------------------------------------------------------------------------//client端,用來接收creen圖片和發送鼠標事件import java.awt.event.InputEvent;import java.awt.event.KeyEvent;import java.awt.event.KeyListener;import java.awt.event.MouseEvent;import java.awt.event.MouseListener;import java.io.DataInputStream;import java.io.IOException;import java.io.ObjectOutputStream;import java.net.Socket;import java.net.UnknownHostException;import javax.swing.ImageIcon;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JPanel;import javax.swing.JScrollPane;import javax.swing.WindowConstants;/** * 客戶端 * @author 啞元 * */public class Client { public static void main(String args[]) throws UnknownHostException, IOException{  Socket s = new Socket("127.0.0.1",80);  DataInputStream dis = new DataInputStream(s.getInputStream());  ObjectOutputStream oos = new ObjectOutputStream(s.getOutputStream());  ClientWindow cw = new ClientWindow(oos);  byte[] imageBytes;  while(true){   imageBytes = new byte[dis.readInt()]; //先拿到傳過來的數組長度   dis.readFully(imageBytes); //所有的數據存放到byte中   cw.repainImage(imageBytes);  } }}/** * 客戶端窗體 * @author 啞元 * */class ClientWindow extends JFrame{ private ObjectOutputStream oos; private JLabel label; //重寫背景圖片方法 public void repainImage(byte [] imageBytes){  label.setIcon(new ImageIcon(imageBytes));  this.repaint(); } public ClientWindow(ObjectOutputStream oos){  this.oos = oos;  this.setTitle("遠程控制程序");  label = new JLabel();  JPanel p = new JPanel();  p.add(label);  JScrollPane scroll = new JScrollPane(p);//給p面板添加滾動條  this.add(scroll);  this.setSize(1024,768);  this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);  this.setVisible(true);  this.addKeyListener(new KeyListener() {   @Override   public void keyTyped(KeyEvent e) {    // TODO Auto-generated method stub   }   @Override   public void keyReleased(KeyEvent e) {    sendEvent(e);   }   @Override   public void keyPressed(KeyEvent e) {    sendEvent(e);   }  });  label.addMouseListener(new MouseListener() {   @Override   public void mouseReleased(MouseEvent e) {    sendEvent(e);   }   @Override   public void mousePressed(MouseEvent e) {    sendEvent(e);   }   @Override   public void mouseClicked(MouseEvent e) {    sendEvent(e);   }   @Override   public void mouseEntered(MouseEvent e) {    // TODO Auto-generated method stub   }   @Override   public void mouseExited(MouseEvent e) {    // TODO Auto-generated method stub   }  }); } public void sendEvent(InputEvent event){  try {   oos.writeObject(event);  } catch (IOException e) {   e.printStackTrace();  } }}

以上這篇java實現遠程桌面的實例代碼就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91丝袜美腿美女视频网站| 国产在线久久久| 国产精品极品美女在线观看免费| 日韩欧美一区二区三区久久| 亚洲一区二区三区四区在线播放| 成人黄色在线免费| 国产精品高潮粉嫩av| 亚洲天堂av在线播放| 亚洲自拍偷拍第一页| 欧美一乱一性一交一视频| 久久这里只有精品99| 97在线视频免费播放| 国产mv久久久| 久久久免费高清电视剧观看| 久久精品99久久久香蕉| 亚洲精品视频在线观看视频| 欧美在线一级va免费观看| 日韩经典中文字幕在线观看| 日韩三级成人av网| 欧美电影在线免费观看网站| 精品久久久久久久久久国产| 久久99久国产精品黄毛片入口| 国产精品久久久久福利| 国产午夜精品久久久| 日韩精品在线免费观看视频| 久久亚洲一区二区三区四区五区高| 亚洲精品少妇网址| 黄色成人在线免费| 久久久精品网站| 成人免费淫片aa视频免费| 7777免费精品视频| 欲色天天网综合久久| 欧美色视频日本版| 亚洲xxxx在线| 91亚洲精华国产精华| 欧美午夜精品在线| 久久亚洲私人国产精品va| 国产精品欧美久久久| 久久艳片www.17c.com| 亚洲天堂男人天堂| 亚洲精品之草原avav久久| 57pao成人国产永久免费| 国产精品欧美日韩一区二区| 欧美日韩福利在线观看| 国产日韩精品在线| 亚洲第一精品电影| 91在线视频导航| 日韩在线小视频| 九九精品在线视频| 日韩精品中文字幕在线播放| 国产精品久久久久久av福利软件| 最近免费中文字幕视频2019| 成人精品一区二区三区电影黑人| 国产成人福利夜色影视| 亚洲www视频| 欧美激情综合亚洲一二区| 性欧美长视频免费观看不卡| 精品久久久久久久久久ntr影视| 91亚洲国产成人久久精品网站| 国产999精品视频| 久久久av网站| 国产成人一区二区三区小说| 欧美贵妇videos办公室| 国a精品视频大全| 欧美电影院免费观看| 国产亚洲精品成人av久久ww| 亚洲国产高清高潮精品美女| 深夜福利国产精品| 亚洲最大的成人网| 国产精品久久久久久超碰| 欧洲美女免费图片一区| 日韩免费av在线| 亚洲国产日韩欧美在线动漫| 亚洲免费视频一区二区| 91成人在线观看国产| 欧洲一区二区视频| 7777精品久久久久久| 亚洲欧洲自拍偷拍| 欧美最顶级的aⅴ艳星| 欧美激情视频网站| 国产精品igao视频| 国产在线视频不卡| 人人澡人人澡人人看欧美| 欧美一区三区三区高中清蜜桃| 在线成人免费网站| 亚洲欧美日韩天堂| 91国产中文字幕| 中文字幕欧美视频在线| 热门国产精品亚洲第一区在线| 欧美激情喷水视频| 久久精品电影一区二区| 色诱女教师一区二区三区| 欧美日韩国内自拍| 国产成人aa精品一区在线播放| 日本久久久久久久久久久| 日韩欧美在线字幕| 欧美日韩精品在线| 日韩有码视频在线| 亚洲国产精品久久久久久| 亚洲网址你懂得| 国产成人综合一区二区三区| 国产91免费看片| 日韩美女免费观看| 欧美电影电视剧在线观看| 欧美激情亚洲自拍| www.亚洲免费视频| 亚洲国产日韩欧美综合久久| 欧美性精品220| 亚洲精品一区av在线播放| 国产主播在线一区| 久久久999国产精品| 日韩av在线一区二区| 韩国三级电影久久久久久| 欧美大全免费观看电视剧大泉洋| 久久久久国产精品一区| 亚洲精品短视频| 欧美日韩在线视频首页| 国产成人一区二| 欧美性资源免费| 色婷婷av一区二区三区久久| 国内外成人免费激情在线视频网站| 成人免费视频a| 亚洲国产精品资源| 国产精品白嫩初高中害羞小美女| 欧美极度另类性三渗透| 亚洲欧美日韩国产精品| 色婷婷综合久久久久中文字幕1| 538国产精品一区二区在线| 亚洲精品久久久一区二区三区| 欧美性高潮在线| 成人妇女免费播放久久久| 久久免费国产精品1| 欧美日韩中文字幕在线| 久久成人av网站| 日本精品va在线观看| 97香蕉久久超级碰碰高清版| 91精品久久久久久久久久| 亚洲奶大毛多的老太婆| 91日本在线观看| 欧美成人三级视频网站| 清纯唯美亚洲综合| 亚洲精品二三区| 欧美日韩国产成人在线观看| 91理论片午午论夜理片久久| 国产精品一二三在线| 色青青草原桃花久久综合| 国产精品久久久久9999| 日韩av网站大全| 亚洲美腿欧美激情另类| 欧美成人亚洲成人| 国产一区二区三区精品久久久| 国产精品视频xxxx| 日韩经典第一页| 久久久噜噜噜久久久| 国产日韩精品在线| 国产亚洲精品一区二区| 欧美日韩在线视频一区| 久久久成人的性感天堂| 国产在线观看91精品一区| 黑人巨大精品欧美一区二区一视频| 欧美高清视频一区二区| 国产一区二区三区三区在线观看| 欧美日韩国产精品一区二区三区四区| 精品香蕉一区二区三区|