服务器到服务器套接字IO消息
语境:
- 使用
require("socket.io");
运行服务器的Node.jsrequire("socket.io");
- 使用
require("socket.io-client");
运行另一台服务器的Node.jsrequire("socket.io-client");
- 在使用标准时接收确认(来自其他服务器):
io.on("connection", function() { console.log("Something connected."); });
问题:
不幸的是,我无法得到任何一台服务器上的CLIENT 都运行客户端和服务器socket.io发送消息到其他服务器。
我意识到这可能是一个代码错误,所以我会包括正确的缘故,但对于logging,我想知道是否有什么我做错了语义上,而不是代码明智的。
代码:(LoginServer.js)
var app = require('http').createServer(); var io = require('socket.io')(app); var ioc = require("socket.io-client"); var LoginServer = (function() { function LoginServer() { this.gameServerSocket = ioc.connect("http://localhost:3031", {reconnect: true}); } LoginServer.prototype.initialize = function() { var self = this; io.listen(3032); io.on("connection", function(socket) { socket.emit("connection"); }); this.gameServerSocket.on("connection", function() { console.log("Game Server Connected!"); self.gameServerSocket.emit("login", {accountName: "default"}); }); } return LoginServer; })(); exports.LoginServer = LoginServer;
代码:( GameServer.js)
var app = require('http').createServer(); var io = require('socket.io')(app); var ioc = require("socket.io-client"); var GameServer = (function() { function GameServer() { this.loginServerSocket = ioc.connect("http://localhost:3032", {reconnect: true}); this.loginServerSocket.emit("connection"); } GameServer.prototype.initialize = function() { var self = this; io.listen(3031); io.on("connection", function(socket) { socket.emit("connection"); }); this.LoginServerResponses(); } GameServer.prototype.LoginServerResponses = function() { var self = this; this.loginServerSocket.on("connection", function() { console.log("Login Server Connected!"); }); this.loginServerSocket.on("login", function(data) { console.log("Login Server:", data); }); } return GameServer; })(); exports.GameServer = GameServer;
“不幸的是,我无法在任一台服务器上运行客户端和服务器的socket.io来向其他服务器发送消息。”
你真正想要做的是1台服务器,并允许客户端连接。
服务器可以与客户端进行通信,客户端也可以与客户端进行通信。
server.js
var app = require('http').createServer(); var io = require('socket.io')(app); io.listen(3032); io.on('connection', function(socket) { console.log('A user(a client) connected!'); // lets welcome this particular client with a nice msg :) socket.emit('msg group', 'Welcome client! you can emit msgs for me to tell every client in "to everyone please"'); // lets tell everyone someone joined io.emit('msg group', 'guys someone special joined :)!'); socket.on('to everyone please', function(freedomMsg) { io.emit('msg group', "a client told me (the server) to send this to everyone (every clients)!: " + freedomMsg); }); });
aClient.js
var ioc = require("socket.io-client"); var socket = ioc("http://localhost:3032"); // general chat socket.on('msg group', function(msg) { console.log(msg); }); function msgEveryone(message) { socket.emit('to everyone please', message); } msgEveryone('whats up guys?');
我希望通过这个,你将会更加了解socket.io(或者一般的套接字)是如何工作的:)
代码:( GameServer.js)
先删除这些代码:
this.loginServerSocket.on("login", function(data) { console.log("Login Server:", data); });
第二个改变代码:
GameServer.prototype.initialize = function() { var self = this; io.listen(3031); io.on("connection", function(socket) { socket.emit("connection"); }); this.LoginServerResponses(); }
至
GameServer.prototype.initialize = function () { var self = this; io.listen(3031); io.on("connection", function (socket) { socket.emit("connection"); socket.on("login", function (data) { console.log("Login Server:", data); }); }); this.LoginServerResponses(); }
试试这个: LoginServer.js
var app = require('http').createServer(); var io = require('socket.io')(app); var ioc = require("socket.io-client"); var LoginServer = (function() { function LoginServer() { this.gameServerSocket = ioc.connect("http://localhost:3031", {reconnect: true}); } LoginServer.prototype.initialize = function() { var self = this; io.listen(3032); io.on("connection", function(socket) { // a client, maybe game server, is connected socket.on("login", function(data){ console.log("Credentials: "+ data); }); }); this.gameServerSocket.on("connect", function() { console.log("Connected to Game Server!"); // Send event to game server }); } return LoginServer; })(); exports.LoginServer = LoginServer;
GameServer.js
var app = require('http').createServer(); var io = require('socket.io')(app); var ioc = require("socket.io-client"); var GameServer = (function() { function GameServer() { this.loginServerSocket = ioc.connect("http://localhost:3032", {reconnect: true}); } GameServer.prototype.initialize = function() { var self = this; io.listen(3031); io.on("connection", function(socket) { // a client, maybe login server, is connected }); this.LoginServerResponses(); } GameServer.prototype.LoginServerResponses = function() { var self = this; this.loginServerSocket.on("connect", function() { console.log("Connected to Login Server !"); // Try to login self.loginServerSocket.emit("login", {accountName: "default"}); }); } return GameServer; })(); exports.GameServer = GameServer;
在做了更多的testing后,我意识到你的代码工作正常。 也许你不正确地调用你的模块? 我用这个作为我的index.js和两个服务器 – 客户端连接正常:
// index.js var GameServer = require('./GameServer.js').GameServer; var LoginServer = require('./LoginServer.js').LoginServer; var lserver = new LoginServer(); var gserver = new GameServer(); lserver.initialize(); gserver.initialize();
附注在sockets上
我相信你可以用login和游戏服务器之间只有一个stream来完成你想要做的事情。 这里只使用1个服务器和1个客户端来完成同样的事情:
GameServer.js:
var http = require('http'); var io = require('socket.io'); function GameServer() { } GameServer.prototype.initialize = function() { var self = this; self.httpServer = http.createServer(); self.ioServer = io(self.httpServer); self.ioServer.listen(3031); self.ioServer.on("connection", function(socket) { socket.emit("connection"); }); this.LoginServerResponses(); } GameServer.prototype.LoginServerResponses = function() { var self = this; this.ioServer.on("connection", function() { console.log("Login Server Connected!"); }); this.ioServer.on("login", function(data) { console.log("Login Server:", data); }); } exports.GameServer = GameServer;
LoginServer.js:
var ioc = require("socket.io-client"); function LoginServer() { this.gameServerSocket = ioc.connect("http://localhost:3031", {reconnect: true}); } LoginServer.prototype.initialize = function() { var self = this; self.gameServerSocket.on("connection", function() { self.gameServerSocket.emit("connection"); }); this.gameServerSocket.on("connection", function() { console.log("Game Server Connected!"); self.gameServerSocket.emit("login", {accountName: "default"}); }); } return LoginServer; exports.LoginServer = LoginServer;