2014-09-29 8 views
1

소켓을 통해 통신하기 위해 node.js 서버와 LÖVE2D 클라이언트를 만들려고합니다. (단지 간단한 "hello world"테스트입니다.) node.js와 LÖVE2D는 모두 같은 PC에서 실행됩니다.Node.js와 LÖVE2D 소켓 통신

LÖVE2D에서 node.js로 메시지를 보내는데 서버의 대답을 읽을 수 없습니다.

내 Node.js를 서버 코드는 다음과 같습니다 LÖVE2D에서

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

그리고 클라이언트 코드는 다음과 같습니다

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 프로토콜과 관련된 새로운 내용입니다.)

답변

3

당신은뿐만 아니라 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 

이 메시지의 새로운 라인에주의를; receive의 기본 "패턴"은 한 줄 (CR? LF로 끝남)을 읽는 것입니다. 따라서 줄 끝 문자가 없으면 수신 대기 작업이 대기합니다. 대안으로 특정 수의 문자를 읽는 것이지만 메시지의 길이를 알지 못하기 때문에 헤더의 일종을 생각해 내야합니다 (예를 들어 길이를 인코딩하는 2 바이트를 먼저 보내야합니다 뒤에 오는 메시지의).

조합을 사용할 수도 있습니다. 먼저 한 줄을 보내고 뒤 따르는 페이로드의 바이트 수를 포함시킵니다. 예를 들어 "200 OK 135"또는 "500 ERROR"를 입력 한 다음 해당 길이 (OK 메시지의 135)를 사용하여 을 읽습니다.

TCP 기반 프로토콜을 사용하면 결국 차단하지 않아야합니다. 그렇지 않으면 네트워크 지연으로 인해 게임이 차단됩니다. 일부 포인터에 대해서는 SO answer을 참조하십시오.

+0

감사합니다. 지금은 매력처럼 작동합니다. "줄 끝 문자"에 대해 언급하는 것이 좋습니다. 이 줄을 변경하기 전에 LÖVE2D는 실제로 멈추었습니다 : mySocket.write ("Message received! \ n", 'utf8'); – apk