第一題:udp傳輸屏幕廣播(低於64k)。 import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.ImageIcon; import java.net.DatagramPacket; import java.net.DatagramSocket; class ClientDemo{ public static void main(String[] args) throws Exception{ ClientUI ui = new ClientUI(); new ClientReceive(ui).start(); } } class ClientUI extends JFrame{ private JLabel label; private ImageIcon icon; public ClientUI(){ ini(); } public void ini(){ this.setBounds(0,0,600,400); this.setLayout(null); label = new JLabel(); label.setBounds(0,0,600,400); label.setLayout(null); icon = new ImageIcon("e:/a.png"); label.setIcon(icon); this.add(label); this.setVisible(true); } public void refreshImage(byte[] image_arr){ label.setIcon(new ImageIcon(image_arr)); } } class ClientReceive extends Thread{ private DatagramSocket socket; private ClientUI ui; public ClientReceive(ClientUI ui) throws Exception{ this.ui = ui; socket = new DatagramSocket(8889); } public void run(){ try{ int i = 0; while(true){ byte[] buf = new byte[1024*60]; DatagramPacket packet = new DatagramPacket(buf,buf.length); socket.receive(packet); int length = packet.getLength(); ui.refreshImage(buf); Thread.sleep(1000); } }catch(Exception e){ e.printStackTrace(); } } } import java.net.DatagramSocket; import java.net.DatagramPacket; import java.net.InetAddress; import java.awt.Rectangle; import java.awt.image.BufferedImage; import java.awt.Robot; import javax.imageio.ImageIO; import java.io.FileOutputStream; import java.io.ByteArrayOutputStream; import java.util.zip.GZIPOutputStream; class ServerDemo{ public static void main(String[] args) throws Exception{ DatagramSocket socket = new DatagramSocket(8888); int i = 0; while(true){ byte[] buf = null; buf = new byte[1024*60]; Rectangle rect = new Rectangle(0,0,600,400); BufferedImage image = (new Robot()).createScreenCapture(rect); ByteArrayOutputStream baos = new ByteArrayOutputStream(); ImageIO.write(image,"jpg",baos); byte[] zipData = baos.toByteArray(); DatagramPacket packet = new DatagramPacket(zipData,zipData.length); InetAddress addr = InetAddress.getByName("127.0.0.1"); packet.setAddress(addr); packet.setPort(8889); socket.send(packet); i++; Thread.sleep(1000); System.out.println(i); } } } 第二題:udp傳輸屏幕廣播,當傳遞數據64k時,進行拆包組合。沒有使用壓縮功能。 import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.ImageIcon; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.util.Map; import java.util.HashMap; import java.io.ByteArrayOutputStream; class ClientDemo{ public static void main(String[] args) throws Exception{ ClientUI ui = new ClientUI(); new ClientReceive(ui).start(); } } class ClientUI extends JFrame{ private JLabel label; private ImageIcon icon; public ClientUI(){ ini(); } public void ini(){ this.setSize(1024,768); this.setLocation(200,200); this.setLayout(null); label = new JLabel(); label.setBounds(0,0,1024,768); label.setLayout(null); icon = new ImageIcon("e:/a.jpg"); label.setIcon(icon); this.add(label); this.setVisible(true); } public void refreshImage(byte[] image_arr){ label.setIcon(new ImageIcon(image_arr)); } } class ClientReceive extends Thread{ private DatagramSocket socket; private ClientUI ui; private Map<Long,Map<Integer,FrameUnit>> frames = new HashMap<Long,Map<Integer,FrameUnit>>(); public ClientReceive(ClientUI ui) throws Exception{ this.ui = ui; socket = new DatagramSocket(8889); } public void run(){ try{ byte[] buf = new byte[1024*60]; DatagramPacket packet = new DatagramPacket(buf,buf.length); while(true){ socket.receive(packet); FrameUnit unit = new FrameUnit(packet); Map<Integer,FrameUnit> old = null; if(frames.containsKey(unit.getGid())){ old = frames.get(unit.getGid()); old.put(unit.getIndex(),unit); }else{ old = new HashMap<Integer,FrameUnit>(); old.put(unit.getIndex(),unit); frames.put(unit.getGid(),old); } int count = unit.getCount(); int receive_count = frames.get(unit.getGid()).size(); if(count == receive_count){ byte[] image = ClientUtil.mergeImage(old); ui.refreshImage(image); } } }catch(Exception e){ e.printStackTrace(); } } } class FrameUnit{ private long gid; private int count; private int index; private byte[] rawData; public FrameUnit(DatagramPacket packet){ parsePacket(packet); } public long getGid(){ return gid; } public int getCount(){ return count; } public int getIndex(){ return index; } public byte[] getRawData(){ return rawData; } public void parsePacket(DatagramPacket packet){ byte[] buf = packet.getData(); int length = packet.getLength(); byte[] validData = new byte[length]; System.arraycopy(buf,0,validData,0,length); //zip this.gid = ClientUtil.bytesToLong(validData); // 0-7 this.count = validData[8]; this.index = validData[9]; rawData = new byte[length - 10]; System.arraycopy(validData,10,rawData,0,length - 10); } } class ClientUtil{ //0-7 = 8 byte 0 0 0 0 0 0 0 0 public static long bytesToLong(byte[] bytes){ long i0 = (bytes[0] & 0xffL) << 56; long i1 = (bytes[1] & 0xffL) << 48; long i2 = (bytes[2] & 0xffL) << 40; long i3 = (bytes[3] & 0xffL) << 32; long i4 = (bytes[4] & 0xffL) << 24; long i5 = (bytes[5] & 0xffL) << 16; long i6 = (bytes[6] & 0xffL) << 8; long i7 = (bytes[7] & 0xffL) << 0; return i0 | i1 | i2 | i3 | i4 | i5 | i6 | i7; } public static byte[] longToBytes(long i){ byte bytes[] = new byte[8]; bytes[0] = (byte)(i >> 56); bytes[1] = (byte)(i >> 48); bytes[2] = (byte)(i >> 40); bytes[3] = (byte)(i >> 32); bytes[4] = (byte)(i >> 24); bytes[5] = (byte)(i >> 16); bytes[6] = (byte)(i >> 8); bytes[7] = (byte)(i >> 0); return bytes; } public static byte[] mergeImage(Map<Integer,FrameUnit> units){ try{ ByteArrayOutputStream baos = new ByteArrayOutputStream(); for(int i = 0;i < units.size();i++){ FrameUnit unit = units.get(i); baos.write(unit.getRawData()); } return baos.toByteArray(); }catch(Exception e){ e.printStackTrace(); } return null; } } import java.net.DatagramSocket; import java.net.DatagramPacket; import java.net.InetAddress; import java.awt.Rectangle; import java.awt.image.BufferedImage; import java.awt.Robot; import javax.imageio.ImageIO; import java.io.FileOutputStream; import java.io.ByteArrayOutputStream; import java.util.zip.GZIPOutputStream; import java.util.zip.ZipOutputStream; import java.util.List; import java.util.ArrayList; import java.util.Map; import java.util.HashMap; class ServerDemo{ public static void main(String[] args) throws Exception{ (new ServerSender()).start(); } } class ServerSender{ public void start(){ try{ DatagramSocket socket = new DatagramSocket(8888); while(true){ byte[] rawData = captureScreen(); List<DatagramPacket> packet_list = splitPacket(rawData,InetAddress.getByName("127.0.0.1"),8889); for(DatagramPacket p : packet_list){ socket.send(p); } } }catch(Exception e){ e.printStackTrace(); } } public static byte[] captureScreen(){ try{ Rectangle rect = new Rectangle(0,0,1024,768); BufferedImage image = (new Robot()).createScreenCapture(rect); ByteArrayOutputStream baos = new ByteArrayOutputStream(); ImageIO.write(image,"jpg",baos); byte[] bytes = baos.toByteArray(); return bytes; }catch(Exception e){ e.printStackTrace(); } return null; } public static List<DatagramPacket> splitPacket(byte[] rawData,InetAddress addr,int port){ int all_length = rawData.length; int pack_length = 60 * 1024; int count = 0; if(all_length % pack_length == 0){ count = all_length / pack_length; }else{ count = (all_length / pack_length) + 1; } long gid = System.nanoTime(); List<DatagramPacket> packet_list = new ArrayList<DatagramPacket>(); DatagramPacket packet = null; for(int i = 0;i < count;i++){ byte[] pack = null; if((i + 1) != count){ pack = new byte[pack_length + 10]; System.arraycopy(ServerUtil.longToBytes(gid),0,pack,0,8); pack[8] = (byte)count; pack[9] = (byte)i; System.arraycopy(rawData,i * pack_length,pack,10,pack_length); }else{ int remain = rawData.length - (count - 1) * pack_length; pack = new byte[remain + 10]; System.arraycopy(ServerUtil.longToBytes(gid),0,pack,0,8); pack[8] = (byte)count; pack[9] = (byte)i; System.arraycopy(rawData,i * pack_length,pack,10,remain); } packet = new DatagramPacket(pack,pack.length,addr,port); packet_list.add(packet); } return packet_list; } } //util class class ServerUtil{ //0-7 = 8 byte 0 0 0 0 0 0 0 0 public static long bytesToLong(byte[] bytes){ long i0 = (bytes[0] & 0xffL) << 56; long i1 = (bytes[1] & 0xffL) << 48; long i2 = (bytes[2] & 0xffL) << 40; long i3 = (bytes[3] & 0xffL) << 32; long i4 = (bytes[4] & 0xffL) << 24; long i5 = (bytes[5] & 0xffL) << 16; long i6 = (bytes[6] & 0xffL) << 8; long i7 = (bytes[7] & 0xffL) << 0; return i0 | i1 | i2 | i3 | i4 | i5 | i6 | i7; } public static byte[] longToBytes(long i){ byte bytes[] = new byte[8]; bytes[0] = (byte)(i >> 56); bytes[1] = (byte)(i >> 48); bytes[2] = (byte)(i >> 40); bytes[3] = (byte)(i >> 32); bytes[4] = (byte)(i >> 24); bytes[5] = (byte)(i >> 16); bytes[6] = (byte)(i >> 8); bytes[7] = (byte)(i >> 0); return bytes; } }
大數據Java基礎第十八天作業
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.