package com.basic.security.utils.socket.server; import android.os.SystemClock; import com.basic.security.base.BaseApplication; import com.basic.security.manager.BaseManager; import com.basic.security.manager.FeatureManager; import com.basic.security.manager.GuestManager; import com.basic.security.manager.OrgManager; import com.basic.security.manager.PersonManager; import com.basic.security.model.IdCard; import com.basic.security.model.IdCardMessage; import com.basic.security.model.ModelAdapter; import com.basic.security.model.Person; import com.basic.security.model.PersonSocket; import com.basic.security.model.Sync; import com.basic.security.utils.Constants; import com.basic.security.utils.DetectedResult; import com.basic.security.utils.ObjectUtil; import com.basic.security.utils.SocketUtil; import org.apache.commons.io.IOUtils; import java.io.FileOutputStream; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class TableRowReceiveSocketServer { private static final int MAX_BUFFER = 1; public static List acceptedClientList = new ArrayList<>(); public static Lock acceptedClientListLock = new ReentrantLock(); public static boolean startServer = false; static long lastSetDetectedResult = 0; public static void startServer() { if (startServer) { return; } startServer = true; BaseApplication.getApplication().executorService.execute(() -> { ServerSocket server = null; try { server = new ServerSocket(Constants.personServerPort); } catch (Exception e) { e.printStackTrace(); } while (true) { try { if (server == null) { break; } Socket client = server.accept(); PersonAcceptedClient guestAcceptedSocketClient = new PersonAcceptedClient(client); guestAcceptedSocketClient.start(); } catch (Exception e) { e.printStackTrace(); } finally { SystemClock.sleep(1000); } } }); } public static class PersonAcceptedClient extends Thread { private final LinkedList detectedResultQueue = new LinkedList<>(); private final LinkedList cameraDataQueue = new LinkedList(); Socket mSocket; public PersonAcceptedClient(Socket client) { mSocket = client; } public void run() { SocketUtil socketUtil = new SocketUtil(); try { socketUtil.setSocket(mSocket); Map requestMap = socketUtil.readJsonAsMap(); String requestType = requestMap.get(PersonSocket.requestType); if (PersonSocket.requestTypeAsyncSave.equals(requestType)) { ModelAdapter modelAdapter = socketUtil.readModelAdapterMap(requestMap); String table = modelAdapter.getString(Constants.TABLE); if (Person.tableName.equals(table)) { byte[] camera_image_path_byte_array = (byte[]) modelAdapter.model.get(PersonSocket.camera_image_path_byte_array); if (camera_image_path_byte_array != null && camera_image_path_byte_array.length > 0) { modelAdapter.setBlob(Person.camera_image_path, camera_image_path_byte_array); } GuestManager.updateGuestName(modelAdapter); FeatureManager.addFeature(modelAdapter.getString(Person.id), modelAdapter.getBlob(Person.camera_image_feature)); } // System1.out.println("PersonAcceptedClient.run 1 " + modelAdapter); if (IdCard.tableName.equals(table)) { byte[] jpgData = (byte[]) modelAdapter.model.get(IdCardMessage.jpgData); if (jpgData != null && jpgData.length > 0) { try { String idCardPath = Constants.attachmentPath + modelAdapter.getString(IdCard.card_number) + ".jpg"; System1.out.println("PersonAcceptedClient.run idCardPath=" + idCardPath); IOUtils.write(jpgData, new FileOutputStream(idCardPath)); } catch (Exception e) { e.printStackTrace(); } } } modelAdapter.setString(Sync.needSync, Constants.FALSE); BaseManager.save(modelAdapter); socketUtil.writeResponseSuccess(); } if (PersonSocket.requestTypeAsyncDelete.equals(requestType)) { ModelAdapter modelAdapter = socketUtil.readModelAdapterMap(requestMap); String table = modelAdapter.getString(Constants.TABLE); if (Person.tableName.equals(table)) { String personId = modelAdapter.getString(Person.id); FeatureManager.removeFeature(personId); if (Constants.isIndoor) { GuestManager.removePersonId(personId); } } modelAdapter.setString(Sync.needSync, Constants.FALSE); if (Person.tableName.equals(table) && !Constants.deletePersonPhysical) { BaseManager.deleteWithDelFlag(modelAdapter); } else { BaseManager.deletePhysically(modelAdapter); } socketUtil.writeResponseSuccess(); } if (PersonSocket.signal.equals(requestType)) { ModelAdapter modelAdapter = socketUtil.readModelAdapterMap(requestMap); String signalValue = modelAdapter.getString(PersonSocket.signalValue); if (PersonSocket.signalInitTreeNodeList.equals(signalValue)) { OrgManager.initTreeNodeList(); } modelAdapter.setString(Sync.needSync, Constants.FALSE); socketUtil.writeResponseSuccess(); } if (PersonSocket.findPersonById.equals(requestType)) { String personId = requestMap.get(Person.id); ModelAdapter person = PersonManager.findPersonById(personId); byte[] personByteArray = new byte[]{}; if (person != null) { byte[] camera_image_path = person.getBlob(Person.camera_image_path); if (camera_image_path != null && camera_image_path.length > 0) { person.model.put(PersonSocket.camera_image_path_byte_array, camera_image_path); } personByteArray = ObjectUtil.toByteArray(person.model);//SerializationUtils.serialize(person); Map newPerson = (Map) ObjectUtil.toObject(personByteArray);//SerializationUtils.deserialize(personByteArray); // System1.out.println("PersonAcceptedClient.run findPersonById=" + newPerson); } Map responseMap = new HashMap<>(); responseMap.put(PersonSocket.modelMapByteArrayLength, personByteArray.length + ""); socketUtil.writeMap(responseMap); if (personByteArray.length > 0) { socketUtil.writeByteArray(personByteArray); } } SystemClock.sleep(4 * 1000); } catch (Exception e) { e.printStackTrace(); } finally { socketUtil.close(); } } } }