最新消息: 电脑我帮您提供丰富的电脑知识,编程学习,软件下载,win7系统下载。

触发'从服务器(`node.js`)socket.io`事件,而不是从客户端

IT培训 admin 5浏览 0评论

触发'从服务器(`node.js`)socket.io`事件,而不是从客户端

我试图与node.jssocket.io游戏服务器。

其基本思路如下喜欢。

  • 在服务器启动时初始化socket.io实例
  • 在全球范围内存储实例,所以控制器可以访问它
  • 当API调用,我们触发控制器或其他一些观点有些socket.io事件

这是我提出的实现...

首先,在server.js - 切入点

let GlobalVars = require('./state/GlobalVars');
const apiRouters = require('./router');

...

app.use('/api', apiRouters);
app.get('/', (req, res) => {
    res.sendFile(`${__dirname}/test/simpleClient.html`)
});

const httpServer = http.createServer(app);
let socketIOInstance = socketIO(httpServer);
socketIOInstance.on('connection', (socket) => {
    console.log('SOCKET.IO A USER CONNECTED');
    socket.on('create', (data) => {
        console.log('SOCKET.IO create called', socket);
        socket.join(data.room);
        socketIOInstance.emit('message', 'New people joined');
    });
    socket.on('join', (data) => {
        console.log('SOCKET.IO join called', data);
    })
    socket.emit('message', 'Hi');
});
GlobalVars.socketIO = socketIOInstance; 
// Add to global, so the controllers can manage own actions like create, join ...
httpServer.listen(port, () => {
    console.log(`Server Listening on the port ${port}`);
})
...

当我从一个客户端访问,我能看到SOCKET.IO A USER CONNECTEDHi在浏览器控制台。

其次,在API控制器。

let GlobalVars = require('../state/GlobalVars');
...

router.post('/create', (req, res) => {
  console.log('GenerateGameSokect');
  let game = new Game();
  let gameId = game.gameId;
  // console.log('Global vars ', GlobalVars.socketIO);
  GlobalVars.socketIO.emit('create', {
    room: gameId
  });
  res.json({
    result : 'SUCCESS',
    game : game
  })
});

我进口GlobalVars其中包含socketIO实例。因此,我希望是,插座create事件从语句GlobalVars.socketIO.emit('create', Object)触发,但在服务器日志中找不到消息。

我毫无头绪,我错过了什么。

最终形式我追求的是一样的东西...

  • 当用户调用创建API,我创建套接字连接和客房
  • API将称为HTTP协议,但在API中,则服务器将发布一些事件。 - 发布订阅等。

感谢您阅读我的问题湾Here is full source code till now(bitbucket public)

==================编辑====================

我得到了理解(也许...)

用户流量我想要的是......

  1. 客户端调用API
  2. (在服务器)检查在API,并且如果有效发光以socket.io验证
  3. 如果事件接受发送新的状态到所有客户端

然而,在服务器上创建socket.io连接看起来很奇怪对我来说,解决的办法是到客户端。

新的用户流量,我将改变

  1. 客户端调用验证API
  2. 如果返回的是有效的,在客户端发出socket.io事件。这一次服务器只能做验证,不会发出socket.io
  3. 在插座时,发送新的状态,所有其他用户

================== EDIT#2 ====================

这是一种结论。它看起来我只是误解套接字通信的概念。像答案,回复说,SocketHTTP是完全不同的渠道,是没有办法连接两者。 (至少,没有从HTTP服务器套接字打开新的连接)

如果这是错误的,你可以添加的回复,谢谢

回答如下:

现在我明白了你。或者至少我认为!

让我们把这种方式:有一个插槽,服务器和客户端上的两个(不对称)两侧。我所说的,分别为“全球经理”和“窝”在我到您的文章发表评论。

const server = require('socket.io')(yourHttpServer);
// client is installed as well when `npm i socket.io`
const client = require('socket.io-client')('http://localhost:' + yourServerPort);

// `socket` is the server side of the socket
server.on('connection', (socket) => {
  // this will be triggered by client sides emitting 'create'
  socket.on('create', (data) => {
    console.log('a client socket just fired a "create" event!');
  });
});

// this will be triggered by server side emitting 'create'
client.on('create', (data) => {
  server.emit('create', {content: 'this will result in an infinite loop of "create" events!'});
});

在你/create路线,当你GlobalVars.socketIO.emit('create', ...),服务器端套接字句柄不会被触发,但是如果你有通过浏览器连接的客户端(或者,像我上面显示,如果直接连接到服务器的客户机套接字),则这些将触发其'create'监听器,如果有的话。

