接收者:

  1. package V0913;   
  2.    
  3. import java.io.IOException;   
  4. import java.net.DatagramPacket;   
  5. import java.net.InetAddress;   
  6. import java.net.MulticastSocket;   
  7. import java.util.ArrayList;   
  8.    
  9. import javax.swing.ImageIcon;   
  10.    
  11. /**  
  12.  * 接收数据的线程  
  13.  *   
  14.  * @author 斌  
  15.  * @2014年9月13日  
  16.  */   
  17. public class ReceiveThread extends Thread {   
  18.    
  19.     private MulticastSocket cast;   
  20.    
  21.     public void run() {   
  22.    
  23.         try {   
  24.             // 创建窗口   
  25.             MainUI mu = new MainUI();   
  26.             // 创建socket用来接收数据   
  27.             cast = new MulticastSocket(9876);   
  28.             // 定义组播地址   
  29.             InetAddress inetAdd = InetAddress.getByName("230.0.0.1");   
  30.             // 将socket加入该地址组   
  31.             cast.joinGroup(inetAdd);   
  32.             System.out.println("stratServer");   
  33.             while (mu.connect) {   
  34.                 ImageIcon icon = receive();   
  35.                 // 显示在窗口上   
  36.                 if (icon != null) {   
  37.                     mu.label.setIcon(icon);   
  38.                     mu.center.repaint();   
  39.                 }   
  40.             }   
  41.         } catch (IOException e) {   
  42.             e.printStackTrace();   
  43.         }   
  44.     }   
  45.    
  46.     public ImageIcon receive() throws IOException {   
  47.    
  48.         ArrayList<byte[]> list = new ArrayList<byte[]>();   
  49.         // 创建数据包对象   
  50.    
  51.         byte dataTemp[] = new byte[10010];   
  52.    
  53.         long alllength = 0;   
  54.    
  55.         DatagramPacket packet = new DatagramPacket(dataTemp, dataTemp.length);   
  56.    
  57.         // 接收数据包   
  58.    
  59.         cast.receive(packet);   
  60.         // 提取头部信息进行解析,第0个为类型,判断是否为0,第1个为记号,第2个为多少个数据需要接受,第3个为长度的长度,之后接着长度信息,之后再是数据   
  61.    
  62.         int biaoji = dataTemp[1];   
  63.         byte size = dataTemp[2];   
  64.         alllength += getLength(dataTemp);   
  65.         list.add(dealData(dataTemp));   
  66.    
  67.         for (int i = 1; i < size; i++) {   
  68.             packet = new DatagramPacket(dataTemp, dataTemp.length);   
  69.             // 接收数据包   
  70.             cast.receive(packet);   
  71.             if (biaoji == dataTemp[1]) {   
  72.                 list.add(dealData(dataTemp));   
  73.                 alllength += getLength(dataTemp);   
  74.             } else {   
  75.                 // ***************************************************************************************//   
  76.                 System.out.println("有数据丢了");   
  77.                 // 初始化数据   
  78.                 list.clear();   
  79.                 biaoji = dataTemp[1];   
  80.                 size = dataTemp[2];   
  81.                 i = 0;   
  82.                 list.add(dealData(dataTemp));   
  83.                 alllength = getLength(dataTemp);   
  84.             }   
  85.         }   
  86.         // 将list中的数组全部加到data中去   
  87.         byte data[] = new byte[(int) alllength];   
  88.         for (int i = 0; i < list.size(); i++) {   
  89.             byte t[] = list.get(i);   
  90.             for (int j = 0; j < t.length; j++) {   
  91.                 data[i * 10000 + j] = t[j];   
  92.             }   
  93.         }   
  94.         // new BufferedOutputStream(new FileOutputStream(new File("data.txt")))   
  95.         // .write(data);   
  96.    
  97.         // 将数据还原成图像   
  98.         ImageIcon icon = new ImageIcon(data);   
  99.         return icon;   
  100.     }   
  101.    
  102.     /**  
  103.      * 处理收到的数据,得到真正需要的数据  
  104.      *   
  105.      * @param dataTemp  
  106.      * @return  
  107.      */   
  108.     public byte[] dealData(byte dataTemp[]) {   
  109.    
  110.         int length = getLength(dataTemp);// 一般为10000   
  111.    
  112.         byte[] data = new byte[length];   
  113.         // 得到了数据长度,之后开始读数据   
  114.         for (int i = 0; i < length; i++) {   
  115.             data[i] = dataTemp[i + dataTemp[3] + 4];   
  116.         }   
  117.         return data;   
  118.     }   
  119.    
  120.     /**  
  121.      * 获得实际需要数据的长度  
  122.      *   
  123.      * @param dataTemp  
  124.      * @return  
  125.      */   
  126.     public int getLength(byte dataTemp[]) {   
  127.         byte temp[] = new byte[dataTemp[3]];   
  128.         for (int i = 0; i < dataTemp[3]; i++) {   
  129.             temp[i] = dataTemp[i + 4];   
  130.         }   
  131.    
  132.         return getNum(temp);   
  133.     }   
  134.    
  135.     /**  
  136.      * 根据byte数组合成一个数字 如:{1,2,3,4}合成之后为1234  
  137.      *   
  138.      * @param data  
  139.      * @return  
  140.      */   
  141.     public int getNum(byte data[]) {   
  142.         int temp = 0;   
  143.         for (int i = 0; i < data.length; i++) {   
  144.             temp += data[i] * Math.pow(10, data.length - i - 1);   
  145.         }   
  146.         return temp;   
  147.     }   
  148. }   


相关内容