第一次寫博客有點不太會寫。。。。
因為參加比賽,需要服務器傳輸圖片。socket的IO流被封裝成ObjectOutputStream和ObjectInputStream的 所以傳輸數據的時候需要把數據包對象序列化,但是BufferedImage是不可序列化的,Java內核沒有為它實現序列化接口(試過繼承BufferedImage 和 序列化接口,本人java不熟可能重寫有問題吧) 還是拋出不可序列化異常。於是通過BufferedImage轉化成byte[](byte[]是序列化對象)可以解決序列化網絡傳輸的問題
1 package bean; 2 3 import java.io.Serializable; 4 5 public class PacketBean implements Serializable { 6 7 private String packetType; 8 private Object data; 9 10 public String getPacketType() { 11 return packetType; 12 } 13 public void setPacketType(String packetType) { 14 this.packetType = packetType; 15 } 16 public Object getData() { 17 return data; 18 } 19 public void setData(Object data) { 20 this.data = data; 21 } 22 23 }
上面是數據包類
package util; import java.awt.Dimension; import java.awt.Rectangle; import java.awt.Robot; import java.awt.Toolkit; import java.awt.image.BufferedImage; import java.awt.image.RenderedImage; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.Serializable; import javax.imageio.ImageIO; public class ScreenShots implements Serializable { public BufferedImage screenshot; public ByteArrayOutputStream snapShot() { ByteArrayOutputStream out = new ByteArrayOutputStream(); // OutputStream outputStream = null; Dimension d = Toolkit.getDefaultToolkit().getScreenSize(); try { // 拷貝屏幕到一個BufferedImage對象screenshot screenshot = (new Robot()) .createScreenCapture(new Rectangle(0, 0, (int) d.getWidth(), (int) d.getHeight())); // 將screenshot對象寫入輸出流 ImageIO.write(screenshot, "jpg", out); } catch (Exception ex) { ex.printStackTrace(); } return out; } }
圖片數據包發送線程類
package thread; import java.awt.image.BufferedImage; import java.io.BufferedInputStream; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import javax.imageio.ImageIO; import util.ScreenShots; import bean.PacketBean; public class ScreenShotsThread extends Thread { private ObjectOutputStream objectOutputStream; public ScreenShotsThread(ObjectOutputStream objectOutputStream) { this.objectOutputStream = objectOutputStream; } @Override public void run() { ScreenShots screenShots = new ScreenShots(); ByteArrayOutputStream ByteArray = screenShots.snapShot(); byte[] datas = ByteArray.toByteArray(); try { PacketBean data = new PacketBean(); data.setPacketType("sendshots"); data.setData(datas); objectOutputStream.writeObject(data); objectOutputStream.flush(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
客戶端接受圖片線程類
package thread; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.DataInputStream; import java.io.File; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.net.Socket; import javax.imageio.ImageIO; import bean.PacketBean; public class CReadThead extends Thread { private Socket socket; private ObjectInputStream objectInputStream; public CReadThead(Socket socket, ObjectInputStream objectInputStream) { this.socket = socket; this.objectInputStream = objectInputStream; } @Override public void run() { while(true) { try { PacketBean data = (PacketBean) objectInputStream.readObject(); if(data.getPacketType().equals("sendshots")) { System.out.println("接受圖片"); byte[] ob = (byte[])data.getData(); createBit(ob); } } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } } public void createBit(byte[] obj) throws IOException { ByteArrayInputStream bin = new ByteArrayInputStream(obj); BufferedImage image = ImageIO.read(bin); ImageIO.write(image, "jpg", new File("C:/Users/admin/Desktop/2.jpg")); bin.close(); } }
Android客戶端接受圖片資源Bitmap可以通過以下方式進行:
public void receiveBmp(Object obj) { byte[] bytes = (byte[]) obj; Bitmap bmp = BitmapFactory.decodeByteArray(bytes, 0, bytes.length); }