Как сделать так, чтобы функция socket.on () в server.js выполнялась с человеком, который его выпустил? (Node.js) - PullRequest
0 голосов
/ 28 августа 2018

Когда я запускаю что-то подобное в моем файле app.js:

socket.emit('3');

Функция происходит со всеми в игре.

функция server.js:

    socket.on('3', function() {
    global.cashing = true;
});

Я проверил, была ли функция app.js socket.emit () тоже со всеми, помещая в функцию window.location.replace, например:

socket.emit('3');
window.location.replace('otherurl.com');

Я заметил, что игрок, выпустивший функцию, был единственным, чье местоположение было заменено, но функция server.js socket.on () по-прежнему применялась ко всем другим игрокам.

Итак, когда я размещаю функцию socket.emit, функция socket.on затрагивает всех, но мне нужно, чтобы эта функция применялась к одному человеку.

Я пытался сделать что-то вроде этого:

socket.emit('3', id);

, а затем

        socket.on('3', function(id) {
if(arguments.length) {
        global.cashing = true;
}
});

и

        socket.on('3', function(id) {
if(id !== undefined) {
        global.cashing = true;
}
});

И это не сработало. Функция по-прежнему применяется ко всем игрокам. (Я также пробовал оператор if с нулем.

Как сделать так, чтобы функция socket.on применялась только к проигрывателю, который его выпустил?

Извините, если это действительно просто, я новичок в node.js:)

1 Ответ

0 голосов
/ 28 августа 2018

Когда сокеты инициализируются, они имеют id, к которому можно получить доступ позже через server.sockets.sockets[id]. От вас зависит, сможете ли вы соотнести эти идентификаторы с более персонализированными данными, которые может использовать ваше приложение - убедитесь, что при создании карты в памяти вы очищаете идентификаторы при закрытии сокетов (и вообще, подумайте о способах масштабирования, потому что это о чем подумать)!

const app = require("express")();
const http = require("http").Server(app);
const io = require("socket.io")(http);

app.get("/", function(req, res) {
  res.sendFile(__dirname + "/index.html");
});

io.on("connection", function(socket) {
  console.log("a user connected", socket.id);
  console.log("welcoming them personally");
  io.sockets.sockets[socket.id].emit("message", "hello " + socket.id);
});

http.listen(3000, function() {
  console.log("listening on *:3000");
});

Затем в пользовательском интерфейсе:

<!doctype html>
<html>

<head>
  <title>Socket.IO chat</title>
</head>
<script src="/socket.io/socket.io.js"></script>
<script>
  var socket = io();
  socket.on('message', console.log)
</script>

<body>

</body>

</html>

Вы увидите журнал независимых интерфейсов без уведомления других.

...