服务器到服务器套接字IO消息

语境:

  1. 使用require("socket.io");运行服务器的Node.js require("socket.io");
  2. 使用require("socket.io-client");运行另一台服务器的Node.js require("socket.io-client");
  3. 在使用标准时接收确认(来自其他服务器):

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;