【问题标题】:Ruby TCPSocket Send/Receive binary data -> array hash etcRuby TCPSocket 发送/接收二进制数据 -> 数组哈希等
【发布时间】:2013-03-01 07:28:29
【问题描述】:

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

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

谢谢!

【问题讨论】:

    标签: ruby sockets tcp binary protocols


    【解决方案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 also supports remote objects and procedure calls 这样您就可以进行进程间通信,甚至在不同的 ruby​​ 实现之间(例如 JRuby 和 MRI)

    【讨论】:

    • 感谢您告诉我有关 Marshal 的信息,刚刚在 irb 中测试过,非常好。然而问题还没有解决。仍然需要有效载荷标头/网络数据包问题的帮助
    • 你能用 Array#Pack 指定字节顺序吗?在 ruby​​-doc 上找不到相关信息
    • 哦,对了!所有整数都是本机字节序。您可以用 > 指定大端,用 指定小端
    • Marshal.dump 使用本机字节序..?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多