Node.js и LÖVE2D сокетная связь
Я пытаюсь заставить сервер node.js и клиент LÖVE2D общаться через сокеты. (Просто простой тест "hello world".) Оба 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 и прочим.)
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), поэтому, если символы конца строки отсутствуют, операция приема будет блокировать их ожидание. Альтернативой может быть чтение определенного количества символов, но, поскольку вы не знаете длину сообщения, вам нужно придумать какой-то заголовок (например, сначала отправить два байта, которые кодируют длину). сообщения, которое следует)
Также можно использовать комбинацию: сначала отправьте одну строку и укажите количество байтов в полезной нагрузке, которая последует (если есть). Например, "200 OK 135" или "500 ОШИБКА", а затем используйте эту длину (135 в сообщении ОК), чтобы прочитать: tcp:receive(135)
,
Если вы в конечном итоге используете протокол на основе TCP, вам, вероятно, нужно сделать его неблокирующим, иначе любая сетевая задержка заблокирует вашу игру; см. этот так ответ для некоторых указателей.