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是读取一行(由 CR?LF 终止),因此如果不存在行尾字符,接收操作将阻塞等待它们。另一种方法是读取一定数量的字符,但是由于您不知道消息的长度,因此您需要提出某种标头(例如,首先发送两个字节来编码长度的消息)。

也可以使用组合:首先发送一行,然后在有效负载中包含字节数(如果有的话)。例如“200 OK 135”或“500 ERROR”,然后使用该长度(OK 消息中的 135)读取:tcp:receive(135).

如果您最终使用基于 TCP 的协议,您可能需要将其设为非阻塞,否则任何网络延迟都会阻塞您的游戏;请参阅this SO answer以获取一些指示。

于 2014-09-29T06:01:59.900 回答