使用SuperSocket开发联网斗地主(一):联网
本章开始尝试着开发一个联网斗地主,感受一下webscoket的有趣。
一、 新建一个winform程序,添加如下引用
界面编辑如下:
然后创建webscoket监听代码:
webSocketServer = new WebSocketServer(); var isSetup = webSocketServer.Setup("192.168.1.6", 2018); bar_Info.Text="服务器端启动" + (isSetup ? "成功" : "失败"); if (!isSetup) return; webSocketServer.NewSessionConnected += WebSocketServer_NewSessionConnected; webSocketServer.SessionClosed += WebSocketServer_SessionClosed; webSocketServer.NewMessageReceived += WebSocketServer_NewMessageReceived; var isStart = webSocketServer.Start(); bar_IpInfo.Text="服务器端侦听" + (isStart ? "成功" : "失败");
分别实现这三个事件:
1 2 3 4 5 6 7 8 9 | /// <summary> /// 接收消息 /// </summary> /// <param name="session"></param> /// <param name="value"></param> private void WebSocketServer_NewMessageReceived(WebSocketSession session, string value) { txtMessage.Text+= "接收消息 \r\n" + value; } |
/// <summary> /// 下线 /// </summary> /// <param name="session"></param> /// <param name="value"></param> private void WebSocketServer_SessionClosed(WebSocketSession session, SuperSocket.SocketBase.CloseReason value) { string message = string.Format("Session Close:{0}, IP:{1}\r\n", value.ToString(), session.RemoteEndPoint); txtMessage.Text += message; }
/// <summary> /// 上线 /// </summary> /// <param name="session"></param> private void WebSocketServer_NewSessionConnected(WebSocketSession session) { string message = string.Format("Session:{0}, IP:{1}\r\n", session.SessionID.ToString(), session.RemoteEndPoint); txtMessage.Text += message; }
/// <summary> /// 给客户端发送消息 /// </summary> /// <param name="session"></param> /// <param name="message"></param> public void SendMessage(WebSocketSession session, string message) { //Task.Factory.StartNew(() => { if (session != null && session.Connected) session.Send(message); }); if (session != null && session.Connected) session.Send(message); }
重点在接收客户端数据这里,根据客户端发来的请求做出不同的响应:
如客户端发来“ready”服务端就知道这个客户端已经准备好了,逻辑如下:
//解密,校验数据 var data = JsonConvert.DeserializeObject<RequestModel>(value); switch (data.Action) { case "ready": //处理客户端准备好的情况 break; case "heart": //处理心跳 break; default: break; }
我们以斗地主为例,准备好的人数够三个就开始游戏:
if (DouDiZhuGameConfig.UserList.Count() < 3) { DouDiZhuGameConfig.UserList.Add(userSessionId,addUser); } return DouDiZhuGameConfig.UserList.Count() == 3 ? true : false;
不够就加入,然后客户端给服务端发送每位用户准备好的消息:
cmd.action = "ready"; cmd.message = JSON.stringify(user); //客户端发送消息到服务端 _ws.sendMessage(JSON.stringify(cmd));
这里约定一个类,将指令和数据分开:
public class RequestModel { public string Action { get; set; } public string Message { get; set; } }
二、找三个浏览器,分别实验
启动服务器,启动三个客户端,起名为111,222,333以示区别
然后点击第一个客户端的按钮,就会提示等待,并且根据服务端收到的消息,说明客户端已经成功连上服务器
然后点击第二个客户端:
服务端收到第二个客户端的消息,由于人数不够还未开局,继续点击第三个客户端:
这下人数够了,服务器分别给每个客户端发送消息:可以开始游戏了
(说明:代码素材了之类都来自网上,东拼西凑而来,具体来自哪里真的忘了,侵删)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?