第一次写博客有点不太会写。。。。
因为参加比赛,需要服务器传输图片。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); }