我正在尝试在 Ruby 中创建自定义游戏服务器协议,但我无法理解我可以/应该如何做几件事:
Q->1#
服务器使用 TCPServer/TCPSocket 向客户端发送一个数组。但我不能使用 JSON,因为传输需要是二进制的。我如何将 ruby 数组转换为二进制,然后可以将其转换回客户端的数组?
这是我的服务器:
#!/usr/bin/env ruby
require 'socket'
server = TCPServer.new 5020
loop do
Thread.start(server.accept) { |c|
print "new Client connected"
a = ["Hello, there"]
payload_with_header = CustomProtocolModule.constructMethod(a) # what method do i use to convert a (array -> binary representation? don't really understand .unpack, .pack, what template would i use if i did use String#Unpack? will String#Unpack work for what i need?
client.write payload_with_header
client.close
}
end
(以上是我的第一个问题)
Q->2#
接下来,因为我知道我需要使用某种终止来检查消息的结尾或确定客户端/服务器是否已收到完整消息的方法,我是否可以将有效负载的前两个字节设置为包含消息的大小? 我将如何做这个服务器端和客户端?接收方必须循环 TCPSocket.recv 吗?直到它接收到前两个字节(标头),然后读取前两个字节包含的大小?我的想法是这样的:
| Payload Header (2 bytes) | array (contains cmd, message etc) |
如果有人可以帮助指导我正确的方向和/或提供可以提供帮助的伪代码。这将不胜感激。具体来说,我对如何循环标头感兴趣,然后将有效负载读回数组并构造有效负载标头。
谢谢!