基于UDP的网络通信之屏幕共享(1)(3)
接收者:
- package V0913;
- import java.io.IOException;
- import java.net.DatagramPacket;
- import java.net.InetAddress;
- import java.net.MulticastSocket;
- import java.util.ArrayList;
- import javax.swing.ImageIcon;
- /**
- * 接收数据的线程
- *
- * @author 斌
- * @2014年9月13日
- */
- public class ReceiveThread extends Thread {
- private MulticastSocket cast;
- public void run() {
- try {
- // 创建窗口
- MainUI mu = new MainUI();
- // 创建socket用来接收数据
- cast = new MulticastSocket(9876);
- // 定义组播地址
- InetAddress inetAdd = InetAddress.getByName("230.0.0.1");
- // 将socket加入该地址组
- cast.joinGroup(inetAdd);
- System.out.println("stratServer");
- while (mu.connect) {
- ImageIcon icon = receive();
- // 显示在窗口上
- if (icon != null) {
- mu.label.setIcon(icon);
- mu.center.repaint();
- }
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- public ImageIcon receive() throws IOException {
- ArrayList<byte[]> list = new ArrayList<byte[]>();
- // 创建数据包对象
- byte dataTemp[] = new byte[10010];
- long alllength = 0;
- DatagramPacket packet = new DatagramPacket(dataTemp, dataTemp.length);
- // 接收数据包
- cast.receive(packet);
- // 提取头部信息进行解析,第0个为类型,判断是否为0,第1个为记号,第2个为多少个数据需要接受,第3个为长度的长度,之后接着长度信息,之后再是数据
- int biaoji = dataTemp[1];
- byte size = dataTemp[2];
- alllength += getLength(dataTemp);
- list.add(dealData(dataTemp));
- for (int i = 1; i < size; i++) {
- packet = new DatagramPacket(dataTemp, dataTemp.length);
- // 接收数据包
- cast.receive(packet);
- if (biaoji == dataTemp[1]) {
- list.add(dealData(dataTemp));
- alllength += getLength(dataTemp);
- } else {
- // ***************************************************************************************//
- System.out.println("有数据丢了");
- // 初始化数据
- list.clear();
- biaoji = dataTemp[1];
- size = dataTemp[2];
- i = 0;
- list.add(dealData(dataTemp));
- alllength = getLength(dataTemp);
- }
- }
- // 将list中的数组全部加到data中去
- byte data[] = new byte[(int) alllength];
- for (int i = 0; i < list.size(); i++) {
- byte t[] = list.get(i);
- for (int j = 0; j < t.length; j++) {
- data[i * 10000 + j] = t[j];
- }
- }
- // new BufferedOutputStream(new FileOutputStream(new File("data.txt")))
- // .write(data);
- // 将数据还原成图像
- ImageIcon icon = new ImageIcon(data);
- return icon;
- }
- /**
- * 处理收到的数据,得到真正需要的数据
- *
- * @param dataTemp
- * @return
- */
- public byte[] dealData(byte dataTemp[]) {
- int length = getLength(dataTemp);// 一般为10000
- byte[] data = new byte[length];
- // 得到了数据长度,之后开始读数据
- for (int i = 0; i < length; i++) {
- data[i] = dataTemp[i + dataTemp[3] + 4];
- }
- return data;
- }
- /**
- * 获得实际需要数据的长度
- *
- * @param dataTemp
- * @return
- */
- public int getLength(byte dataTemp[]) {
- byte temp[] = new byte[dataTemp[3]];
- for (int i = 0; i < dataTemp[3]; i++) {
- temp[i] = dataTemp[i + 4];
- }
- return getNum(temp);
- }
- /**
- * 根据byte数组合成一个数字 如:{1,2,3,4}合成之后为1234
- *
- * @param data
- * @return
- */
- public int getNum(byte data[]) {
- int temp = 0;
- for (int i = 0; i < data.length; i++) {
- temp += data[i] * Math.pow(10, data.length - i - 1);
- }
- return temp;
- }
- }
评论暂时关闭