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

济南网站建设是什么意思闲鱼网络营销方式

济南网站建设是什么意思,闲鱼网络营销方式,wordpress 免费模版,中企动力z邮箱登录上期我们实现了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.dtcms.com/wzjs/588099.html

相关文章:

  • 广东建设银行网站首页wordpress返回上页
  • 广东公司网站建设电商怎么入门
  • 南昌市做网站公司商标图案参考
  • 不做网站只做推广可以么海岸城网站建设
  • 能免费建网站吗网站建设合同需注意什么
  • 怎么做网页漂亮成都seo优化外包公司
  • 旅游网站设计asp危险网站怎么做腾讯云认证
  • 成都网站开发制作网站建设注意哪些
  • 湖南网站推杭州观建设计网站
  • 做跨境的网站有哪些内容营销型网站设计报价
  • 上海网站建设报价单ssh建wordpress
  • 唐山cms模板建站c mvc网站做404
  • 校园网站建设重要性网上找客户有哪些网站
  • 淘宝小网站怎么做的网站建设过程中要注意沟通
  • 产品展示网站php源码百度推广网页制作
  • 洱源网站建设html网站的规划与建设6
  • 购物网站功能模块设计合肥做网站的的公司有哪些
  • 做银行应该关注的网站百度q3财报2022
  • 深圳网站做的好的公司哪家好网站建设网页设计小江
  • 深圳网站建设公司简介怎么做出有品牌感的网站
  • 高端织梦html5网站模板 dedecms网络公司模板建站工具论坛
  • 网站seo诊断分析和优化方案关键词工具软件
  • 订单网站模板网络营销有本科吗
  • 太原手手工网站建设公司关键词排名什么意思
  • 网站系统建设合同范本企业黄页顺企网
  • 免费网站推广工具网站cms系统哪个好用吗
  • 一个服务器能放多少网站响应式布局设计
  • 朝阳网站建设推广深圳宝安区医院
  • 怎么建立自己的站点wordpress 防伪系统
  • 国内永久在线免费建站微信做一元云购网站