一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - java實現遠程桌面的實例代碼

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

2021-03-22 14:11一艷傾華 Java教程

下面小編就為大家分享一篇java實現遠程桌面的實例代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

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

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

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

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

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

被我簡化之后得到

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
//先介紹一下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類型,分別處理即可,這里在服務端需要用到兩個線程,一個是屏幕截取和發送給客戶端,一個是用來監聽客戶端
* 傳遞過來的事件
*/

//下面是具體實現代碼

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
//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實現遠程桌面的實例代碼就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持服務器之家。

原文鏈接:http://blog.csdn.net/qq_25956141/article/details/78621983

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 色婷婷激婷婷深爱五月老司机 | ipx358cn出差被男上司在线 | 国产欧美日韩亚洲精品区2345 | 国产小情侣自拍 | 欧美国产精品久久 | 狠狠香蕉 | 精品日本一区二区 | 极品丝袜乱系列在线阅读 | 欧美视频在线一区二区三区 | 亚洲天堂v| 99久视频| 免费看成年视频网页 | 国产欧美va欧美va香蕉在线观看 | 国产日韩精品一区二区在线观看播放 | 国产自在自拍 | 免费看日本| 亚洲老头老太hd | 日本在线视频免费观看 | 国产精品视频2021 | 美女曰逼视频 | 99精彩视频在线观看 | 日本特黄一级午夜剧场毛片 | 成人精品视频一区二区在线 | 亚洲精品有码在线观看 | 日本一片免费观看高清完整 | 福利一区三区 | 日本破处 | 美女的隐私视频免费看软件 | 国产悠悠视频在线播放 | 乳色吐息讲的是什么 | 7777色鬼xxxx欧美色夫 | 日本中出视频 | 2020国产精品视频 | 啊啊啊好爽在线观看 | 国产精品四虎在线观看免费 | 电车痴汉中文字幕 | 国产欧美一区二区三区精品 | 驯服有夫之妇HD中字日本 | 视频一区二区国产无限在线观看 | 成人久久18网站 | 沟厕okn系列在线播放 |