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#

次に、メッセージの終わりを確認するために何らかの終了を使用する必要があること、またはクライアント/サーバーが完全なメッセージを受信したかどうかを判断する方法が必要であることを知っているので、メッセージのサイズを含むようにペイロードの最初の 2 バイトを設定できますか? ? これをサーバー側とクライアント側で行うにはどうすればよいですか? 受信側は TCPSocket.recv をループする必要がありますか? 最初の 2 バイト (ヘッダー) を受信するまで、最初の 2 バイトに含まれるサイズを読み取りますか? このようなものは、私が念頭に置いていたものです:

| 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 に答える