package com.basic.security.utils.socket; import android.os.SystemClock; import com.basic.security.base.BaseApplication; import com.basic.security.model.OfficeDevice; import com.basic.security.utils.Constants; import com.basic.security.utils.SocketUtil; import java.net.ServerSocket; import java.net.Socket; import java.util.LinkedList; import java.util.Map; public class SnapshotYuvSocketServer { public static boolean serverStarted = false; public static void startYuvSocketServer() { if (serverStarted) { return; } BaseApplication.getApplication().executorService.execute(() -> { ServerSocket server = null; try { server = new ServerSocket(Constants.snapshotServerPort); } catch (Exception e) { e.printStackTrace(); } while (true) { try { if (server == null) { break; } serverStarted = true; Socket client = server.accept(); SnapshotYuvAcceptedClient snapshotYuvAcceptedClient = new SnapshotYuvAcceptedClient(client); snapshotYuvAcceptedClient.start(); } catch (Exception e) { e.printStackTrace(); } finally { SystemClock.sleep(3000); } } }); } public static class SnapshotYuvAcceptedClient extends Thread { private static final int MAX_BUFFER = 2; private static LinkedList mRgbCameraQueue = new LinkedList(); Socket mSocket; public SnapshotYuvAcceptedClient(Socket client) { mSocket = client; } public static void addCameraData(byte[] data) { synchronized (mRgbCameraQueue) { if (mRgbCameraQueue.size() == MAX_BUFFER) { mRgbCameraQueue.poll(); } mRgbCameraQueue.add(data); } } public byte[] getImageBuffer() { byte[] mLastFrame = null; synchronized (mRgbCameraQueue) { if (mRgbCameraQueue.size() > 0) { mLastFrame = mRgbCameraQueue.poll(); } } return mLastFrame; } @Override public void run() { SocketUtil socketUtil = new SocketUtil(); try { socketUtil.setSocket(mSocket); Map authMap = socketUtil.readMap(); socketUtil.deviceId = (String) authMap.get(OfficeDevice.deviceId); if (socketUtil.writeBitmapHeader()) { socketUtil.writeOneBitmap(getImageBuffer()); } while (!Thread.currentThread().isInterrupted()) { SystemClock.sleep(1000); } } catch (Exception e) { e.printStackTrace(); } finally { socketUtil.close(); } } } }