1

我正在尝试在 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) |

如果有人可以帮助指导我正确的方向和/或提供可以提供帮助的伪代码。这将不胜感激。具体来说,我对如何循环标头感兴趣,然后将有效负载读回数组并构造有效负载标头。

谢谢!

4

1 回答 1

1
payload_with_header = CustomProtocolModule.constructMethod(a) 

你可以序列化

payload = Marshal.dump(a) 

然后你可以使用

[payload.length].pack('l>') # to create a big endian signed long integer size for the packet

另一方面,您可以从套接字读取一个整数,然后读取二进制文件并使用反序列化

array= Marshal.load(read_binary)

这几乎适用于所有数据结构。Proc 实例是一个例外。

Ruby 还支持远程对象和过程调用,因此您可以进行进程间通信,甚至在不同的 ruby​​ 实现之间(例如 JRuby 和 MRI)

于 2013-03-01T07:43:38.703 回答