服务端与客户端的交流,需要一套指令集,客户端发送的指令要与服务端一致,这样服务端才能理解客户端的意思。
——茂叔
上一篇,我们已经在客户端与服务端之间成功的建立了连接。
那么我们应该为客户端与服务端之间的通信设计一套规则,也就是双方都能听得懂的语言。
指令集
这里,我们采用指令+数据的形式来定义一个类,在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

最低0.47元/天 解锁文章
2万+

被折叠的 条评论
为什么被折叠?



