ゲーム用の簡単なプロトコルを作成しました。
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
これを行うには、メッセージの先頭に B を追加し、最後に E を追加してから、最初の文字が B で最後が E になるように解析します。
唯一の問題は、途中でプロトコルに従わないばかげたものを受け取った場合はどうなるかということです. または、メッセージではなく単なる文字列を受け取るだけだとしたらどうでしょうか。したがって、文字列 HelloB を受信する意図がある場合、これを hello およびメッセージの先頭として解析しますが、メッセージではないため、そのメッセージを受信することはありません。
これらの潜在的な問題を解決するためにプロトコルを変更するにはどうすればよいですか? 正しく形成されたメッセージしか受信しないと私は予想していますが、メッセージのエンコードが不十分ですべてがうまくいかない場合は悪夢です。
ありがとう
最初に長さを追加し、メッセージに取り組んでいるかどうかを追跡することにしました:
p32m133s11:Hello Worldi-57989b0b1b0
次に、「p」を見つけるための読み取り、「p」の後の長さを見つけるための読み取り、または長さのバイトが読み取られるまでのバイトの読み取りの 3 つの状態があります。
どう思いますか?
それはうまくいくようです。