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

苏州网站建设有限公司做网站后期费用

苏州网站建设有限公司,做网站后期费用,wordpress怎样下载文件,公众号怎么发文章1. webSocket交互约定 上期我们完成了游戏房间的实体类以及前端界面,这期我们实现玩家对战功能,这里我们同样通过webSocket实现玩家和玩家之间的交互,连接建立成功时,约定服务器发送一些游戏的初始信息给客户端: {me…

1. webSocket交互约定

上期我们完成了游戏房间的实体类以及前端界面,这期我们实现玩家对战功能,这里我们同样通过webSocket实现玩家和玩家之间的交互,连接建立成功时,约定服务器发送一些游戏的初始信息给客户端:

{message: 'gameReady', //游戏消息类别,游戏就绪ok: true, errMsg: '',//错误信息roomId: '', //游戏房间iduserId1: 1, //当前客户端玩家userId2: 2, //对手玩家isBlack: true //当前玩家是否拿黑子(先手)
}

约定玩家落子的请求和响应:

落子请求:

{message: 'putChess', userId: ,row: , //落子坐标行col:  //落子坐标列
}

落子响应:

{message: 'putChess', userid: ,row: , //落子坐标行col:  //落子坐标列winnerId: //是否分出胜负,-1表示未分出胜负,否则表示获胜玩家id
}

2. 建立webSocket连接

2.1 客户端代码

我们在script.js文件中增加webSocket连接相关的代码


let webSocket = new WebSocket('ws://127.0.0.1:8080/game');
webSocket.onopen = function() {console.log("连接game成功");
}
webSocket.onclose = function() {console.log("连接关闭请重新登陆");location.href = "/login.html";
}
webSocket.onerror = function() {console.log("error");
}//页面关闭时释放webSocket
window.onbeforeunload = function() {webSocket.close();
}//处理服务器发送的消息
webSocket.onmessage = function(e) {//连接成功处理返回响应let resp = JSON.parse(e.data);if(resp.message != "gameReady" || !resp.ok) {alert("进入游戏房间失败: " + resp.errMsg);location.href = "/hall.html";return;}resp.roomId = e.roomId;resp.userId1 = e.userId1;resp.userId2 = e.userId2;resp.isBlack = e.isBlack;//初始化棋盘initGame();//提示先手玩家落子setScreenText(resp.isBlack);
}
2.2 服务器代码

 创建webSocket

package org.ting.j20250110_gobang.websocket;import org.springframework.stereotype.Component;
import org.springframework.web.socket.CloseStatus;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.TextWebSocketHandler;
@Component
public class GameWebSocket extends TextWebSocketHandler {@Overridepublic void afterConnectionEstablished(WebSocketSession session) throws Exception {}@Overrideprotected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {}@Overridepublic void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {}@Overridepublic void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {}
}

注册webSocket:

package org.ting.j20250110_gobang.config;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;
import org.springframework.web.socket.server.support.HttpSessionHandshakeInterceptor;
import org.ting.j20250110_gobang.websocket.GameWebSocket;
import org.ting.j20250110_gobang.websocket.MatchWebSocket;
@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {@AutowiredMatchWebSocket matchWebSocket;@AutowiredGameWebSocket gameWebSocket;@Overridepublic void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {registry.addHandler(matchWebSocket, "/findMatch") //注意路径和前端对应//添加拦截器获取到session,方便获取session中的用户信息.addInterceptors(new HttpSessionHandshakeInterceptor());registry.addHandler(gameWebSocket, "/game")//添加拦截器获取到session,方便获取session中的用户信息.addInterceptors(new HttpSessionHandshakeInterceptor());}
}

3. 创建数据交互实体类

package org.ting.j20250110_gobang.game;public class GameReadyResponse {private String message; //游戏消息类别,游戏就绪private boolean ok;private String errMsg;//错误信息private String roomId; //游戏房间idprivate int userId1; //当前客户端玩家的idprivate int userId2;//对手idprivate boolean isBlack; //当前玩家是否拿黑子(先手)public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}public boolean isOk() {return ok;}public void setOk(boolean ok) {this.ok = ok;}public String getErrMsg() {return errMsg;}public void setErrMsg(String errMsg) {this.errMsg = errMsg;}public String getRoomId() {return roomId;}public void setRoomId(String roomId) {this.roomId = roomId;}public Integer getUserId1() {return userId1;}public void setUserId1(Integer userId1) {this.userId1 = userId1;}public Integer getUserId2() {return userId2;}public void setUserId2(Integer userId2) {this.userId2 = userId2;}public boolean isBlack() {return isBlack;}public void setBlack(boolean black) {isBlack = black;}
}
package org.ting.j20250110_gobang.game;public class GameRequest {private int userId;public int getUserId() {return userId;}public void setUserId(int userId) {this.userId = userId;}public int getRow() {return row;}public void setRow(int row) {this.row = row;}public int getCol() {return col;}public void setCol(int col) {this.col = col;}private int row; //落子坐标行private int col;  //落子坐标列
}
package org.ting.j20250110_gobang.game;public class GameResponse {private String message;private int userid;public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}public int getUserid() {return userid;}public void setUserid(int userid) {this.userid = userid;}public int getRow() {return row;}public void setRow(int row) {this.row = row;}public int getCol() {return col;}public void setCol(int col) {this.col = col;}public int getWinnerId() {return winnerId;}public void setWinnerId(int winnerId) {this.winnerId = winnerId;}private int row; //落子坐标行private int col;  //落子坐标列private int winnerId; //是否分出胜负,-1表示未分出胜负,否则表示获胜玩家id}

4. 维护用户在线状态

前面我们在OnlineUserManager中使用了一个哈希表来维护用户的在线状态,但是当用户匹配成功后会进入游戏房间页面,从游戏大厅页面进入游戏房间页面,这个操作会使得我们在游戏大厅页面的webSocket连接断开,连接断开时,根据我们之前的代码来看,是会把玩家从哈希表中移除的,也就是把玩家下线,那么这个时候如果有人使用这个账号是可以在另一个地方登录成功的,就会造成两个账号同时在线的情况,为了避免这种情况我们在OnlineUserManager中再添加另一个哈希表用来维护在游戏房间中的用户:

package org.ting.j20250110_gobang.game;import org.springframework.stereotype.Component;
import org.springframework.web.socket.WebSocketSession;import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;@Component
public class OnlineUserManager {//使用ConcurrentHashMap保证线程安全//维护大厅中在线用户private Map<Integer, WebSocketSession> onlineUser = new ConcurrentHashMap<>();//维护游戏房间中的用户private Map<Integer, WebSocketSession> inRoomUser = new ConcurrentHashMap<>();public void enterGameRoom(int userId, WebSocketSession session) {//用户进入游戏房间inRoomUser.put(userId, session);}public void exitGameRoom(int userId) {//用户退出游戏房间inRoomUser.remove(userId);}public WebSocketSession getFromRoom(int userId) {//获取用户的websocket会话return inRoomUser.get(userId);}public void enterGameHall(int userId, WebSocketSession session) {//用户上线onlineUser.put(userId, session);}public void exitGameHall(int userId) {//用户下线onlineUser.remove(userId);}public WebSocketSession getFromHall(int userId) {//获取用户的websocket会话return onlineUser.get(userId);}
}

注意要更改之前玩家上线时代码的判断逻辑,还需要检测用户是否在游戏房间中:


文章转载自:

http://qmdf56uO.rxxdk.cn
http://Vd7iS00c.rxxdk.cn
http://4V0CYXfn.rxxdk.cn
http://XOlDtyY0.rxxdk.cn
http://Yo7pOtx8.rxxdk.cn
http://7asM9L6F.rxxdk.cn
http://owLdd9ao.rxxdk.cn
http://rwVa5kAN.rxxdk.cn
http://gXLRD0p8.rxxdk.cn
http://Otpp1V0D.rxxdk.cn
http://GS3TWdc1.rxxdk.cn
http://cTAsv05L.rxxdk.cn
http://2uPymGCu.rxxdk.cn
http://1kJ6KdPQ.rxxdk.cn
http://om8FXSiV.rxxdk.cn
http://3WOd4wnY.rxxdk.cn
http://Af0SAJvj.rxxdk.cn
http://bPUmJTJ1.rxxdk.cn
http://eh6wk7gu.rxxdk.cn
http://BfdFeJur.rxxdk.cn
http://wMadVLVd.rxxdk.cn
http://MYWUK67V.rxxdk.cn
http://6DU4T30z.rxxdk.cn
http://PENKAXNz.rxxdk.cn
http://Xxhxsz6T.rxxdk.cn
http://ZFWi1BOi.rxxdk.cn
http://JuhUsClZ.rxxdk.cn
http://0JrqXRuW.rxxdk.cn
http://dvBze3yW.rxxdk.cn
http://ObXDCWB1.rxxdk.cn
http://www.dtcms.com/wzjs/713345.html

相关文章:

  • 做网站用php还是python福泉市建设局网站
  • 做网站收费 知乎犀牛云建设网站
  • 浏览器的网站通知怎么做小型装修公司店面装修
  • 建设手机版网站需要主机多少空间wordpress更换网站数据库
  • 购物商城网站建设方案长沙有什么好玩的游乐场
  • 网站建设栏目管理企业网站设计要点
  • visual studio网站开发教程网站制作公司哪里好
  • 分享设计的网站wordpress历史记录
  • 好看的企业网站模板重庆公司注销流程
  • seo是做网站源码还是什么专门做生鲜的网站
  • 浙江省住房建设局网站拼多多网站首页
  • 有电脑网站怎么做手机网站网址大全2345电脑版下载
  • 无锡做网站公司有哪些电话建设银行有没有全球门户网站
  • 网站图片设计怎样才能高大上生物公司网站建设
  • 宁波建设网站多少钱wordpress和django哪个好
  • 个人兼职网站建设微信网站搭建公司
  • 做蛋糕网站有哪些wordpress 源码 解读
  • 做网站需要准备的素材wordpress主题ux
  • 手机网站建设商场如何学做网站优化
  • 网站建设尽量wordpress 360cdn
  • 登别的网站应怎么做淄博微网站
  • 网站开发语言排行榜网站外链建设需要考核
  • 微网站建设报价表具有营销型网站有哪些
  • 邯郸兄弟建站wordpress 自定义feed
  • 电子产品网页设计模板如何优化网站推广
  • 网站建设策划模板怎么注册logo商标
  • 汉子由来 外国人做的网站软件如何开发
  • 温州网站建设推广服务网页论坛怎么实现
  • 张店网站建个人网站建设流程 域名注册的选择
  • 自助建站帮助网普通网站建设多少钱