服务端程序:
第一步创建服务器套接字(程序如下):
ServerSocket server = new ServerSocket(10086);//里面传指定的端口号
第二步等待客服端连接(代码如下):
Socket socket = server.accept();
第三步创建一个发送数据的线程和一个接受数据的线程:(代码如下)
1.1.服务端向客服端发送数据
public class SendThread extends Thread{
Socket sk;
public SendThread(Socket sk){
this.sk = sk;
}
public void run(){
try {
//从套接字上获得输出流
OutputStream os = sk.getOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(os);
//创建一个机器人对象
Robot rt = new Robot();
while(true){
//获得频幕分辨率
Toolkit tool = Toolkit.getDefaultToolkit();
Dimension sion = tool.getScreenSize();
//截取起点
Point p = new Point(0,0);
//指定截取的区域
Rectangle rect = new Rectangle(p,sion);
//开始截屏,获得截取的图像
BufferedImage img = rt.createScreenCapture(rect);
ImageIcon icon = new ImageIcon(img);
oos.writeObject(icon);
oos.flush();
Thread.sleep(500);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
一定要记得创建机器人对象,只有通过机器人对象才能不断的去截取屏幕图像。
1.2 创建客服端套接字:
Socket socket = new Socket(ip,intport);
发送数据一定要把数据包装成对象流:
OutputStream ops = socket.getOutputStream();
oos = new ObjectOutputStream(ops);
然后启动线程不断接受从服务端发来的数据(图片)
public class RecieveThread extends Thread {
Socket socket;
JPanel panel;
public RecieveThread(Socket socket, JPanel panel){
this.socket = socket;
this.panel = panel;
}
public void run(){
try {
InputStream is = socket.getInputStream();
ObjectInputStream ois = new ObjectInputStream(is);
while(true){
Object ject = ois.readObject();
ImageIcon icon = (ImageIcon)ject;
int width = icon.getIconWidth();
int height = icon.getIconHeight();
panel.setPreferredSize(new Dimension(width,height));
Graphics g = panel.getGraphics();
g.drawImage(icon.getImage(), 0, 0, null);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
1.3.服务端接受客服端发来的数据
public class RecieveThread extends Thread{
Socket socket;
public RecieveThread(Socket socket){
this.socket= socket;
}
public void run(){
try {
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(btnMask == MouseEvent.BUTTON2){
btnMask = InputEvent.BUTTON2_MASK;
}else if(btnMask == MouseEvent.BUTTON3){
btnMask = InputEvent.BUTTON3_MASK;
}
if("pressed".equals(type)){
robot.mouseMove(x, y);
robot.mouseRelease(btnMask);
}else if("released".equals(type)){
robot.mouseMove(x, y);
robot.mouseRelease(btnMask);
}else if("moved".equals(type)){
robot.mouseMove(x, y);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
本文介绍了一种使用Java实现的远程桌面控制方案,包括服务端和客户端的主要代码逻辑。服务端能够定时截取屏幕图像并将其发送给客户端,同时接收并执行客户端发送的鼠标操作指令。

被折叠的 条评论
为什么被折叠?



