基于UDP的网络通信之屏幕共享(1)(2)
部分代码如下:
发送者:
- package V0913;
- import java.awt.Dimension;
- import java.awt.Rectangle;
- import java.awt.Robot;
- import java.awt.Toolkit;
- import java.awt.image.BufferedImage;
- import java.io.BufferedOutputStream;
- import java.io.ByteArrayOutputStream;
- import java.io.File;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.net.DatagramPacket;
- import java.net.InetAddress;
- import java.net.MulticastSocket;
- import java.net.UnknownHostException;
- import java.util.ArrayList;
- import javax.imageio.ImageIO;
- /**
- * 发送数据的线程
- *
- * @author 斌
- * @2014年9月13日
- */
- public class SendThread extends Thread {
- InetAddress inetAdd;
- MulticastSocket cast;
- byte biaoji = 0;
- public void run() {
- try {
- // 创建组播地址
- inetAdd = InetAddress.getByName("230.0.0.1");
- // 创建组播的Socket对象
- cast = new MulticastSocket();
- // 截屏
- Robot robot = new Robot();
- Dimension dis = Toolkit.getDefaultToolkit().getScreenSize();
- BufferedImage image;
- while (Login.connected) {
- // 得到屏幕截图数据
- image = robot.createScreenCapture(new Rectangle(dis));
- // 将图片转换为byte数组
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- ImageIO.write(image, "png", baos);
- byte[] data = baos.toByteArray();
- // new BufferedOutputStream(new FileOutputStream(new File(
- // "data.txt"))).write(data);
- send(data);
- // // 数据丢失的模拟
- // byte dt[] = { 0, 122, 2, 1, 4, 1, 2, 3, 4 };
- // DatagramPacket packet = new DatagramPacket(dt, dt.length,
- // inetAdd, 9876);
- //
- // // 将其发送
- // try {
- // cast.send(packet);
- // } catch (IOException e) {
- // e.printStackTrace();
- // }
- if (biaoji < 100) {
- biaoji++;
- } else {
- biaoji = 0;
- }
- Thread.sleep(30);
- }
- } catch (UnknownHostException e) {
- e.printStackTrace();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- public void send(byte[] data) {
- // 将data数组拆分发送
- long length = data.length;// 数据总长度
- ArrayList<byte[]> list = new ArrayList<byte[]>();
- byte size = (byte) (length / 10000 + 1);// 这张图片有多少组数据数据
- int j = 0;
- while (j < size) {
- byte[] dataTemp;
- int temp;
- if (j < size - 1) {
- temp = 10000;
- } else {
- temp = (int) (length % 10000);// 最后一次需要的大小
- }
- dataTemp = new byte[10010];
- dataTemp[0] = 0;// 类型
- dataTemp[1] = biaoji;// 记号,接收方用来判断是不是丢了数据
- dataTemp[2] = size;// 总共有多少组数据需要接收
- dataTemp[3] = getLength(temp);// 数据大小占了数组几位
- for (int i = 0; i < dataTemp[3]; i++) {
- // 将数据大小保存起来
- dataTemp[i + 4] = getElem(temp, i);
- }
- // 每次存10000个字节数据
- for (int i = 0; i < temp; i++) {
- dataTemp[i + 4 + dataTemp[3]] = data[j * 10000 + i];
- }
- list.add(dataTemp);
- j++;
- }
- // 循环发送数据
- for (int i = 0; i < list.size(); i++) {
- // 将其打包
- DatagramPacket packet = new DatagramPacket(list.get(i),
- list.get(i).length, inetAdd, 9876);
- // 将其发送
- try {
- cast.send(packet);
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- System.out.println("发送了一张图片");
- }
- /**
- * 获得一个long的位数
- *
- * @param num
- * @return
- */
- private byte getLength(long num) {
- byte count = 1;
- while (num / 10 != 0) {
- num /= 10;
- count++;
- }
- return count;
- }
- /**
- * 获得num中第index位的数字,以0开始计算起始位置
- *
- * @param num
- * @param index
- * @return
- */
- private byte getElem(long num, int index) {
- int length = getLength(num);
- // 最后一个
- if ((index + 1) == length) {
- return (byte) (num % 10);
- }
- long count = num;
- for (int i = 0; i < length - index - 1; i++) {
- countcount = count / 10;
- }
- countcount = count % 10;
- return (byte) count;
- }
- }
评论暂时关闭