希望这可以帮助你在正确的轨道!

触发'从服务器(`node.js`)socket.io`事件,而不是从客户端

我试图与node.jssocket.io游戏服务器。

其基本思路如下喜欢。

  • 在服务器启动时初始化socket.io实例
  • 在全球范围内存储实例,所以控制器可以访问它
  • 当API调用,我们触发控制器或其他一些观点有些socket.io事件

这是我提出的实现...

首先,在server.js - 切入点

let GlobalVars = require('./state/GlobalVars');
const apiRouters = require('./router');

...

app.use('/api', apiRouters);
app.get('/', (req, res) => {
    res.sendFile(`${__dirname}/test/simpleClient.html`)
});

const httpServer = http.createServer(app);
let socketIOInstance = socketIO(httpServer);
socketIOInstance.on('connection', (socket) => {
    console.log('SOCKET.IO A USER CONNECTED');
    socket.on('create', (data) => {
        console.log('SOCKET.IO create called', socket);
        socket.join(data.room);
        socketIOInstance.emit('message', 'New people joined');
    });
    socket.on('join', (data) => {
        console.log('SOCKET.IO join called', data);
    })
    socket.emit('message', 'Hi');
});
GlobalVars.socketIO = socketIOInstance; 
// Add to global, so the controllers can manage own actions like create, join ...
httpServer.listen(port, () => {
    console.log(`Server Listening on the port ${port}`);
})
...

当我从一个客户端访问,我能看到SOCKET.IO A USER CONNECTEDHi在浏览器控制台。

其次,在API控制器。

let GlobalVars = require('../state/GlobalVars');
...

router.post('/create', (req, res) => {
  console.log('GenerateGameSokect');
  let game = new Game();
  let gameId = game.gameId;
  // console.log('Global vars ', GlobalVars.socketIO);
  GlobalVars.socketIO.emit('create', {
    room: gameId
  });
  res.json({
    result : 'SUCCESS',
    game : game
  })
});

我进口GlobalVars其中包含socketIO实例。因此,我希望是,插座create事件从语句GlobalVars.socketIO.emit('create', Object)触发,但在服务器日志中找不到消息。

我毫无头绪,我错过了什么。

最终形式我追求的是一样的东西...

  • 当用户调用创建API,我创建套接字连接和客房
  • API将称为HTTP协议,但在API中,则服务器将发布一些事件。 - 发布订阅等。

感谢您阅读我的问题湾Here is full source code till now(bitbucket public)

==================编辑====================

我得到了理解(也许...)

用户流量我想要的是......

  1. 客户端调用API
  2. (在服务器)检查在API,并且如果有效发光以socket.io验证
  3. 如果事件接受发送新的状态到所有客户端

然而,在服务器上创建socket.io连接看起来很奇怪对我来说,解决的办法是到客户端。

新的用户流量,我将改变

  1. 客户端调用验证API
  2. 如果返回的是有效的,在客户端发出socket.io事件。这一次服务器只能做验证,不会发出socket.io
  3. 在插座时,发送新的状态,所有其他用户

================== EDIT#2 ====================

这是一种结论。它看起来我只是误解套接字通信的概念。像答案,回复说,SocketHTTP是完全不同的渠道,是没有办法连接两者。 (至少,没有从HTTP服务器套接字打开新的连接)

如果这是错误的,你可以添加的回复,谢谢

回答如下:

现在我明白了你。或者至少我认为!

让我们把这种方式:有一个插槽,服务器和客户端上的两个(不对称)两侧。我所说的,分别为“全球经理”和“窝”在我到您的文章发表评论。

const server = require('socket.io')(yourHttpServer);
// client is installed as well when `npm i socket.io`
const client = require('socket.io-client')('http://localhost:' + yourServerPort);

// `socket` is the server side of the socket
server.on('connection', (socket) => {
  // this will be triggered by client sides emitting 'create'
  socket.on('create', (data) => {
    console.log('a client socket just fired a "create" event!');
  });
});

// this will be triggered by server side emitting 'create'
client.on('create', (data) => {
  server.emit('create', {content: 'this will result in an infinite loop of "create" events!'});
});

在你/create路线,当你GlobalVars.socketIO.emit('create', ...),服务器端套接字句柄不会被触发,但是如果你有通过浏览器连接的客户端(或者,像我上面显示,如果直接连接到服务器的客户机套接字),则这些将触发其'create'监听器,如果有的话。

希望这可以帮助你在正确的轨道!

发布评论

评论列表 (0)

  1. 暂无评论