Komunikasi soket Node.js dan LÖVE2D

Saya mencoba membuat server node.js dan klien LÖVE2D untuk berkomunikasi melalui soket. (Hanya tes sederhana "hello world".) Node.js dan LÖVE2D berjalan di PC yang sama.

Saya berhasil mengirim pesan dari LÖVE2D ke node.js, tetapi saya tidak dapat membaca jawaban server.

Kode server node.js saya terlihat seperti ini:

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

Dan kode klien di LÖVE2D terlihat seperti ini:

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

Nah, kode sebelumnya hanya mengirimkan pesan. Sintaks apa yang harus saya gunakan untuk membaca jawaban dari server node.js? Misalnya ini hanya memberi saya kesalahan:

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

Berikut adalah beberapa dokumentasi tentang jaringan di LÖVE2D & LuaSocket, tetapi dokumentasi tersebut tidak membantu saya dalam hal ini:

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

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

(Maaf untuk pertanyaan "noob", saya benar-benar baru dengan protokol HTTP dan lainnya.)


person apk    schedule 29.09.2014    source sumber


Jawaban (1)


Anda juga perlu menggunakan panggilan receive:

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

Berhati-hatilah dengan baris baru dalam pesan Anda; "pola" default untuk receive adalah membaca satu baris (dihentikan oleh CR?LF), jadi jika karakter akhir baris tidak ada, operasi penerimaan akan memblokir menunggunya. Alternatifnya adalah membaca sejumlah karakter tertentu, tetapi karena Anda tidak mengetahui panjang pesannya, Anda perlu membuat semacam header (misalnya, kirim dua byte terlebih dahulu yang mengkodekan panjangnya dari pesan berikutnya).

Dimungkinkan juga untuk menggunakan kombinasi: kirim satu baris terlebih dahulu dan sertakan jumlah byte dalam payload berikutnya (jika ada). Misalnya "200 OK 135" atau "500 ERROR", lalu gunakan panjang tersebut (135 pada pesan OK) untuk membaca: tcp:receive(135).

Jika Anda akhirnya menggunakan protokol berbasis TCP, Anda mungkin harus menjadikannya non-pemblokiran, jika tidak, penundaan jaringan apa pun akan memblokir permainan Anda; lihat jawaban SO ini untuk beberapa petunjuk.

person Paul Kulchenko    schedule 29.09.2014
comment
Terima kasih! Bekerja seperti pesona sekarang. Ada baiknya Anda menyebutkan karakter akhir baris. LÖVE2D memang membeku sebelum saya mengubah baris ini: mySocket.write(Pesan diterima!\n, 'utf8'); - person apk; 29.09.2014