触发'从服务器(`node.js`)socket.io`事件,而不是从客户端
我试图与node.js
,socket.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 CONNECTED
和Hi
在浏览器控制台。
其次,在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)
==================编辑====================
我得到了理解(也许...)
用户流量我想要的是......
- 客户端调用API
- (在服务器)检查在API,并且如果有效发光以
socket.io
验证 - 如果事件接受发送新的状态到所有客户端
然而,在服务器上创建socket.io
连接看起来很奇怪对我来说,解决的办法是到客户端。
新的用户流量,我将改变
- 客户端调用验证API
- 如果返回的是有效的,在客户端发出socket.io事件。这一次服务器只能做验证,不会发出socket.io
- 在插座时,发送新的状态,所有其他用户
================== EDIT#2 ====================
这是一种结论。它看起来我只是误解套接字通信的概念。像答案,回复说,Socket
和HTTP
是完全不同的渠道,是没有办法连接两者。 (至少,没有从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.js
,socket.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 CONNECTED
和Hi
在浏览器控制台。
其次,在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)
==================编辑====================
我得到了理解(也许...)
用户流量我想要的是......
- 客户端调用API
- (在服务器)检查在API,并且如果有效发光以
socket.io
验证 - 如果事件接受发送新的状态到所有客户端
然而,在服务器上创建socket.io
连接看起来很奇怪对我来说,解决的办法是到客户端。
新的用户流量,我将改变
- 客户端调用验证API
- 如果返回的是有效的,在客户端发出socket.io事件。这一次服务器只能做验证,不会发出socket.io
- 在插座时,发送新的状态,所有其他用户
================== EDIT#2 ====================
这是一种结论。它看起来我只是误解套接字通信的概念。像答案,回复说,Socket
和HTTP
是完全不同的渠道,是没有办法连接两者。 (至少,没有从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'
监听器,如果有的话。
希望这可以帮助你在正确的轨道!