[b][size=18px]服务端[/size][/b]
public class XJCS { public short iPreviewWidth = 0; public short iPreviewHeight = 0; public short refreshRate = 50;// 刷新率 毫秒 public byte imageQuality = 60;// 图像质量 /** * 0后 1前 摄像头 */ public byte cameraID = 0; }
public class SendHead { public int cmd=0; public int size=0; public int csA=0; public int csB=0;
@Override public void onPreviewFrame(byte[] data, Camera camera) { if(xjcs.refreshRate>0) { long l=System.currentTimeMillis(); if(l<execuTime+xjcs.refreshRate) { return; } execuTime=l; } YuvImg=new YuvImage(data, ImageFormat.NV21,xjcs.iPreviewWidth ,xjcs.iPreviewHeight, null); byteArrOut.reset(); try { YuvImg.compressToJpeg(img_rect, xjcs.imageQuality, byteArrOut); } catch (Exception e) { FF.scErr("img.compressToJpeg"); e.printStackTrace(); return; } comByte=byteArrOut.toByteArray(); sh5.size=comByte.length;// SendHead //----------将图标添加发送列队 ssoc.SQ.add(sh5,comByte, sh5.size); ssoc.SQ.exec(); //-------------------------- comByte=null; }
[size=18px]发送列队[/size]
[code=java]
public class XC_SendQueue extends Thread { Object sync=new Object(); LinkedList<struct_SendData> queue=new LinkedList<struct_SendData>(); XC_SendQueue() { } private boolean __break=false; private boolean __Tstopped=false; private struct_SendData ssd; public void add(byte[] byte_, int size) { ssd = new struct_SendData(); ssd.data = byte_; ssd.size = size; queue.addFirst(ssd); } public void add(SendHead sh,byte[] byte_, int size) { ssd = new struct_SendData(); ssd.data = toNetMsg?sh.toNetMsg():sh.toBytes(); ssd.size = SendHead.HEADSIZE; queue.addFirst(ssd); ssd = new struct_SendData(); ssd.data = byte_; ssd.size = size; queue.addFirst(ssd); } public void add(struct_SendData ssd_) { queue.addFirst(ssd_); } public boolean isAlive2() { return __Tstopped; } public void interrupt2() { __break=true; exec(); } public void exec() { synchronized (sync) { sync.notify(); } } @Override public void run() { struct_SendData sj; while(true) { synchronized (sync_send) { while(!queue.isEmpty()) { sj=queue.removeLast(); try { outStream.write(sj.data,0,sj.size); } catch (IOException e) { e.printStackTrace(); FF.scErr("IOException:45124"); if(!setSocketError(SocketError.ERROR_IOEXCEPTION,"XC_SendQueue:IOException:123"))return;; } } } synchronized (sync) { try { sync.wait(); } catch (InterruptedException e) { e.printStackTrace(); FF.scErr("sync.wait();"); if(!setSocketError(SocketError.ERROR_IOEXCEPTION,"XC_SendQueue:synchronized (sync) :547"))return;; } } if(__break)break; } __Tstopped=true; } }
[/code]
[size=18px]客户端
[/size]
连接到服务端
boolean connectServer(String ip) { if(csoc.socket!=null){if(csoc.isIOException==false)return true;} //ff.toast("开始连接..."); // Socket soc=csoc.connectToServer("192.168.43.1",1234); if(ip!=null && ip.equals(""))ip=new String("192.168.43.1"); if(ip==null)ip=new String("192.168.43.1"); //ff.xxk(ip); Socket soc=csoc.connectToServer(ip,1234); if(soc==null) { ff.xxk("连接失败"); ll_control.setVisibility(View.VISIBLE); return false; } csoc.toNetMsg=false; csoc.initSocket(soc); csoc.setOnRecvSendHead(this); csoc.setOnSocketError(this); csoc.startRecv(recvBuffer); ff.setTitle("已连接 "); return true; } [/code] [code=java] @Override public boolean onSocketReceivedData(SendHead sh, byte[] data,MySocket ___sssss) { switch (sh.cmd) { case command.ML_FILE_Picture: { Gbmp=BitmapFactory.decodeByteArray(data, 0, sh.size); chan.sendEmptyMessage(chan.msgImgPreviewShowBitmap); }break; return true; } [/code]
https://pan.baidu.com/s/1w3N7x9od3D9biK2eFeZGvQ