gpt4 book ai didi

Ruby TCPSocket 发送/接收二进制数据 -> 数组哈希等

转载 作者:可可西里 更新时间:2023-11-01 02:52:29 27 4
gpt4 key购买 nike

我正在尝试在 Ruby 中创建自定义游戏服务器协议(protocol),但我不明白我可以/应该如何做一些事情:

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) |

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

谢谢!

最佳答案

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 实例是一个异常(exception)。

Ruby also supports remote objects and procedure calls因此您可以进行进程间通信,甚至可以在不同的 ruby​​ 实现(例如 JRuby 和 MRI)之间进行通信

关于Ruby TCPSocket 发送/接收二进制数据 -> 数组哈希等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15152697/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com