`

远程控制UDP版

阅读更多

一、主要技术--按照客户端控制服务器的实现来讲

UDP版和TCP版的主要区别是数据发送方式不同,tcp通过连接,通过流来发送和接受数据,非常可靠,UDP是

发送数据包和接受数据包的过程,而且发送的数据包可能丢失,数据包的大小也有限制。也就是字节数组的大小有限制。

我的屏幕截图下来有4M,不能够一次性发在字节数组中发送,我的实现办法是,先将对象序列化写入文件,然后将文件分成一百分发送出去,客户端接受的时候也将接收的字节写入文件,然后用对象输入流读取,就相当于对象的序列化过程,和文件复制。

二、主要实现步奏都是一样的可以参考tcp的实现,下面是发送数据和接受数据的过程。

1、服务器发送数据包代码

注意事项由于可能丢包,所以每发送一张图片也就是一个对象时,先发送”开始标记“,然后再发送分隔的100分字节数组,客户端在接收到”开始“字节数组之后开始接受,接受100份后边开始按照对象流读取图片对象,如果对象读取不成功,说明这100份字节数组出现了错误,不是一个完整的对象的字节数组,将其丢弃重新开始接受,直到对象成功读取才将去画在客户端的面板上。

public void run() {

  
   Robot robot;
   try {
    robot = new Robot();
    
    while (true) {
     System.out.println("开始");
     //得到屏幕大小,由于在远程控制中,可能改变屏幕分辨率,所以要不断获取
     Toolkit tool = Toolkit.getDefaultToolkit();
     //
     Dimension dimension= tool.getScreenSize();
     Point point = new Point(0,0);
     
     //创建一个矩形用于指定截屏区域
     Rectangle screenRect = new Rectangle(point,dimension);
     
     // 不断地截屏,然后发给客户端
     BufferedImage bimg = robot.createScreenCapture(screenRect);
     
     //BufferedImage没有实现接口,所以不能被实例化,所以将其转成imageicon
     ImageIcon img = new ImageIcon(bimg);
  
//***********************************************************************     、
     //先把对象写入文件,再把文件转成字节数组发出去,对方接受文件,再按对象读取
     File file = new File("d:/jietu.png");
     FileOutputStream fos  =  new FileOutputStream(file);
     
     BufferedOutputStream bos  = new BufferedOutputStream(fos); 
 
     //包装成对象流
     ObjectOutputStream os = new ObjectOutputStream(bos);
     //将对象写入文件
     os.writeObject(img);
     os.flush();
     
     //*******************
     //将文件转成字节流发出去
     byte[] b = new byte[(int) file.length()];
     FileInputStream fis = new FileInputStream(file);
     fis.read(b);
     
     System.out.println(b.length);
     int skp = (int) (file.length()/100);
     int len =skp;
     //先发送一个头,表示这个一张数据的开始
     byte[] b0 = "开始".getBytes();
     //把开始标记发出去
     DatagramPacket dp2 = new DatagramPacket(b0,b0.length, sentaddress);
     socket.send(dp2);
     //把文件大小用字节数组发出去
     byte[]  filelength=(file.length()+"").getBytes();
     
     //将数组复制到指定长度为20的数组,不够的补0
     byte[] bl=Arrays.copyOf(filelength, 20);
     System.out.println("数组大小为"+file.length());
     
     
     DatagramPacket dp3 = new DatagramPacket(bl,bl.length, sentaddress);
     socket.send(dp3);
     
     for(int i =0;i<100;i++){
      if(i==99){
       //最后剩下的长度
       len=b.length-99*skp;
       System.out.println(i);
       System.out.println(len);
      }
      System.out.println(i);
      System.out.println(len);
       dp2 = new DatagramPacket(b, i*skp,len, sentaddress);
      socket.send(dp2);
     Thread.sleep(10);
     
     }
   
    }
    
   } catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
 
   
 }

三、客户端接受到数据之后,先将其写入文件,然后再用对象流读取,读取成功才将起画在面板(这里没有判断是否成功读取对象)

 while (true) {
   File file0 = new File("e:/jietu.png");
   //如果有原来的截图就将其删掉
   if(file0.exists()){
    file0.delete();
   }
   try {
   
    File file = new File("e:/jietu.png");
    FileOutputStream fos = new FileOutputStream(file);
    byte[] b0 = new byte[4];
    DatagramPacket dp0 = new DatagramPacket(b0, b0.length);

    socket.receive(dp0);
    // 如果是头就开始接受图片

    if ("开始".equals((new String(b0)).trim())) {
     int sum = 0;
     byte[] blength = new byte[20];
     DatagramPacket dplength = new DatagramPacket(blength,
       blength.length);
     socket.receive(dplength);
     int length = Integer.parseInt((new String(blength)).trim());
     System.out.println("大小为%%%%"+length);
     int length1=length/100;
     int length2=length-length1*99;
     for (int i = 0; i < 100; i++) {
      if (i == 99) {
       byte[] buf = new byte[length2];
       DatagramPacket dp2 = new DatagramPacket(buf,
         buf.length);
       sum++;
       socket.receive(dp2);
       fos.write(buf);
       fos.flush();
       

      } else {
       byte[] buf = new byte[length1];
       DatagramPacket dp2 = new DatagramPacket(buf,
         buf.length);
       sum++;
       socket.receive(dp2);
       System.out.println(i);
       fos.write(buf);
       fos.flush();
      }

     }
     System.out.println("%%%%%" + file.length());
     fos.close();
     //如果sum不等于100,说明没有完成接受到图片对象,有丢失,则不能将对象完整读取出来,所以直接放弃,只有完整读取才能将其画出来
     if(sum==100){

     FileInputStream fis = new FileInputStream(file);
     BufferedInputStream bos = new BufferedInputStream(fis);
     ObjectInputStream ois = new ObjectInputStream(bos);

     ImageIcon img= (ImageIcon) ois.readObject();

     

     ois.close();
     bos.close();
     fis.close();

     Graphics g = panel.getGraphics();
     g.drawImage(img.getImage(), 0, 0, null);
     System.out.println(">>>>>>>>>>>>>");
     file.exists();
     file.delete();
     }

    }

   } catch (Exception e) {
    // TODO Auto-generated catch block
    
    e.printStackTrace();
   }

 

分享到:
评论

相关推荐

    UDP.rar_UDP 远程控制_udp远程控制

    在这个"UDP.rar"压缩包中,包含了"udpclient.c"和"udpserver.c"两个源代码文件,它们分别代表了UDP远程控制系统的客户端和服务器端。下面我们将详细讨论这两个方面的知识点: 1. UDP客户端(udpclient.c): - **...

    UDP远程控制源码(线程池)

    标题中的“UDP远程控制源码(线程池)”是指一种使用C++编程语言实现的远程控制软件,它基于用户数据协议(UDP)进行通信,并采用了线程池技术以提高程序的执行效率。UDP是一种无连接的传输层协议,相较于TCP,它的...

    java实现的远程控制 采用UDP

    本项目聚焦于使用Java编程语言实现一个基于UDP(User Datagram Protocol)的远程控制解决方案,利用屏幕截图来实现远程桌面的功能。UDP是一种无连接的传输层协议,相比TCP(Transmission Control Protocol),它更...

    linux下基于UDP的简单远程控制代码及文档

    在Linux环境下,基于UDP(User Datagram Protocol)的简单远程控制是一种常见的网络通信方式。UDP是一种无连接的传输层协议,它不保证数据的可靠传输,但具有高效、快速的特点,适用于实时应用或对延迟敏感的场景。...

    远程控制源远程控制源码

    在标题"远程控制源远程控制源码"和描述中,提到的是一个用于实现远程控制功能的源代码,可能是一个软件开发项目或者一个已经编译好的可执行文件。这个程序的名称为"远控代码.exe",它可能是用特定编程语言编写,并且...

    delphi使用UDP技术实现远程控制示例代码

    本示例将探讨如何在Delphi中利用UDP技术实现远程控制功能。 远程控制通常涉及到客户端(控制端)与服务器(被控制端)之间的通信,允许用户通过网络对远程设备进行操作。在Delphi中,我们可以使用TIdUDPClient和...

    Qt制作的远程控制(屏幕控制)

    由于远程控制要求实时性和稳定性,TCP可能是更合适的选择,但在局域网环境中,UDP的低延迟可能也是一个考虑因素。 接下来,我们来看截屏技术。描述中提到了两种截屏方式:D3D(Direct3D)和GDI(Graphics Device ...

    C++ 远程控制编写,29款源代码

    "C++ 远程控制编写,29款源代码"这一主题聚焦于利用C++实现远程控制功能的技术。远程控制允许用户通过网络在一台计算机上操作另一台计算机,这在技术支持、系统管理、远程协作和自动化任务执行等方面具有广泛应用。 ...

    易语言远程控制技术教程

    易语言远程控制技术教程主要涉及的是使用易语言这一编程工具来开发远程控制程序的相关知识。易语言是一款以中文为编程语言的开发环境,它降低了编程的门槛,使得更多的人能够参与到程序设计中来。在远程控制领域,...

    udp协议控制电脑关机和声音大小

    在本文中,我们将探讨如何利用UDP协议来控制远程电脑的关机、重启以及调整音量等操作,这些都是通过网络进行的计算机管理功能。 首先,我们需要了解UDP的工作原理。与TCP(Transmission Control Protocol)不同,...

    远程控制程序编写指南[英文版.PDF]

    这份英文版的远程控制程序编写指南将深入讲解这些方面,帮助开发者构建高效且安全的远程控制解决方案。虽然内容未给出详细细节,但以上列出的知识点是理解和实践远程控制程序编写的基础。对于有志于这一领域的IT从业...

    PC远程控制程序

    《PC远程控制程序详解》 在信息技术领域,远程控制程序是一种强大的工具,它允许用户通过网络从一台计算机操控另一台计算机。"PC远程控制程序"就是这样一个应用,它类似于我们熟知的QQ远程协助功能,其核心技术和...

    末日2012远程控制.zip

    5. **网络协议**:远程控制需要TCP/IP协议来传输数据,可能还涉及到UDP或其他特定协议。 6. **加密技术**:为了保障数据传输的安全,远程控制软件通常使用加密技术,如SSL/TLS来保护通信不被窃听。 7. **权限管理*...

    易语言 远程控制源码 2010更新

    "易语言 远程控制源码 2010更新" 提供的是一套基于易语言编写的远程控制程序的源代码,这个程序可能包含了客户端和服务器端的实现,允许用户通过网络对另一台计算机进行操作和监控。 远程控制技术的核心是通过网络...

    C#简单可用的远程控制demo

    【C#简单可用的远程控制demo】是一个基于C#编程语言实现的远程桌面控制应用程序,专为开发者设计,便于在Visual Studio 2013环境下进行编译和调试。这个项目提供了一个简单易用的解决方案,使用户能够通过网络对远程...

    vb远程控制 的 源码

    在VB中实现远程控制功能,主要是通过网络通信技术来实现对远程计算机的控制,例如发送指令、获取远程计算机的状态等。VB远程控制的源码涉及到的技术点主要包括网络编程、多线程以及用户界面设计。 1. **网络编程**...

    基于安卓的WIFI UDP通信 远程控制移动机器人+源码(毕业设计&课程设计&项目开发)

    基于安卓的WIFI UDP通信 远程控制移动机器人+源码,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用~ 基于安卓的WIFI UDP通信 远程控制移动机器人+源码,适合毕业...

    5款最好用的远程控制软件点评

    - 提供企业版,适合企业进行远程管理和办公,可以批量发送文件,远程控制员工电脑,且支持U盾安全加密,增强了安全性。 2. **花生壳远程控制** - 花生壳远程控制软件适用于企业和专业人士,通过浏览器即可进行...

    Moonburn 远程控制

    此外,还可以深入理解网络协议,如TCP/IP、UDP等在远程控制场景下的应用,以及如何实现安全的数据传输和身份验证机制。 总的来说,"Moonburn 远程控制"为学习远程控制技术和易语言编程提供了宝贵的资源。无论是对...

    远程控制软件anywhere源码

    1. **网络通信模块**:这是远程控制的基础,通常涉及到TCP/IP协议、UDP或HTTP等通信协议。这部分源码会展示如何建立安全、可靠的网络连接,以及如何实现数据的实时传输和同步。 2. **屏幕捕获与显示**:远程控制...

Global site tag (gtag.js) - Google Analytics