1

node.js サーバーと LÖVE2D クライアントがソケット経由で通信できるようにしようとしています。(単純な「hello world」テストです。) node.js と LÖVE2D の両方が同じ PC 上で実行されています。

LÖVE2D から node.js にメッセージを送信することはできましたが、サーバーの応答を読み取ることができません。

私のnode.jsサーバーコードは次のようになります。

var net = require('net');
var mySocket;

var server = net.createServer(function(socket) {
    mySocket = socket;
    mySocket.on("connect", onConnect);
    mySocket.on("data", onData);
});

function onConnect() {
    console.log("Connected to LOVE2D");
}

function onData(d) {
    if(d == "exit\0") {
        console.log("exit");
        mySocket.end();
        server.close();
    }
    else {
        console.log("Message from LOVE2D: " + d);
        mySocket.write("Message received!", 'utf8');
    }
}

server.listen(50000, "localhost");

LÖVE2D のクライアント コードは次のようになります。

local host, port = "localhost", 50000
local socket = require("socket")
local tcp = assert(socket.tcp())

tcp:connect(host, port)
tcp:send("hello there")
tcp:close()

function love.draw()
    love.graphics.print("can't read server answer!", 400, 300)
end

前のコードはメッセージを送信するだけです。node.js サーバーから回答を読み取るには、どの構文を使用すればよいですか? たとえば、これは私にエラーを与えます:

local host, port = "localhost", 50000
local socket = require("socket")
local tcp = assert(socket.tcp())

tcp:connect(host, port)
local answer = tcp:send("hello there")
tcp:close()

function love.draw()
    love.graphics.print(answer, 400, 300)
end

LÖVE2D と LuaSocket でのネットワークに関するドキュメントを次に示しますが、このドキュメントは役に立ちませんでした。

http://love2d.org/wiki/Tutorial:Networking_with_UDP

http://w3.impa.br/~diego/software/luasocket/

(「初心者」の質問で申し訳ありません。私はHTTPプロトコルなどに本当に慣れていません。)

4

1 に答える 1

3

受信呼び出しも使用する必要があります。

tcp:connect(host, port)
tcp:send("hello there\n")
local answer = tcp:receive()
tcp:close()

function love.draw()
    love.graphics.print(answer, 400, 300)
end

メッセージの改行には注意してください。のデフォルトの「パターン」receiveは 1 行 (CR?LF で終了) を読み取るため、行末文字が存在しない場合、受信操作はそれらを待機してブロックされます。別の方法として、特定の文字数を読み取ることもできますが、メッセージの長さがわからないため、何らかのヘッダーを作成する必要があります (たとえば、長さをエンコードする 2 バイトを最初に送信するなど)。続くメッセージの)。

組み合わせを使用することも可能です。最初に 1 行を送信し、その後に続くペイロード (存在する場合) にバイト数を含めます。たとえば、「200 OK 135」または「500 ERROR」の場合、その長さ (OK メッセージでは 135) を使用して、次のように読み取りますtcp:receive(135)

TCP ベースのプロトコルを使用することになった場合は、おそらく非ブロッキングにする必要があります。そうしないと、ネットワークの遅延によってゲームがブロックされます。いくつかの指針については、このSOの回答を参照してください。

于 2014-09-29T06:01:59.900 に答える