OkIOServer.java 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. package org.las2mile.okio;
  2. import org.las2mile.okio.message.BaseMsg;
  3. import org.las2mile.okio.message.req.HartBeatMsg;
  4. import org.las2mile.okio.message.req.LogFileMsgReq;
  5. import org.las2mile.okio.message.resp.HartBeatMsgResp;
  6. import org.las2mile.okio.server.LogZipFileProcedure;
  7. import org.las2mile.okio.message.req.LogFileLostMsg;
  8. import java.io.IOException;
  9. import java.net.ServerSocket;
  10. import java.net.Socket;
  11. import java.util.HashMap;
  12. import java.util.List;
  13. import java.util.Map;
  14. import java.util.concurrent.ExecutorService;
  15. import java.util.concurrent.Executors;
  16. import okio.Buffer;
  17. import okio.BufferedSink;
  18. import okio.BufferedSource;
  19. import okio.Okio;
  20. import org.las2mile.scrcpy.BuildConfig;
  21. public class OkIOServer extends Thread{
  22. private ExecutorService executor;
  23. private ServerSocket serverSocket;
  24. public OkIOServer(){
  25. this.executor = Executors.newCachedThreadPool();
  26. }
  27. @Override
  28. public void run() {
  29. super.run();
  30. try {
  31. serverSocket = new ServerSocket(4567);
  32. } catch (IOException e) {
  33. Ln.e("Socket error when open:" + e.getMessage());
  34. return;
  35. }
  36. Ln.i("Server Socket open success: " + serverSocket.getInetAddress());
  37. while (true) {
  38. final Socket socket;
  39. try {
  40. socket = serverSocket.accept();
  41. Ln.i("Client Socket accept success from: "/* + socket.getInetAddress()*/);
  42. final BufferedSource source = Okio.buffer(Okio.source(socket));
  43. final BufferedSink sink = Okio.buffer(Okio.sink(socket));
  44. process(socket, source, sink);
  45. } catch (IOException e) {
  46. Ln.e("Socket error in serverSocket accept(): " + e.getMessage());
  47. if (serverSocket.isClosed()) {
  48. break;
  49. }
  50. }
  51. }
  52. }
  53. private void process(Socket socket, BufferedSource source, BufferedSink sink) {
  54. Ln.e("Server handle socket ");
  55. executor.execute(new Runnable() {
  56. @Override
  57. public void run() {
  58. try {
  59. HartBeatMsgResp version = new HartBeatMsgResp();
  60. version.setRemoteInfo(BuildConfig.BUILD_TIME);//(BuildConfig.BUILD_TIME);
  61. sendMsg(version,sink);
  62. Map<Integer,LogZipFileProcedure> logZipFileProcedureMap = new HashMap<>();
  63. Buffer buffer = new Buffer();
  64. OkIoPacketDecode okIoPacketDecode = new OkIoPacketDecode("server ");
  65. for (long byteCount; (byteCount = source.read(buffer, 8192L)) != -1; ) {
  66. List<OkIoPacket> msgList = okIoPacketDecode.parsePacketC(buffer, (int) byteCount);
  67. if(msgList != null){
  68. for (OkIoPacket packet : msgList) {
  69. Ln.e("server process cmd "+packet.cmd);
  70. if(packet.cmd == BaseMsg.REQ_REQUEST_LOGFILE){
  71. LogFileMsgReq reqLogFileMsg = new LogFileMsgReq();
  72. reqLogFileMsg.decodeData(packet.mBaseMsgBuffer, (short) packet.mBaseMsgBuffer.size());
  73. //Ln.e("server process cmd "+reqLogFileMsg.toString());
  74. LogZipFileProcedure logZipFileProcedure = new LogZipFileProcedure(sink,reqLogFileMsg.procedureType);
  75. //logZipFileProcedure.taskId = reqLogFileMsg.taskId;
  76. logZipFileProcedure.createTask(reqLogFileMsg.taskId);
  77. logZipFileProcedureMap. put(logZipFileProcedure.taskId,logZipFileProcedure);
  78. logZipFileProcedure.uploadImageAllPartitions();
  79. } else if(packet.cmd == BaseMsg.REQ_HARTBEAT){
  80. HartBeatMsg hartBeatMsg = new HartBeatMsg();
  81. hartBeatMsg.decodeData(packet.mBaseMsgBuffer, (short) packet.mBaseMsgBuffer.size());
  82. Ln.e("server process heartbeat "+hartBeatMsg.toString());
  83. HartBeatMsgResp hartBeatMsgResp = new HartBeatMsgResp();
  84. sendMsg(hartBeatMsgResp,sink);
  85. } else if (packet.cmd == BaseMsg.REQ_REQUEST_LOGFILE_LOST){
  86. LogFileLostMsg logFileLostMsg = new LogFileLostMsg();
  87. logFileLostMsg.decodeData(packet.mBaseMsgBuffer, (short) packet.mBaseMsgBuffer.size());
  88. if(logFileLostMsg.lostNums > 0) {
  89. LogZipFileProcedure logZipFileProcedure = logZipFileProcedureMap.get(logFileLostMsg.taskId);
  90. logZipFileProcedure.uploadImageLeftPartitions(logFileLostMsg.lostNos);
  91. } else {
  92. logZipFileProcedureMap.remove(logFileLostMsg.taskId);
  93. }
  94. }
  95. }
  96. }
  97. // Ln.e("server process cmd "+packet.cmd);
  98. // if(packet.cmd == BaseMsg.REQ_HARTBEAT){
  99. // HartBeatMsg hartBeatMsg = new HartBeatMsg();
  100. // hartBeatMsg.decodeData(msgBody, (short) msgBody.size());
  101. // Ln.e("server process read "+hartBeatMsg.toString());
  102. //
  103. // HartBeatMsgResp hartBeatMsgResp = new HartBeatMsgResp();
  104. // sendMsg(hartBeatMsgResp,sink);
  105. // } else if(packet.cmd == BaseMsg.REQ_REQUEST_LOGFILE){
  106. // LogFileMsgReq reqLogFileMsg = new LogFileMsgReq();
  107. // reqLogFileMsg.decodeData(msgBody, (short) msgBody.size());
  108. // Ln.e("server process read "+reqLogFileMsg.toString());
  109. //
  110. // LogZipFileProcedure logZipFileProcedure = new LogZipFileProcedure(sink);
  111. // logZipFileProcedure.uploadImageAllPartitions();
  112. // }
  113. }
  114. } catch (Exception e){
  115. Ln.e("server process failure:"+e.getMessage());
  116. System.exit(0);
  117. }
  118. }
  119. });
  120. }
  121. private void sendMsg(BaseMsg baseMsg,BufferedSink sink) throws Exception {
  122. OkIoPacket respPkt = new OkIoPacket();
  123. byte dataResp[] = respPkt.assemblePacket(baseMsg);
  124. Ln.i(dataResp.length+" server send "/*+OkIoPacketDecode.toHexString(dataResp)*/);
  125. sink.write(dataResp);
  126. sink.flush();
  127. }
  128. }
  129. /*
  130. //解析请求
  131. String requestLine = source.readUtf8LineStrict();读取
  132. Buffer buffer = new Buffer();
  133. //buffer.writeAll(source);
  134. buffer.write(source, bodySize);将剩余的写入新的buffer,
  135. sink.writeUtf8(status.toString());
  136. sink.flush();
  137. response.getBody= Buffer buffer = new Buffer().writeUtf8(body);
  138. response.getBody().readAll(sink);
  139. sink.flush();//将剩余的发给客户端
  140. //断开连接
  141. try {
  142. source.close();
  143. sink.close();
  144. } catch (IOException e) {
  145. ZLog.e("error in socket and stream close: " + e.getMessage() + socket.isClosed());
  146. } catch (Throwable e) {
  147. ZLog.e(e.getMessage());
  148. } finally {
  149. try {
  150. socket.close();
  151. } catch (IOException e) {
  152. ZLog.e(e.getMessage());
  153. }
  154. }
  155. */