`

远程控制TCP版

阅读更多

一、远程控制TCP版

1、主要技术过程

       由客户端来控制服务器,服务器不断将自己的桌面截图通过套接字发送给客户端,客户端得到截图,画在面板上,客户端的鼠标动作全部发送给服务器,服务器接收到客户端发来的鼠标动作,执行相应动作。

     客户端:不断接收图片的线程,和发送鼠标动作和位置。

     服务器:线程不断发送图片,线程不断接收鼠标坐标和位置。

注意事项:鼠标事件得到的左键滑轮右键按下时候的值,和robot函数执行mousePress()方法传入的参数对应的左键滑轮右键额值不一样,需要做一下转换,不能直接来拿用。

2、实现过程

    2.1客户端UI

a、采用

 BorderLayout布局模式,中间放滚动面板,再放到中间,最下面可以填写ip 端口和链接服务器按钮

2.2客户端连接服务器

// 按钮监听器
 class MyListener implements ActionListener {

  @Override
  public void actionPerformed(ActionEvent e) {
   // 获得Ip@端口
   String ip = ipField.getText();
   String port = portField.getText();

   int intPort = Integer.parseInt(port);

   try {
    // 创建客户端套接字,连接服务端
    Socket socket = new Socket(ip, intPort);

    OutputStream ops = socket.getOutputStream();
    // 需要发送int,String,要包装成对象流
    oos = new ObjectOutputStream(ops);

    // 不停的接受服务端发来的图片
    RecieveThread rt = new RecieveThread(socket, panel);
    rt.start();

   } catch (Exception e1) {
    // 弹出错误提示框
    JOptionPane.showMessageDialog(null, "网络异常,无法连接服务器!");
    e1.printStackTrace();
   }

  }

 }

2.3客户端发送鼠标信息

class MyMouseListener implements MouseListener, MouseMotionListener {

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

   }

  }

  @Override
  public void mouseReleased(MouseEvent e) {
   int x = e.getX();
   int y = e.getY();
   // 得到按下的是哪一个键
   int btnNum = e.getButton();
   String type = "released";
   if (oos != null) {
    try {
     oos.writeInt(x);
     oos.writeInt(y);
     oos.writeInt(btnNum);
     oos.writeObject(type);
     oos.flush();
    } catch (IOException e1) {
     e1.printStackTrace();
    }

   }
  }

  public void mouseDragged(MouseEvent e) {
   
  }

  public void mouseMoved(MouseEvent e) {
   int x = e.getX();
   int y = e.getY();
   // 得到按下的是哪一个键
   int btnNum = e.getButton();
   String type = "moved";
   if (oos != null) {
    try {
     oos.writeInt(x);
     oos.writeInt(y);
     oos.writeInt(btnNum);
     oos.writeObject(type);
     oos.flush();
    } catch (IOException e1) {
     e1.printStackTrace();
    }

   }
  }

  @Override
  public void mouseEntered(MouseEvent e) {
   // TODO Auto-generated method stub

  }

  @Override
  public void mouseExited(MouseEvent e) {
   // TODO Auto-generated method stub

  }

  @Override
  public void mouseClicked(MouseEvent e) {
   // TODO Auto-generated method stub

  }

 }

2.4连击服务器之后启动线程,不断获取套接字输入流发来的图片

// 创建客户端套接字,连接服务端
    Socket socket = new Socket(ip, intPort);

    OutputStream ops = socket.getOutputStream();
    // 需要发送int,String,要包装成对象流
    oos = new ObjectOutputStream(ops);

    // 不停的接受服务端发来的图片
    RecieveThread rt = new RecieveThread(socket, panel);
    rt.start();

2.5绘制收到的图片

 try {
   // 从Socket上获得输入流
   InputStream ips = socket.getInputStream();
   // 由于接受的是对象流
   ObjectInputStream ois = new ObjectInputStream(ips);

   while (true) {
    // 读取对象,由于发送的是ImageIcon,这里可以强制转型成ImageIcon
    Object obj = ois.readObject();
    ImageIcon icon = (ImageIcon) obj;
    
    //获得图像大小(即为服务端桌面大小)
    int width = icon.getIconWidth();
    int height = icon.getIconHeight();
    
    //修改panel大小为服务端桌面大小
    panel.setPreferredSize(new Dimension(width,height));
    //获得画布
    Graphics g = panel.getGraphics();
    g.drawImage(icon.getImage(), 0,0, null);
    

   }
  } catch (Exception e) {
   e.printStackTrace();
  }

2.6服务器端,一旦客户机连接上,启动线程,向其发送图片,这个时候可以将套接字的字节输出流,包装成对象输出路,这样方便操作。

// 初始化服务端的方法
 public void initServer() throws IOException {
  // 创建服务端套接字对象
  ServerSocket server = new ServerSocket(10010);

  System.out.println("服务器已经启动,等待连接");

  // 等待客户端连接,如果有客户端连接上,会收到客户端套接字
  Socket socket = server.accept();
  System.out.println("一个客户端连上了"+socket.getRemoteSocketAddress());
  
  // 启动一个线程来给客户端发送服务端桌面
  SendThread st = new SendThread(socket);
  st.start();
  
  //启动一个线程来接收客户端发来的控制消息
  RecieveThread rt = new RecieveThread(socket);
  rt.start();

 }

2.7服务器发送图片主要代码

try {
   
   //从套接字上获得输出流

   OutputStream ops = socket.getOutputStream();
   //包装成对象流
   ObjectOutputStream oos = new ObjectOutputStream(ops);
   
   // 创建一个机器人对象,用来截屏
   Robot robot = new Robot();

   while (true) {
    // 获得屏幕的分辨率
    Toolkit tool = Toolkit.getDefaultToolkit();
    Dimension dim = tool.getScreenSize();

    // 要截取的起始点
    Point p = new Point(0, 0);

    // 指定截取的区域
    Rectangle rect = new Rectangle(p, dim);

    // 开始截屏,获得截取到的图像
    BufferedImage img = robot.createScreenCapture(rect);
    
    //由于BufferedImage没有实现序列化,不能写到IO中
    //将BufferedImage包装成可写入IO的图像对象
    ImageIcon icon = new ImageIcon(img);  
    //写出对象
    oos.writeObject(icon);
    oos.flush();

    try {
     Thread.sleep(1000);
    } catch (InterruptedException e) {
     e.printStackTrace();
    }

   }

  } catch (Exception e1) {
   e1.printStackTrace();
  }
 }

2.8服务器接收鼠标信息,做出动作

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 (btnNum == MouseEvent.BUTTON2) {
     btnMask = InputEvent.BUTTON2_MASK;
    } else if (btnNum == MouseEvent.BUTTON3) {
     btnMask = InputEvent.BUTTON3_MASK;
    }

    if ("pressed".equals(type)) {
     // 移送光标到xy
     robot.mouseMove(x, y);
     robot.mousePress(btnMask);// 按下对应的鼠标按键

    } else if ("released".equals(type)) {
     // 移送光标到xy
     robot.mouseMove(x, y);
     robot.mouseRelease(btnMask);
    } else if ("moved".equals(type)) {
     // 移送光标到xy
     robot.mouseMove(x, y);
    }

   }

  } catch (Exception e) {
   e.printStackTrace();
  }
 }

 

 

 

 

 

  • 大小: 27.9 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics