部分代码如下:

发送者:

  1. package V0913;   
  2.    
  3. import java.awt.Dimension;   
  4. import java.awt.Rectangle;   
  5. import java.awt.Robot;   
  6. import java.awt.Toolkit;   
  7. import java.awt.image.BufferedImage;   
  8. import java.io.BufferedOutputStream;   
  9. import java.io.ByteArrayOutputStream;   
  10. import java.io.File;   
  11. import java.io.FileOutputStream;   
  12. import java.io.IOException;   
  13. import java.net.DatagramPacket;   
  14. import java.net.InetAddress;   
  15. import java.net.MulticastSocket;   
  16. import java.net.UnknownHostException;   
  17. import java.util.ArrayList;   
  18.    
  19. import javax.imageio.ImageIO;   
  20.    
  21. /**  
  22.  * 发送数据的线程  
  23.  *   
  24.  * @author 斌  
  25.  * @2014年9月13日  
  26.  */   
  27. public class SendThread extends Thread {   
  28.    
  29.     InetAddress inetAdd;   
  30.     MulticastSocket cast;   
  31.     byte biaoji = 0;   
  32.    
  33.     public void run() {   
  34.         try {   
  35.             // 创建组播地址   
  36.             inetAdd = InetAddress.getByName("230.0.0.1");   
  37.             // 创建组播的Socket对象   
  38.             cast = new MulticastSocket();   
  39.    
  40.             // 截屏   
  41.             Robot robot = new Robot();   
  42.             Dimension dis = Toolkit.getDefaultToolkit().getScreenSize();   
  43.    
  44.             BufferedImage image;   
  45.             while (Login.connected) {   
  46.                 // 得到屏幕截图数据   
  47.                 image = robot.createScreenCapture(new Rectangle(dis));   
  48.                 // 将图片转换为byte数组   
  49.                 ByteArrayOutputStream baos = new ByteArrayOutputStream();   
  50.                 ImageIO.write(image, "png", baos);   
  51.                 byte[] data = baos.toByteArray();   
  52.    
  53.                 // new BufferedOutputStream(new FileOutputStream(new File(   
  54.                 // "data.txt"))).write(data);   
  55.    
  56.                 send(data);   
  57.                 // // 数据丢失的模拟   
  58.                 // byte dt[] = { 0, 122, 2, 1, 4, 1, 2, 3, 4 };   
  59.                 // DatagramPacket packet = new DatagramPacket(dt, dt.length,   
  60.                 // inetAdd, 9876);   
  61.                 //   
  62.                 // // 将其发送   
  63.                 // try {   
  64.                 // cast.send(packet);   
  65.                 // } catch (IOException e) {   
  66.                 // e.printStackTrace();   
  67.                 // }   
  68.    
  69.                 if (biaoji < 100) {   
  70.                     biaoji++;   
  71.                 } else {   
  72.                     biaoji = 0;   
  73.                 }   
  74.    
  75.                 Thread.sleep(30);   
  76.             }   
  77.         } catch (UnknownHostException e) {   
  78.             e.printStackTrace();   
  79.         } catch (Exception e) {   
  80.             e.printStackTrace();   
  81.         }   
  82.     }   
  83.    
  84.     public void send(byte[] data) {   
  85.         // 将data数组拆分发送   
  86.         long length = data.length;// 数据总长度   
  87.         ArrayList<byte[]> list = new ArrayList<byte[]>();   
  88.         byte size = (byte) (length / 10000 + 1);// 这张图片有多少组数据数据   
  89.         int j = 0;   
  90.         while (j < size) {   
  91.             byte[] dataTemp;   
  92.             int temp;   
  93.             if (j < size - 1) {   
  94.                 temp = 10000;   
  95.             } else {   
  96.                 temp = (int) (length % 10000);// 最后一次需要的大小   
  97.             }   
  98.             dataTemp = new byte[10010];   
  99.             dataTemp[0] = 0;// 类型   
  100.             dataTemp[1] = biaoji;// 记号,接收方用来判断是不是丢了数据   
  101.             dataTemp[2] = size;// 总共有多少组数据需要接收   
  102.             dataTemp[3] = getLength(temp);// 数据大小占了数组几位   
  103.             for (int i = 0; i < dataTemp[3]; i++) {   
  104.                 // 将数据大小保存起来   
  105.                 dataTemp[i + 4] = getElem(temp, i);   
  106.             }   
  107.             // 每次存10000个字节数据   
  108.             for (int i = 0; i < temp; i++) {   
  109.                 dataTemp[i + 4 + dataTemp[3]] = data[j * 10000 + i];   
  110.             }   
  111.    
  112.             list.add(dataTemp);   
  113.             j++;   
  114.         }   
  115.    
  116.         // 循环发送数据   
  117.         for (int i = 0; i < list.size(); i++) {   
  118.             // 将其打包   
  119.             DatagramPacket packet = new DatagramPacket(list.get(i),   
  120.                     list.get(i).length, inetAdd, 9876);   
  121.    
  122.             // 将其发送   
  123.             try {   
  124.                 cast.send(packet);   
  125.             } catch (IOException e) {   
  126.                 e.printStackTrace();   
  127.             }   
  128.         }   
  129.         System.out.println("发送了一张图片");   
  130.     }   
  131.    
  132.     /**  
  133.      * 获得一个long的位数  
  134.      *   
  135.      * @param num  
  136.      * @return  
  137.      */   
  138.     private byte getLength(long num) {   
  139.         byte count = 1;   
  140.         while (num / 10 != 0) {   
  141.             num /= 10;   
  142.             count++;   
  143.         }   
  144.         return count;   
  145.     }   
  146.    
  147.     /**  
  148.      * 获得num中第index位的数字,以0开始计算起始位置  
  149.      *   
  150.      * @param num  
  151.      * @param index  
  152.      * @return  
  153.      */   
  154.     private byte getElem(long num, int index) {   
  155.         int length = getLength(num);   
  156.         // 最后一个   
  157.         if ((index + 1) == length) {   
  158.             return (byte) (num % 10);   
  159.         }   
  160.         long count = num;   
  161.         for (int i = 0; i < length - index - 1; i++) {   
  162.             countcount = count / 10;   
  163.         }   
  164.         countcount = count % 10;   
  165.         return (byte) count;   
  166.     }   
  167. }   


相关内容