C#服务端的微信小游戏——多人在线角色扮演(十)

C#服务端的微信小游戏——多人在线角色扮演(十)

服务端与客户端的交流,需要一套指令集,客户端发送的指令要与服务端一致,这样服务端才能理解客户端的意思。
——茂叔

上一篇,我们已经在客户端与服务端之间成功的建立了连接。
那么我们应该为客户端与服务端之间的通信设计一套规则,也就是双方都能听得懂的语言。

指令集

这里,我们采用指令+数据的形式来定义一个类,在type.cs里面定义:

public class CommunicationObject
    {
   
   
        public GameCommand command;
        public string data;

        public CommunicationObject(GameCommand command, string data)
        {
   
   
            this.command = command;
            this.data = data;
        }

        public override string ToString()
        {
   
   
            return JObject.FromObject(this).ToString();
        }
    }

其中的GameCommand是我们的指令集枚举,其定义如下:

public enum GameCommand : byte
    {
   
   
        ERROR = 0,
        CONNECTED = 1,
        LOGIN,
        MOVE,
        ATTACK,
        SEARCH,
        TAKE,
        QUIT
    }

目前暂时就这些指令,将来会不断扩充。
客户端也应该有一套完全一样的指令集,以便双方能听懂对方的意思。
我们可以直接在客户端去定义一个类似的“枚举”,尽管javascript其实没有“枚举”这个东西。

但是这样一来,每次我们扩充或者修改了指令集,就必须在两端同时修改定义,这样不仅麻烦,而且容易出错。

不如我们每次都让客户端从服务端下载指令集?

也就是说,每次客户端连接成功之后,服务端就把枚举的定义Json化,然后下发给客户端。
这样我们只需要维护服务端的指令集就可以了。

关于C#Json操作,我选择使用Newtonsoft.json
修改GameConnection的构造方法如下:

public GameConnection(string IP, WebSocket mSocket, Action<string> LOGFUN = null)
        {
   
   
            this.IP = IP;
            this.mSocket = mSocket;
            LOG = LOGFUN == null ? x => {
   
    } : LOGFUN;
            LOG("来自 " + IP + " 连接建立成功");
            JObject ISJson = JObject.FromObject(Enum.GetValues(typeof(GameCommand))
               .Cast<GameCommand>()
               .ToDictionary(x => x.ToString(), x => (int)x));
            CommunicationObject FirstMsg = new CommunicationObject( GameCommand.CONNECTED, ISJson.ToString());
            ArraySegment<byte> segment = new ArraySegment<byte>(Encoding.UTF8.GetBytes(FirstMsg.ToString()));
            mSocket.SendAsync(segment, WebSocketMessageType.Text, true, CancellationToken.None);
            ReceiveDataAsync();
        }

然后再到微信web开发者工具里面去把game.js内容修改如下:

wx.connectSocket({
   
   
  url: 'ws://localhost:666/',
  method: "GET",
  success(res){
   
   
    console.log("Socket successed:")
    console.log(res)
    wx.onSocketOpen(
      (res) => {
   
   
        console.log("Socket opened:")
        console.log(res)
      }
    )
    wx.onSocketClose(
      (res) => {
   
   
        console.log("Socket closed:")
        console.log(res)
      }
    )
    wx.onSocketError
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值