`

远程控制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
分享到:
评论

相关推荐

    MFC版远程控制 采用多线程 TCP协议

    总的来说,这个MFC版的远程控制软件利用了MFC的强大UI设计能力和TCP的稳定通信特性,实现了丰富的远程操作功能。开发这样的系统需要深入理解Windows编程、网络通信和多线程技术,同时也需要注意安全性和性能优化。...

    易语言远程控制源码,完整版

    远程控制技术则是通过网络在一台计算机上操作另一台计算机,实现远程管理和监控。在这个主题中,我们将深入探讨易语言在实现远程控制方面的应用。 首先,易语言远程控制源码是用于构建远程控制软件的基础。源码是...

    TCP远程控制命令协议

    ### TCP远程控制命令协议解析 #### 一、概述 TCP远程控制命令协议是基于TCP/IP协议族中的传输控制协议(TCP)的一种应用层协议。它主要用于实现无线局域网内的可靠网络通信,通过构建C/S架构(即客户端/服务器架构...

    VB远程控制 VB远程控制 VB远程控制

    【VB远程控制技术详解】 VB(Visual Basic)是微软公司推出的一种面向对象的、基于事件驱动的编程语言,因其易学易用而受到广大程序员的欢迎。在远程控制领域,VB同样可以发挥重要作用,实现远程桌面连接、文件传输...

    免杀远程控制下载免杀远程控制

    1. **连接建立**:远程控制通常通过网络协议(如TCP/IP)建立连接。客户端和服务器端需要进行身份验证和加密通信,以确保数据的安全传输。常见的连接方式有TCP连接、HTTP/HTTPS隧道、P2P等。 2. **隐藏机制**:免杀...

    电脑远程控制 远控程序 注册版 远程控制

    1. **远程控制原理**:远程控制基于TCP/IP协议,通过建立安全的网络连接,将用户的输入指令传输到远程设备,并将远程设备的屏幕反馈回本地。常见的远程桌面协议有RDP(远程桌面协议)、VNC(虚拟网络计算)和...

    TCP-IP传输文件远程控制聊天室

    TCP/IP传输文件远程控制聊天室是一种基于C/S(Client/Server)开发模型的网络应用程序,它允许客户端通过网络与服务器进行交互,实现文件的上传和下载,以及远程控制功能。在此系统中,服务端能够同时处理最多10个...

    基于TCP-IP协议实现上位机对UR机器人的远程控制.pdf

    基于TCP-IP协议实现上位机对UR机器人的远程控制.pdf基于TCP-IP协议实现上位机对UR机器人的远程控制.pdf基于TCP-IP协议实现上位机对UR机器人的远程控制.pdf基于TCP-IP协议实现上位机对UR机器人的远程控制.pdf基于TCP-...

    基于TCPIP协议实现上位机对UR机器人的远程控制.rar

    本主题聚焦于“基于TCP/IP协议实现上位机对UR机器人的远程控制”,这是一项利用网络通信技术来实现远程操作和监控UR机器人的重要技术。下面我们将详细探讨这一技术的原理、步骤以及实现过程中可能遇到的关键知识点。...

    易语言远程控制实现源码

    本资源提供的“易语言远程控制实现源码”是一个基于易语言编写的远程控制程序的源代码,对于想要学习远程控制技术或易语言编程的开发者来说,是一个很好的学习材料。 远程控制技术是一种允许一个设备或程序(通常...

    易语言远程控制源码.rar

    在易语言中实现远程控制,可能需要使用到如TCP/IP协议库进行网络通信,以及创建进程、读写注册表等技术来模拟本地操作。 CGepfoXF.e和uL4iLwqJ.e这两个文件可能是易语言编译后的可执行文件,分别代表客户端(Client...

    c#远程控制桌面,远程控制

    首先,要实现远程控制桌面,我们需要理解基础的网络通信概念,如套接字(Sockets)编程和TCP/IP协议。C#中的System.Net命名空间提供了用于网络通信的类,如TcpClient和TcpListener,它们可以帮助我们建立客户端和...

    TCP.rar_DEMO_TCP传文件_tcp_tcp 传文件_远程控制

    标题中的“TCP.rar_DEMO_TCP传文件_tcp_tcp 传文件_远程控制”表明这是一个关于TCP协议的示例项目,特别关注的是如何通过TCP协议进行文件传输以及实现远程控制功能。TCP(Transmission Control Protocol)是一种面向...

    远程控制源远程控制源码

    1. **网络通信协议**:远程控制需要一种可靠的网络协议,如TCP/IP,来确保数据的完整性和顺序。同时,为了减少延迟,可能会使用UDP或其他优化的协议。 2. **加密技术**:为了保护隐私和数据安全,远程控制软件会...

    tcp.rar_TCP通信_tcp服务端_远程控制

    本教程将详细讲解如何在Linux环境下实现TCP远程控制,包括客户端与服务器端的通信机制。 首先,理解TCP的基本概念至关重要。TCP通过三次握手建立连接,确保数据传输前双方都已经准备好。在握手过程中,客户端发送一...

    TCP远程视频控制.rar

    在本资源"TCP远程视频控制.rar"中,我们可以推测这是一个使用TCP协议实现的远程视频控制系统,可能由易语言(E语言)编写。易语言是一种中文编程语言,设计目标是降低编程的难度,使不懂英文的用户也能进行软件开发...

    精典源码delphi源码下载 远程控制.zip

    远程控制的核心技术包括套接字编程、网络通信协议(如TCP/IP)和数据编码解码。在Delphi中,我们可以使用TClientSocket和TServerSocket组件来实现客户端和服务器端的通信。TClientSocket用于建立到服务器的连接,...

    远程控制,用于远程控制

    远程控制的基本原理是通过网络通信协议,如TCP/IP,将用户的输入指令从一台计算机(客户端)传输到另一台计算机(服务器端),同时将服务器端的屏幕反馈信息发送回客户端。这种交互过程使得用户仿佛直接操作远程...

    DELPHI远程控制源码(亲测可用)

    DELPHI远程控制源码是一种基于DELPHI编程语言实现的远程桌面控制解决方案。DELPHI,全称为Borland Delphi,是一款强大的Windows应用程序开发工具,它使用Object Pascal语言,以其高效的编译器和直观的可视化设计界面...

Global site tag (gtag.js) - Google Analytics