黑马程序员技术交流社区

标题: [JavaEE] 【广州校区】+【原创】网络编程屏幕广播之学生端 [打印本页]

作者: yqw_gz_java    时间: 2018-9-27 12:29
标题: [JavaEE] 【广州校区】+【原创】网络编程屏幕广播之学生端
字节转换工具类
[AppleScript] 纯文本查看 复制代码
package cn.itcast.screenbroadcast;

import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;

import javax.imageio.ImageIO;

public class Util {
        //
        private static Robot robot ;
       
        //
        static{
                try {
                        robot = new Robot();
                } catch (Exception e) {
                        e.printStackTrace();
                }
        }
       
        /**
         * ץͼ
         */
        public static byte[] captureScreen(){
                try {
                        BufferedImage image = robot.createScreenCapture(new Rectangle(0, 0, 1366, 768));
                        ByteArrayOutputStream baos = new ByteArrayOutputStream();
                        ImageIO.write(image, "jpg", baos);
                        return baos.toByteArray();
                } catch (Exception e) {
                        e.printStackTrace();
                }
                return null ;
        }
       

        public static byte[] long2Bytes(long l){
                byte[] bytes = new byte[8] ;
                bytes[0] = (byte)l ;
                bytes[1] = (byte)(l >> 8) ;
                bytes[2] = (byte)(l >> 16) ;
                bytes[3] = (byte)(l >> 24) ;
                bytes[4] = (byte)(l >> 32) ;
                bytes[5] = (byte)(l >> 40) ;
                bytes[6] = (byte)(l >> 48) ;
                bytes[7] = (byte)(l >> 56) ;
                return bytes ;
        }
       
        public static long byte2Long(byte[] bytes){
                return ((long)(bytes[0] & 0xFF))
                                | ((long)(bytes[1] & 0xFF) << 8)
                                | ((long)(bytes[2] & 0xFF) << 16)
                                | ((long)(bytes[3] & 0xFF) << 24)
                                | ((long)(bytes[4] & 0xFF) << 32)
                                | ((long)(bytes[5] & 0xFF) << 40)
                                | ((long)(bytes[6] & 0xFF) << 48)
                                | ((long)(bytes[7] & 0xFF) << 56);
        }
       

        public static byte[] int2Bytes(int l){
                byte[] bytes = new byte[8] ;
                bytes[0] = (byte)l ;
                bytes[1] = (byte)(l >> 8) ;
                bytes[2] = (byte)(l >> 16) ;
                bytes[3] = (byte)(l >> 24) ;
                return bytes ;
        }
       
        public static int bytes2Int(byte[] bytes){
                return ((bytes[0] & 0xFF))
                                | ((bytes[1] & 0xFF) << 8)
                                | ((bytes[2] & 0xFF) << 16)
                                | ((bytes[3] & 0xFF) << 24);
        }
       
        public static int byte2Int(byte[] bytes,int offset){
                return ((bytes[0 + offset] & 0xFF))
                                | ((bytes[1 + offset] & 0xFF) << 8)
                                | ((bytes[2 + offset] & 0xFF) << 16)
                                | ((bytes[3 + offset] & 0xFF) << 24);
        }


        public static byte[] zipData(byte[] rawData) {
                try {
                        //
                        ByteArrayOutputStream baos = new ByteArrayOutputStream();
                        ZipOutputStream zos = new ZipOutputStream(baos);
                        zos.putNextEntry(new ZipEntry("one"));
                        zos.write(rawData);
                        zos.close();
                        return baos.toByteArray();
                } catch (Exception e) {
                        e.printStackTrace();
                }
                return null;
        }
       

        public static byte[] unzipData(byte[] zipData) {
                try {
                        //
                        ByteArrayInputStream bais = new ByteArrayInputStream(zipData);
                        ZipInputStream zis = new ZipInputStream(bais);
                       
                        ByteArrayOutputStream baos = new ByteArrayOutputStream();
                        zis.getNextEntry();
                        byte[] buf = new byte[1024];
                        int len = 0 ;
                        while((len = zis.read(buf)) != -1){
                                baos.write(buf, 0, len);
                        }
                        zis.close();
                        bais.close();
                        baos.close();
                        return baos.toByteArray();
                } catch (Exception e) {
                        e.printStackTrace();
                }
                return null;
        }
}
界面
[AppleScript] 纯文本查看 复制代码
package cn.itcast.screenbroadcast;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;

