sceneGrpcServer.java 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553
  1. package com.fdkk.fdkkmeta.grpcService;
  2. import cn.hutool.core.util.ArrayUtil;
  3. import com.alibaba.fastjson.JSON;
  4. import com.alibaba.fastjson.JSONArray;
  5. import com.alibaba.fastjson.JSONObject;
  6. import com.fdkk.fdkkmeta.config.MetaConfig;
  7. import com.fdkk.fdkkmeta.domain.dto.RouteDto;
  8. import com.fdkk.fdkkmeta.domain.entity.mysql.BreakpointsEntity;
  9. import com.fdkk.fdkkmeta.domain.entity.mysql.MoveFrameEntity;
  10. import com.fdkk.fdkkmeta.domain.entity.mysql.RotateFrameEntity;
  11. import com.fdkk.fdkkmeta.domain.entity.mysql.UserEntity;
  12. import com.fdkk.fdkkmeta.domain.po.*;
  13. import com.fdkk.fdkkmeta.grpc.*;
  14. import com.fdkk.fdkkmeta.redis.RedisCache;
  15. import com.fdkk.fdkkmeta.service.BreakpointsService;
  16. import com.fdkk.fdkkmeta.service.MoveFrameService;
  17. import com.fdkk.fdkkmeta.service.RotateFrameService;
  18. import com.fdkk.fdkkmeta.service.UserService;
  19. import com.fdkk.fdkkmeta.util.ProtoJsonUtils;
  20. import com.fdkk.fdkkmeta.util.kesar.GetRoute;
  21. import io.grpc.stub.StreamObserver;
  22. import lombok.extern.slf4j.Slf4j;
  23. import net.devh.boot.grpc.server.service.GrpcService;
  24. import org.springframework.beans.factory.annotation.Autowired;
  25. import java.io.File;
  26. import java.util.Arrays;
  27. import java.util.List;
  28. /**
  29. * @author Xiewj
  30. * @date 2022/5/9
  31. */
  32. @GrpcService
  33. @Slf4j
  34. public class sceneGrpcServer extends SceneGrpcServiceGrpc.SceneGrpcServiceImplBase {
  35. @Autowired
  36. MetaConfig metaConfig;
  37. @Autowired
  38. UserService userService;
  39. @Autowired
  40. BreakpointsService breakpointsService;
  41. @Autowired
  42. RotateFrameService rotateFrameService;
  43. @Autowired
  44. MoveFrameService moveFrameService;
  45. @Autowired
  46. RedisCache redisCache;
  47. @Autowired
  48. SceneGrpcService sceneGrpcService;
  49. /***
  50. * 回复 案例
  51. * SceneReply res = SceneReply.newBuilder().setRes(id+","+name).build();
  52. * responseObserver.onNext(res);
  53. */
  54. /*
  55. @Override
  56. public void testMethod(SceneRequest request, StreamObserver<SceneReply> responseObserver) {
  57. // grpc服务端获取调用端请求参数
  58. String id = request.getId();
  59. String name = request.getName();
  60. // 这里可以有自己的业务代码,只需要按照porto中的返回类型返回参数即可
  61. SceneReply res = SceneReply.newBuilder().setRes(id+","+name).build();
  62. responseObserver.onNext(res);
  63. responseObserver.onCompleted();
  64. log.info("回复{}",res);
  65. }
  66. */
  67. @Override
  68. public void getRoute(RouteRequest request, StreamObserver<RouteReply> responseObserver) {
  69. // grpc服务端获取调用端请求参数
  70. String sceneCode = request.getSceneCode();
  71. Point sLocation = request.getSLocation();
  72. Point eLocation = request.getELocation();
  73. RouteDto po=new RouteDto();
  74. PointPO s=new PointPO();
  75. s.setX(Double.parseDouble(sLocation.getX()));
  76. s.setY(Double.parseDouble(sLocation.getY()));
  77. s.setZ(Double.parseDouble(sLocation.getY()));
  78. PointPO e=new PointPO();
  79. e.setX(Double.parseDouble(eLocation.getX()));
  80. e.setY(Double.parseDouble(eLocation.getY()));
  81. e.setZ(Double.parseDouble(eLocation.getY()));
  82. po.setE_location(e);
  83. po.setS_location(s);
  84. po.setSceneCode(sceneCode);
  85. JSONArray maps = GetRoute.getRoute(metaConfig.getFreespacePath()+ File.separator +"target_freespace.json", po);
  86. // 这里可以有自己的业务代码,只需要按照porto中的返回类型返回参数即可
  87. RouteReply.Builder builder = RouteReply.newBuilder();
  88. if (ArrayUtil.isNotEmpty(maps)) {
  89. for (int i = 0; i < maps.size(); i++) {
  90. RouteArray.Builder addInBuilder = builder.addInBuilder();
  91. ProtoJsonUtils.toProtoBean(addInBuilder, maps.get(i).toString());
  92. }
  93. }
  94. responseObserver.onNext(builder.build());
  95. responseObserver.onCompleted();
  96. }
  97. @Override
  98. public void init(InitRequest request, StreamObserver<NormalReply> responseObserver) {
  99. try {
  100. String user_id = request.getUserId();
  101. String nick_name = request.getNickName();
  102. String skin_id = request.getSkinId();
  103. String avatar_id = request.getAvatarId();
  104. String room_id = request.getRoomId();
  105. String app_id = request.getAppId();
  106. Space player =request.getPlayer();
  107. //保存user
  108. UserEntity userEntity=new UserEntity();
  109. userEntity.setAppId(app_id);
  110. userEntity.setUserId(user_id);
  111. userEntity.setAvatarId(avatar_id);
  112. userEntity.setNickName(nick_name);
  113. userEntity.setRoomId(room_id);
  114. userEntity.setSkinId(skin_id);
  115. userEntity.setFrameId(1L);
  116. userEntity.setBreakPointId(1L);
  117. userEntity.setOnline(true);
  118. Point playerPoint = player.getPosition();
  119. AngleUe4 playerAngle = player.getAngle();
  120. //初始化的时候可以写死
  121. AnglePO player_angle = new AnglePO();
  122. player_angle.setPitch(playerAngle.getPitch());
  123. player_angle.setYaw(playerAngle.getYaw());
  124. player_angle.setRoll(playerAngle.getRoll());
  125. userEntity.setPlayerAngle(player_angle);
  126. PointPO player_position = new PointPO();
  127. player_position.setX(Double.parseDouble(playerPoint.getX()));
  128. player_position.setY(Double.parseDouble(playerPoint.getY()));
  129. player_position.setZ(Double.parseDouble(playerPoint.getZ()));
  130. userEntity.setPlayerPosition(player_position);
  131. //数据库user表中创建用户记录
  132. userService.save(userEntity);
  133. JSONObject myState = new JSONObject();
  134. myState.put("isMoving",0);
  135. //redis中写入用户状态信息
  136. redisCache.setCacheObject("UserState:"+userEntity.getUserId(),myState);
  137. //返回
  138. NormalReply.Builder builder = NormalReply.newBuilder();
  139. builder.setCode(1);
  140. responseObserver.onNext(builder.build());
  141. responseObserver.onCompleted();
  142. }
  143. catch(Exception e) {
  144. e.printStackTrace();
  145. //builder.setCode(0);
  146. }
  147. }
  148. @Override
  149. public void rotate(RotateRequest request, StreamObserver<NormalReply> responseObserver) {
  150. try {
  151. ActionPO rotateRequestPO = new ActionPO();
  152. int action_type = request.getActionType();
  153. String trace_id = request.getTraceId();
  154. String user_id = request.getUserId();
  155. RotationAction rotationAction = request.getRotationAction();
  156. UserEntity user = userService.findUserId(user_id);
  157. RotateFrameEntity rotateFrameEntity = rotateFrameService.findById(user.getFrameId());
  158. rotateRequestPO.setAction_type(action_type);
  159. rotateRequestPO.setTrace_id(trace_id);
  160. rotateRequestPO.setUser_id(user_id);
  161. double hAngle = rotationAction.getHorizontalMove() * 90;
  162. int offFrameIndex = (int)Math.ceil(hAngle);
  163. int currentFrame = rotateFrameEntity.getFrameIndex(); //从数据库里读取
  164. currentFrame +=offFrameIndex;
  165. if(currentFrame<0){
  166. currentFrame+=360;
  167. }
  168. else{
  169. currentFrame = currentFrame % 359;
  170. }
  171. rotateFrameEntity = rotateFrameService.findByAppIdAndBreakPointIdAndFrameIndex(user_id,user.getBreakPointId(),currentFrame);
  172. rotateRequestPO.setFrameId(rotateFrameEntity.getId());
  173. //每次存一帧
  174. redisCache.setCacheList("setCacheRequest:"+user_id, Arrays.asList(rotateRequestPO));
  175. //没有更新user表中的frame_id,因为这样太慢了,后续再处理
  176. NormalReply.Builder builder = NormalReply.newBuilder();
  177. builder.setCode(1);
  178. responseObserver.onNext(builder.build());
  179. responseObserver.onCompleted();
  180. }
  181. catch(Exception e) {
  182. e.printStackTrace();
  183. //builder.setCode(0);
  184. }
  185. }
  186. @Override
  187. public void echo(EchoRequest request, StreamObserver<EchoReply> responseObserver){
  188. try{
  189. int action_type = request.getActionType();
  190. String trace_id = request.getTraceId();
  191. EchoReply.Builder builder = EchoReply.newBuilder();
  192. builder.setActionType(action_type);
  193. builder.setPointType(100);
  194. builder.setExtra("");
  195. builder.setTraceId(trace_id);
  196. builder.setPacketId("");
  197. //builder.setNps(nps);
  198. builder.setPeopleNum(0);
  199. builder.setZoneId("");
  200. builder.setEchoMsg("");
  201. builder.setReserveDetail(null);
  202. //builder.setUserWithAvatarList();
  203. //builder.setNewUserStates();
  204. builder.setCode(0);
  205. builder.setMsg("");
  206. responseObserver.onNext(builder.build());
  207. responseObserver.onCompleted();
  208. }
  209. catch(Exception e) {
  210. e.printStackTrace();
  211. }
  212. }
  213. @Override
  214. public void usersState(GetNewUserStateRequest request, StreamObserver<GetNewUserStateReply> responseObserver){
  215. try{
  216. int action_type = request.getActionType();
  217. String trace_id = request.getTraceId();
  218. String user_id = request.getUserId();
  219. //从数据库中取全部在线的user表
  220. List<UserEntity> list = userService.findUserOnline(true);
  221. GetNewUserStateReply.Builder builder = GetNewUserStateReply.newBuilder();
  222. builder.setActionType(action_type);
  223. builder.setPointType(100);
  224. builder.setExtra("");
  225. builder.setTraceId(trace_id);
  226. builder.setPacketId("");
  227. //builder.setNps(nps);
  228. builder.setPeopleNum(0);
  229. builder.setZoneId("");
  230. builder.setEchoMsg("");
  231. builder.setReserveDetail(null);
  232. //builder.setUserWithAvatarList();
  233. if(list.size()>0){
  234. for(int i=0;i<list.size();++i){
  235. UserEntity user = list.get(i);
  236. JSONObject userInfo = new JSONObject();
  237. userInfo.put("roomTypeId","");
  238. userInfo.put("person",0);
  239. userInfo.put("avatarId",user.getAvatarId());
  240. userInfo.put("skinId",user.getSkinId());
  241. userInfo.put("roomId",user.getRoomId());
  242. userInfo.put("isHost",false);
  243. userInfo.put("isFollowHost",false);
  244. userInfo.put("skinDataVersion",user.getSkinDataVersion());
  245. userInfo.put("avatarComponents","");
  246. userInfo.put("nickName",user.getNickName());
  247. userInfo.put("movingMode",0); //后续会修改
  248. userInfo.put("attitude","walk");
  249. userInfo.put("areaName","");
  250. userInfo.put("pathName","");
  251. userInfo.put("pathId","thirdwalk");
  252. userInfo.put("avatarSize",1);
  253. Extra extra = Extra.newBuilder().setRemoveWhenDisconnected(true).build();
  254. userInfo.put("extra",extra);
  255. userInfo.put("prioritySync",false);
  256. Space.Builder player = Space.newBuilder();
  257. PointPO playerPosition = user.getPlayerPosition();
  258. Point playerPt = Point.newBuilder().setX(String.valueOf(playerPosition.getX())).setY(String.valueOf(playerPosition.getY())).setZ(String.valueOf(playerPosition.getZ())).build();
  259. player.setPosition(playerPt);
  260. AnglePO playerAngle = user.getPlayerAngle();
  261. AngleUe4 playerAg =AngleUe4.newBuilder().setPitch(playerAngle.getPitch()).setYaw(playerAngle.getYaw()).setRoll(playerAngle.getRoll()).build();
  262. player.setAngle(playerAg);
  263. userInfo.put("player",player);
  264. userInfo.put("camera",null);
  265. userInfo.put("cameraCenter",null);
  266. State playerState = sceneGrpcService.createPlayerState(userInfo);
  267. RenderInfo renderInfo = sceneGrpcService.createRenderInfo();
  268. Event event = sceneGrpcService.createEvent();
  269. UserState userState = sceneGrpcService.createUserState( user.getUserId(), playerState, renderInfo, event);
  270. builder.addNewUserStates(userState);
  271. }
  272. }
  273. //builder.setNewUserStates();
  274. builder.setCode(0);
  275. builder.setMsg("");
  276. responseObserver.onNext(builder.build());
  277. responseObserver.onCompleted();
  278. }
  279. catch (Exception e){
  280. e.printStackTrace();
  281. }
  282. }
  283. @Override
  284. public void move(MoveRequest request, StreamObserver<NormalReply> responseObserver){
  285. try{
  286. //int action_type= request.getActionType();
  287. ClickingAction clicking_action = request.getClickingAction();
  288. //State clicking_state = request.getClickingState();
  289. String trace_id = request.getTraceId();
  290. String user_id = request.getUserId();
  291. UserEntity user = userService.findUserId(user_id);
  292. String appId = user.getAppId();
  293. Long breakPointId = user.getBreakPointId();
  294. BreakpointsEntity currentBreakpointsEntity = breakpointsService.getById(breakPointId);
  295. Point end = clicking_action.getClickingPoint();
  296. RotateFrameEntity rotateFrameEntity = rotateFrameService.findById(user.getFrameId());
  297. //计算路径
  298. RouteDto po=new RouteDto();
  299. PointPO s= user.getPlayerPosition();
  300. PointPO e=new PointPO();
  301. e.setX(Double.parseDouble(end.getX()));
  302. e.setY(Double.parseDouble(end.getY()));
  303. e.setZ(Double.parseDouble(end.getZ()));
  304. po.setE_location(e);
  305. po.setS_location(s);
  306. po.setSceneCode(appId);
  307. JSONArray path = new JSONArray();
  308. JSONArray maps = GetRoute.getRoute(metaConfig.getFreespacePath()+ File.separator +appId+"_target_freespace.json", po);
  309. ActionPO movePO = new ActionPO();
  310. if (maps!=null&&maps.size()>=2){
  311. for(int i=0;i< maps.size();++i){
  312. Long _breakPointId = JSON.parseObject(JSONObject.toJSON(maps.get(i)).toString()).getLong("id");
  313. path.add(_breakPointId);
  314. //旋转矫正
  315. if(i == 1){
  316. AnglePO cameraAnglePO = rotateFrameEntity.getCameraAngle();
  317. //旋转矫正:不仅存入redis,而且返回矫正后的角度
  318. cameraAnglePO = setRotateForMove( user, trace_id, cameraAnglePO);
  319. movePO.setCameraAngle(cameraAnglePO);
  320. }
  321. }
  322. movePO.setAction_type(1);
  323. movePO.setTrace_id(trace_id);
  324. movePO.setUser_id(user_id);
  325. movePO.setPath(path);
  326. Long lastBreakPointId = JSON.parseObject(JSONObject.toJSON(maps.get(maps.size() -1)).toString()).getLong("id");
  327. BreakpointsEntity breakpointsEntity = breakpointsService.findByAppIdAndBreakPointId(appId,lastBreakPointId);
  328. int playerAngleYaw = sceneGrpcService.calAngleForBreakPointId(currentBreakpointsEntity,breakpointsEntity);
  329. AnglePO playerAngle = user.getPlayerAngle();
  330. playerAngle.setYaw(playerAngleYaw);
  331. movePO.setPlayerAngle(playerAngle);
  332. int subFrameIndex = moveFrameService.getCountByAppIAndStartBreakPointIdAndEndBreakPointIdAndAngle( user.getAppId(),path.getLongValue(0),path.getLongValue(1), movePO.getCameraAngle().getYaw()%45);
  333. movePO.setSubFrameIndex(subFrameIndex);
  334. redisCache.setCacheList("setCacheRequest:"+user_id, Arrays.asList(movePO));
  335. }
  336. NormalReply.Builder builder = NormalReply.newBuilder();
  337. builder.setCode(1);
  338. responseObserver.onNext(builder.build());
  339. responseObserver.onCompleted();
  340. }
  341. catch (Exception e){
  342. e.printStackTrace();
  343. //builder.setCode(0);
  344. }
  345. }
  346. private AnglePO setRotateForMove(UserEntity user,String trace_id,AnglePO cameraAngle){
  347. int angle = cameraAngle.getYaw();
  348. int offAngle = 0;
  349. offAngle = angle%45;
  350. //先简单来,就累加。后续要再调试
  351. //存储矫正的一组帧
  352. offAngle = Math.abs(45 - offAngle);
  353. RotateFrameEntity _rotateFrameEntity = null;
  354. for(int j=0;j<offAngle;++j){
  355. ActionPO rotateRequestPO = new ActionPO();
  356. rotateRequestPO.setAction_type(1014);
  357. rotateRequestPO.setTrace_id(trace_id);
  358. rotateRequestPO.setUser_id(user.getUserId());
  359. _rotateFrameEntity = rotateFrameService.findByAppIdAndBreakPointIdAndFrameIndex(user.getAppId(),user.getBreakPointId(),angle+j);
  360. rotateRequestPO.setFrameId(_rotateFrameEntity.getId());
  361. redisCache.setCacheList("setCacheRequest:"+user.getUserId(), Arrays.asList(rotateRequestPO));
  362. }
  363. if(_rotateFrameEntity == null){
  364. AnglePO cameraAnglePO = new AnglePO();
  365. cameraAnglePO.setPitch(0);
  366. cameraAnglePO.setYaw(angle);
  367. cameraAnglePO.setRoll(0);
  368. return cameraAnglePO;
  369. }
  370. else{
  371. return _rotateFrameEntity.getCameraAngle();
  372. }
  373. }
  374. @Override
  375. public void getBreakPoint(BreakPointRequest request, StreamObserver<BreakPointReply> responseObserver) {
  376. try {
  377. log.info("进入{}",request);
  378. int action_type = request.getActionType();
  379. NeighborPointsAction get_neighbor_points_action = request.getGetNeighborPointsAction();
  380. String trace_id = request.getTraceId();
  381. String user_id = request.getUserId();
  382. //从表breakpoints里获取所有的呼吸点,并且是数组
  383. //TODO 根据查询所有
  384. UserEntity userEntity = userService.findUserId(user_id);
  385. List<BreakpointsEntity> allList = breakpointsService.findByAppId(userEntity.getAppId());
  386. Point[] nps=null;
  387. BreakPointReply res = BreakPointReply.newBuilder()
  388. .setActionType(action_type)
  389. .setPointType(100)
  390. .setExtra("")
  391. .setTraceId(trace_id)
  392. .setPacketId("")
  393. //.setNps(nps)
  394. .setPeopleNum(0)
  395. .setZoneId("")
  396. .setEchoMsg("")
  397. .setReserveDetail(null)
  398. //.setUserWithAvatarList()
  399. //.setNewUserStates()
  400. .setCode(0)
  401. .setMsg("")
  402. .build();
  403. responseObserver.onNext(res);
  404. responseObserver.onCompleted();
  405. log.info("回复{}",res);
  406. }
  407. catch(Exception e) {
  408. e.printStackTrace();
  409. }
  410. }
  411. //操作杆
  412. @Override
  413. public void joystick(JoystickRequest request, StreamObserver<NormalReply> responseObserver) {
  414. try {
  415. log.info("进入{}",request);
  416. int actionType = request.getActionType();
  417. DirAction dirAction = request.getDirAction();
  418. String trace_id = request.getTraceId();
  419. String user_id = request.getUserId();
  420. String packet_id = request.getPacketId();
  421. ActionPO joystickPO = new ActionPO();
  422. joystickPO.setAction_type(actionType);
  423. joystickPO.setTrace_id(trace_id);
  424. joystickPO.setUser_id(user_id);
  425. joystickPO.setPacket_id(packet_id);
  426. AnglePO playerAngle = joystickPO.getPlayerAngle();
  427. playerAngle.setYaw(dirAction.getMoveAngle());
  428. joystickPO.setPlayerAngle(playerAngle);
  429. redisCache.setCacheList("setCacheRequest:"+user_id, Arrays.asList(joystickPO));
  430. //速度不够,只是让人旋转
  431. if(dirAction.getSpeedLevel()<7){
  432. return;
  433. }
  434. UserEntity user = userService.findUserId(user_id);
  435. //邻居点里找角度最合适的点
  436. BreakpointsEntity breakpointsEntity = breakpointsService.findByAppIdAndBreakPointId(user.getAppId(), user.getBreakPointId());
  437. BreakpointsEntity targetBreakpointsEntity = null;
  438. List<Integer> neighBreakPointIds = breakpointsEntity.getContact();
  439. double offAngle = 1000;
  440. double moveAngle = dirAction.getMoveAngle();
  441. int playerAngleYaw = 0;
  442. if(neighBreakPointIds.size()>0){
  443. for(int j=0;j<neighBreakPointIds.size();++j){
  444. BreakpointsEntity _breakpointsEntity = breakpointsService.findByAppIdAndBreakPointId(user.getAppId(), (long)neighBreakPointIds.get(j));
  445. playerAngleYaw = sceneGrpcService.calAngleForBreakPointId(breakpointsEntity,_breakpointsEntity);
  446. if(Math.abs(playerAngleYaw - moveAngle)<offAngle){
  447. offAngle = Math.abs(playerAngleYaw - moveAngle);
  448. targetBreakpointsEntity = _breakpointsEntity;
  449. }
  450. }
  451. RotateFrameEntity rotateFrameEntity = rotateFrameService.findById(user.getFrameId());
  452. AnglePO cameraAnglePO = rotateFrameEntity.getCameraAngle();
  453. cameraAnglePO = setRotateForMove( user, trace_id,cameraAnglePO);
  454. JSONArray path = new JSONArray();
  455. path.add(user.getBreakPointId());
  456. path.add(targetBreakpointsEntity.getBreakPointId());
  457. ActionPO movePO = new ActionPO();
  458. movePO.setAction_type(1);
  459. movePO.setTrace_id(trace_id);
  460. movePO.setUser_id(user_id);
  461. movePO.setPath(path);
  462. playerAngle.setYaw(playerAngleYaw);
  463. movePO.setPlayerAngle(playerAngle);
  464. movePO.setCameraAngle(cameraAnglePO);
  465. int subFrameIndex = moveFrameService.getCountByAppIAndStartBreakPointIdAndEndBreakPointIdAndAngle( user.getAppId(),user.getBreakPointId(),targetBreakpointsEntity.getBreakPointId(), cameraAnglePO.getYaw()%45);
  466. movePO.setSubFrameIndex(subFrameIndex);
  467. redisCache.setCacheList("setCacheRequest:"+user_id, Arrays.asList(movePO));
  468. }
  469. //找到与角度move_angle最近的邻居点
  470. //移动player,并且更新相机角度
  471. NormalReply.Builder builder = NormalReply.newBuilder();
  472. builder.setCode(1);
  473. responseObserver.onNext(builder.build());
  474. responseObserver.onCompleted();
  475. }
  476. catch(Exception e) {
  477. e.printStackTrace();
  478. }
  479. }
  480. @Override
  481. public void exit(ExitRequest request, StreamObserver<NormalReply> responseObserver){
  482. try{
  483. //删除redis:"setCacheRequest:"+user_id
  484. //删除redis:"UserState:"+user.getUserId()
  485. //删除redis:"updateFrameMetadata:"+user.getUserId()
  486. //删除user表的记录
  487. NormalReply.Builder builder = NormalReply.newBuilder();
  488. builder.setCode(1);
  489. responseObserver.onNext(builder.build());
  490. responseObserver.onCompleted();
  491. }
  492. catch(Exception e){
  493. }
  494. }
  495. }