การสื่อสารซ็อกเก็ต Node.js และLÖVE2D

ฉันกำลังพยายามสร้างเซิร์ฟเวอร์ node.js และไคลเอนต์LÖVE2Dเพื่อสื่อสารผ่านซ็อกเก็ต (เป็นเพียงการทดสอบ "สวัสดีชาวโลก" ง่ายๆ) ทั้ง node.js และ LÖVE2D ทำงานบนพีซีเครื่องเดียวกัน

ฉันสามารถส่งข้อความจาก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/

(ขออภัยสำหรับคำถาม "noob" ฉันยังใหม่กับโปรโตคอล HTTP และสิ่งต่างๆ)


person apk    schedule 29.09.2014    source แหล่งที่มา


คำตอบ (1)


คุณต้องใช้การโทร รับ ด้วยเช่นกัน:

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 คือการอ่านหนึ่งบรรทัด (สิ้นสุดโดย CR?LF) ดังนั้นหากไม่มีอักขระท้ายบรรทัด การดำเนินการรับจะบล็อกการรออักขระเหล่านั้น อีกทางเลือกหนึ่งคืออ่านอักขระจำนวนหนึ่ง แต่เนื่องจากคุณไม่ทราบความยาวของข้อความ คุณจึงต้องสร้างส่วนหัวขึ้นมา (เช่น ส่ง 2 ไบต์ก่อนเพื่อเข้ารหัสความยาว ของข้อความที่ตามมา)

นอกจากนี้ยังสามารถใช้การรวมกันได้ โดยส่งหนึ่งบรรทัดก่อนและระบุจำนวนไบต์ในเพย์โหลดที่จะตามมา (ถ้ามี) ตัวอย่างเช่น "200 OK 135" หรือ "500 ERROR" จากนั้นใช้ความยาวนั้น (135 ในข้อความ OK) เพื่ออ่าน: tcp:receive(135)

หากคุณใช้โปรโตคอลที่ใช้ TCP คุณอาจต้องทำให้โปรโตคอลไม่บล็อก ไม่เช่นนั้นความล่าช้าของเครือข่ายจะบล็อกเกมของคุณ ดู คำตอบ SO สำหรับคำแนะนำบางส่วน

person Paul Kulchenko    schedule 29.09.2014
comment
ขอบคุณ! ทำงานเหมือนมีเสน่ห์ตอนนี้ เป็นเรื่องดีที่คุณพูดถึงอักขระท้ายบรรทัด LÖVE2Dค้างจริงๆ ก่อนที่ฉันจะเปลี่ยนบรรทัดนี้: mySocket.write(Message gets!\n, 'utf8'); - person apk; 29.09.2014