当前位置: 首页 > news >正文

做网站是不是要拍法人的照片科技公司网站模板下载

做网站是不是要拍法人的照片,科技公司网站模板下载,上海企业制作网站有哪些内容,百度网站建设推广上期我们实现了websocket后端的大部分代码&#xff0c;这期我们实现具体的匹配逻辑 1. 定义Mather类 我们新建一个Matcher类用来实现匹配逻辑 Component public class Matcher {//每个匹配队列代表不同的段位,这里约定每一千分为一个段位private ArrayList<Queue<User…

上期我们实现了websocket后端的大部分代码,这期我们实现具体的匹配逻辑

1. 定义Mather类

我们新建一个Matcher类用来实现匹配逻辑

@Component
public class Matcher {//每个匹配队列代表不同的段位,这里约定每一千分为一个段位private ArrayList<Queue<User>> matchQueueList = new ArrayList<>();@Autowiredprivate ObjectMapper objectMapper;@Autowiredprivate OnlineUserManager onlineUserManager;public Matcher() {//暂定三个段位for(int i = 0; i < 3; i++) {matchQueueList.add(new LinkedList<>());}}public void add(User user) {int index = Math.min(user.getScore() / 3, 2);Queue<User> queue = matchQueueList.get(index);//对操作的队列加锁保证线程安全synchronized (queue) {queue.offer(user);queue.notify();}System.out.println("用户 " + user.getUsername() + " 加入了 " + index + "号 队列");}public void remove(User user) {int index = Math.min(user.getScore() / 3, 2);Queue<User> queue = matchQueueList.get(index);synchronized (queue) {queue.remove(user);}System.out.println("把用户 " + user.getUsername() + " 从 " + index + "号 队列中删除");}
}

2.修改websocket后端代码

    //接收到请求后执行@Overrideprotected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {User user = (User) session.getAttributes().get("user");MatchRequest request = objectMapper.readValue(message.getPayload(), MatchRequest.class);MatchResponse response = new MatchResponse();if(request.getMessage().equals("startMatch")) {//开始匹配,把用户加入匹配队列matcher.add(user);response.setOk(true);response.setMessage("startMatch");}else if(request.getMessage().equals("stopMatch")) {//取消匹配,从匹配队列中移除用户matcher.remove(user);response.setOk(true);response.setMessage("stopMatch");}else{response.setOk(false);response.setErrMsg("非法请求");}//返回响应session.sendMessage(new TextMessage(objectMapper.writeValueAsString(response)));}

由于存在在匹配中途断开连接的情况,所有我们还要在断开连接代码中增加退出队列的代码进行:

    //连接异常时执行@Overridepublic void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {//连接异常断开,玩家下线try {User user = (User)session.getAttributes().get("user");//防止重复登录时删除正常登录的在线信息if(onlineUser.getFromHall(user.getId()).equals(session)) {onlineUser.exitGameHall(user.getId());System.out.println("用户:" + user.getUsername() + " 已下线");}//用户可能还在匹配队列中matcher.remove(user);}catch (NullPointerException e) {e.printStackTrace();MatchResponse response = new MatchResponse();response.setOk(false);response.setErrMsg("用户未登录");session.sendMessage(new TextMessage(objectMapper.writeValueAsString(response)));}}//连接正常断开后执行@Overridepublic void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {//连接正常断开,玩家下线try {User user = (User)session.getAttributes().get("user");//防止重复登录时删除正常登录的在线信息if(onlineUser.getFromHall(user.getId()).equals(session)) {onlineUser.exitGameHall(user.getId());System.out.println("用户:" + user.getUsername() + " 已下线");}//用户可能还在匹配队列中matcher.remove(user);}catch (NullPointerException e) {e.printStackTrace();MatchResponse response = new MatchResponse();response.setOk(false);response.setErrMsg("用户未登录");session.sendMessage(new TextMessage(objectMapper.writeValueAsString(response)));}}

3. 实现匹配功能

3.1 创建线程扫描队列

我们为每个匹配队列创建一个线程,用来实现匹配功能,我们在构造方法中创建线程:

    public Matcher() {//暂定三个段位for(int i = 0; i < 3; i++) {matchQueueList.add(new LinkedList<>());}//每个队列创建一个线程扫描完成匹配功能for(Queue<User> q : matchQueueList) {Thread t = new Thread(()->{while(true) {//调用handlerMatch()完成匹配功能handlerMatch(q);}});}}
3.2 实现handlerMatch()方法进行匹配
public void handlerMatch(Queue<User> matchQueue) {try {//对操作的队列加锁保证线程安全synchronized (matchQueue) {//1.检测队列中是否有两个元素while(matchQueue.size() < 2) {matchQueue.wait();}//2.从队列中取出两个玩家User user1 = matchQueue.poll();User user2 = matchQueue.poll();//3.获取到两个玩家的会话信息WebSocketSession session1 = onlineUserManager.getFromHall(user1.getId());WebSocketSession session2 = onlineUserManager.getFromHall(user2.getId());//4.todo 把两个玩家放到一个游戏房间中//5.给用户返回匹配成功的响应MatchResponse response = new MatchResponse();response.setOk(true);response.setMessage("success");String json = objectMapper.writeValueAsString(response);session1.sendMessage(new TextMessage(json));session2.sendMessage(new TextMessage(json));}}catch (IOException | InterruptedException e) {e.printStackTrace();}}

游戏房间功能我们下一期再实现。

http://www.yayakq.cn/news/788307/

相关文章:

  • 网站 友情链接怎么做企业做网站有发展么
  • 冉冉科技网站建设seo教程资源
  • 中国免费素材网seo优化软件哪个最好用
  • 网站开发技术方案doc弧光之源网站建设
  • 泉州网站制作房地产销售工资一般多少钱一个月
  • 什么网站可以做miR的差异表达图东莞想做网站找什么公司
  • 建一个平台网站一般需要多少钱电脑安装不上wordpress
  • 添加网站描述wordpress paypal
  • 自己建网站怎么做seowordpress商城对接支付接口
  • 个人网站命名 备案购买网站做友情链接
  • 建设网站需申请什么手续优秀设计作品赏析
  • 住房和城乡建设部网站一级建造师宁波网站建设服务公司电话
  • 教育类网站 前置审批电子商务网站设计毕业设计论文
  • 网站开通申请中型企业查询系统
  • 医保局网站建设中标公告石河子市住房和城乡建设局网站
  • 网站线下推广方式品物设计集团
  • 设计接单兼职网站设计建设网站哪家好
  • 网站推广营销收费设计装修的软件
  • 网站资料库建设的功能需求wordpress 建站 搜索
  • 销售网站制作怎么做建网站被封了
  • 怎么看一个网站是用什么代码做的信息查询
  • 做淘宝网站买个模版可以吗百度地图网页版入口
  • 网站创作html5模板之家
  • 网站设计模板免费下载网站创建域名
  • 建设部工程造价管理网站电商小程序开发平台
  • 建设公司网站的意义深圳市网站建设做网站
  • 如何做自己的广告网站wordpress正体中文版
  • 个人网站备案没有座机极强防红短链接生成
  • 创意建设机械网站网站排名优化机构
  • 广东网站建设模版网站空间150m