/**
* StudentUI
*/
public class StudentUI extends JFrame{
       
        private JLabel lblIcon ;
       
        public StudentUI(){
                init();
        }

        private void init() {
                this.setTitle("yqw广播");
                this.setBounds(0, 0, 1366, 768);
                this.setLayout(null);
               

                lblIcon = new JLabel();
                lblIcon.setBounds(0, 0, 1366, 768);
               

                ImageIcon icon = new ImageIcon("D:/Koala.jpg");
                lblIcon.setIcon(icon);
                this.add(lblIcon);
                this.setVisible(true);
        }
       

        public void updateIcon(byte[] dataBytes){
                ImageIcon icon = new ImageIcon(dataBytes);
                lblIcon.setIcon(icon);
        }
}

数据接收类
[AppleScript] 纯文本查看 复制代码
package cn.itcast.screenbroadcast;

import java.io.ByteArrayOutputStream;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.util.HashMap;
import java.util.Map;

public class Receiver extends Thread {
        private DatagramSocket sock ;
        private DatagramPacket pack ;
        private byte[] buf = new byte[Teacher.FRAME_UNIT_MAX + 14];
       
        //
        private Map<Integer, FrameUnit> unitMap = new HashMap<Integer,FrameUnit>();
       
        //
        private StudentUI ui;
       
        public Receiver(StudentUI ui){
                try {
                        this.ui = ui ;
                        sock = new DatagramSocket(8888);
                        pack = new DatagramPacket(buf, buf.length);
                } catch (Exception e) {
                        e.printStackTrace();
                }
        }
       
        public void run() {
                try {
                        long currentFrameId = 0 ;
                        while(true){
                                sock.receive(pack);
                                int len = pack.getLength();
                                //ת����֡��Ԫ
                                FrameUnit funit = convertData2FrameUnit(buf,0,len);
                                long newFrameId = funit.getFrameId();
                                //ͬһframe
                                if(newFrameId == currentFrameId){
                                        unitMap.put(funit.getUnitNo(), funit);
                                }
                                //��frame
                                else if(newFrameId > currentFrameId){
                                        currentFrameId = newFrameId ;
                                        unitMap.clear();
                                        unitMap.put(funit.getUnitNo(), funit);
                                }
                                processFrame();
                        }
                } catch (Exception e) {
                        e.printStackTrace();
                }
        }

        /**
         * ��������unit����
         */
        private void processFrame() {
                try {
                        //�õ�Frame���ܵ�unit����
                        int unitCont = unitMap.values().iterator().next().getUnitCont();
                        if(unitMap.size() == unitCont ){
                                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                                for(int i = 0 ; i < unitCont ; i ++){
                                        FrameUnit fu = unitMap.get(i);
                                        fu.getData();
                                        baos.write(fu.getData());
                                }
                                unitMap.clear();
                               
                                //
                                ui.updateIcon(Util.unzipData(baos.toByteArray()));
                        }
                } catch (Exception e) {
                        e.printStackTrace();
                }
        }

        /**
         * ת��ÿ��packΪFrameunit
         */
        private FrameUnit convertData2FrameUnit(byte[] buf2, int i, int len) {
                byte[] data = new byte[len];
                System.arraycopy(buf2, 0, data, 0, len);
               
                FrameUnit unit = new FrameUnit();
                unit.setFrameId(Util.byte2Long(data));
                unit.setUnitCont(data[8]);
                unit.setUnitNo(data[9]);
                unit.setDateLen(Util.byte2Int(data,10));
               
                byte[] frameUnitBytes = new byte[unit.getDateLen()];
                System.arraycopy(buf2, 14, frameUnitBytes, 0, unit.getDateLen());
               
                unit.setData(frameUnitBytes);
                return unit;
        }
}

app 程序入口
[AppleScript] 纯文本查看 复制代码
package cn.itcast.screenbroadcast;

/**
* ���ܷ�
*
*/
public class Student {
        public static void main(String[] args) {
                StudentUI ui = new StudentUI();
                new Receiver(ui).start();
        }
}







欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2