подключение двух клиентов с помощью сокета.ввод-вывод через node.js

#node.js #socket.io

#node.js #socket.io

Вопрос:

Я пытаюсь заставить двух клиентов (игроков) связываться друг с другом (обмениваясь, например, строками) через socket.io . У меня есть этот код на клиентах (GameID определен еще в коде):

 var chat = io.connect('http://localhost/play');
chat.emit(gameId "", {
    guess: "ciao"
});
chat.on(gameId "", function (data) {
    alert(data.guess);
});
  

Находясь на сервере, у меня есть это (что является одной из первых вещей, которые я делаю, не в маршрутизации, конечно)

 var messageExchange = io
    .of('/play')
    .on('connection', function (socket) {
        socket.emit('message', {
            test: 'mex'
        });
      });
  

По сути, я создаю канал, затем, когда пользователи подключаются, они используют канал для обмена сообщением короля «GameID», которое могут прочитать только они оба (используя on.(gameId "" ... материал.
Моя проблема в том, что когда игроки подключаются (сначала один, затем другой), первый подключенный должен оповещать о полученных данных (потому что второй подключенный отправил сообщение). Кто-нибудь из вас знает, почему этого не происходит?

Спасибо.

Ответ №1:

Сокет.сервер ввода-вывода должен действовать как посредник. Он может получать сообщения от клиентов и отправлять сообщения клиентам. По умолчанию он не действует как «канал», если только у вас нет сервера, передающего сообщения от клиентов другим клиентам.

На их веб-сайте есть много полезной информации о распространенных способах использования, http://socket .ввод-вывод и их репозиторий, https://github.com/LearnBoost/socket.io

Простой пример чат-клиента может быть примерно таким:

 var chat = io.connect("/play");
var channel = "ciao";

// When we connect to the server, join channel "ciao"
chat.on("connect", function () {
    chat.emit("joinChannel", {
        channel: channel
    });
});

// When we receive a message from the server, alert it
// But only if they're in our channel
chat.on("message", function (data) {
    if (data.channel == channel) {
        alert(data.message);
    }
});

// Send a message!
chat.emit("message", { message: "hola" });
  

В то время как сервер может действовать следующим образом:

 var messageExchange = io
    .of('/play')
    .on('connection', function (socket) {
        // Set the initial channel for the socket
        // Just like you set the property of any
        // other object in javascript
        socket.channel = "";

        // When the client joins a channel, save it to the socket
        socket.on("joinChannel", function (data) {
            socket.channel = data.channel;
        });

        // When the client sends a message...
        socket.on("message", function (data) {
            // ...emit a "message" event to every other socket
            socket.broadcast.emit("message", {
                channel: socket.channel,
                message: data.message
            });
        });
     });
  

Комментарии:

1. Итак, по сути, вы говорите, что я отправляю сообщение по каналу gameId , которое поступает на сервер, а затем сервер работает с этим, я прав? До сих пор нет «связи» между клиентами, то есть в основном нет «канала». Хорошо, спасибо, мне нужно перестроить все мое приложение, чем.