工作,我做了一个简单的协议,用于我的游戏:更改此协议与TCP流
b = bool
i = int
sINT: = string whose length is INT followed by a : then the string
m = int message id.
例子:
m133s11:Hello Worldi-57989b0b1b0
这将是:
Message ID 133
String 'Hello World' length 11
int -57989
bool false
bool true
bool false
我没有不过,不管怎么说,TCP可能只会发送一部分消息。我不知道我究竟怎么能修改此,这样我可以做到以下几点:
on receive data from client:
use client's chunk parser
process data
if has partial message then try to find matching END
if no partial messages then try to read a whole message
for each complete message in queue, dispatch it
我能做到这一点通过在结束的消息和E开头添加B,然后通过解析为第一个字符是B,最后是E.
唯一的问题是如果 我在中间接收到一些愚蠢的东西,而不遵循协议。或者,如果我应该只是收到一些不是信息的东西,而只是一个字符串。所以,如果我想以某种方式接收字符串HelloB,那么我会将其解析为hello和消息的开头,但我绝不会收到该消息,因为它不是消息。
我该如何修改我的协议来解决这些潜在的问题?尽管我预计只会收到正确形成的信息,但如果编码不好并且将所有信息都设置得不好,那将是一场噩梦。
感谢
我决定在开始添加的长度和跟踪,如果我工作的一个消息或没有的: 这样:
p32m133s11:Hello Worldi-57989b0b1b0
我那么有3个状态,阅读找到'p',读取'p'后的长度或读取字节,直到读取长度字节。
您认为如何?
它似乎很好。
使用协议缓冲区。或者,在开始时对整个数据包的长度和可能的校验和进行编码。但是,实际上,使用PB或其他建立的交换格式,没有重点发明车轮。 –
我更喜欢使用我在这里所做的。 – jmasterx
如果你真的不想使用预定义的协议,考虑用STX/ETX包装你的整个数据包http://en.wikipedia.org/wiki/C0_and_C1_control_codes – Chad