Node.js 和 LÖVE2D 的套接字通信

我正在尝试通过套接字使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协议和其他东西也是如此。)

点赞
用户1442917
用户1442917

你需要同样使用 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 终止),所以如果行末没有终止字符,receive 操作将会阻塞等待它们。另一种方案是读取一定数量的字符,但由于你不知道消息的长度,你需要提供一些头文件(例如,先发送两个字节来编码后面消息的长度)。

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

如果最终使用基于 TCP 的协议,则可能需要将其设置为非阻塞,否则任何网络延迟都会阻塞游戏;参见此 SO 答案 获取一些指针。

2014-09-29 06:01:59