我正在尝试使用node.js
,socket.io
制作游戏服务器。
基本概念如下。
socket.io
实例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
})
});
我导入了包含套接字IO实例的GlobalVars
。因此,我所期望的是,从语句create
触发了套接字GlobalVars.socketIO.emit('create', Object)
事件,但在服务器日志中找不到消息。
我不知道自己缺少什么。
我追求的最终形式类似于...
感谢您阅读我的问题b。 Here is full source code till now(bitbucket public)
==================编辑==================
我了解了(也许...)
我想要的用户流是...
socket.io
但是,在服务器中创建socket.io
连接对我来说很奇怪,解决方案取决于客户端。
我将更改的新用户流
==================编辑#2 ==================
这是一种结论。看来我只是误解了套接字通信的概念。就像答案和答复说的那样,Socket
和HTTP
是完全不同的渠道,无法将两者连接起来。 (至少在没有打开从http服务器到套接字的新连接的情况下)
如果这是错误的,您可以添加回复,谢谢
答案 0 :(得分:0)
现在我了解你了。或者至少我认为!
让我们这样说:套接字(socket)上有两个(不对称的)侧面,服务器和客户端。在对您的帖子的评论中,我分别称其为“全球经理”和“插座”。
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'
监听器(如果有)。
希望这可以帮助您走上正确的轨道!