Tag: 套接字

与群集模块共享networking端口

基于对这个问题的回答 ,我试图找出为什么有多个工作者调用server.listen()在同一个端口/地址不会导致任何问题,但有一个老工人调用server.close()由同一个端口上的server.listen()会反复给出错误EADDRINUSE 。 这似乎不是一个监听器没有正确closures的情况,因为发出close事件,这是当我尝试build立新的监听器。 当这名工作人员得到EADDRINUSE ,新产生的工人可以调用server.listen()而不会造成任何问题。 这是一个简单的testing,将certificate这个问题。 由于工作人员每隔100ms分叉一次,他们将在端口16000上build立一个监听器。当工作人员10分叉时,它将build立一个超时,在1秒后将其监听器拆除。 一旦发生close事件,它将尝试再次在端口16000上调用server.listen()并获取EADDRINUSE错误。 为了保持一致性,该testing在绑定过程中明确提供了相同的地址,以避免核心模块处理null地址时出现任何潜在的问题。 这个特定的实现将导致工作人员10在绑定过程中遇到错误后接着执行所有的循环,从而使主进程免于分派新的工作人员。 如果在调用server.listen()之前添加了一个延迟,那么worker 10将继续击中EADDRINUSE同时主服务器不断地EADDRINUSE能够build立侦听器的新工作人员。 var cluster = require('cluster'); var net = require('net'); if (cluster.isMaster) { setInterval(function(){cluster.fork()},100); } else { var workerID = cluster.worker.id; var server; var setup = function() { console.log('Worker ' + workerID + ' setting up listener'); server = net.createServer(function(stream) {}); server.on('error', function(err) { […]

无法让socket.io在服务器上运行,而在本地运行正常

这个代码运行良好,在本地运行node.js服务器: 服务器: var client = require('socket.io').listen(3001).sockets; 客户端HTML: <script src="http://localhost:3001/socket.io/socket.io.js"></script> 客户端Javascript: var socket = io.connect('http://localhost:3001'); 然后我把server.js移到了我的ubuntu服务器上,它使用相同的代码安装了节点和套接字io,并且没有错误地启动它。 客户端我把本地的html / javascript文件从localhost:3001更改为ServerIP:3001,它不再工作。 当我检查萤火虫,我可以看到它永远不会完成尝试GET http:// ServerIP:3001 / socket.io / socket.io.js 。 它不会失败,只是永远不会结束。 我做错了什么? 谢谢。

在php中处理实时通知的最好方法是什么?

我想实现像Facebook一样的实时通知。 根据服务器加载时间和编码效率的不同,可能会为不同的用户发送大量的通知。 哪个是最好的方法? 1. using normal AJAX? 2. with node.js and socket programming? 3. something else? 提前致谢。

是否socket.io服务器发出callback阻塞?

当在服务器上接收到发射(即,由客户端生成)时,在下一个发射被处理之前,callback函数是否完成? 例: socket.on('disconnect', function() { log('disconnect START – ' + socket.id); … … Do some stuff … … log('disconnect END – ' + socket.id); }); 我似乎在我的日志中得到这个输出: disconnect START – z0w0W4scKZ8o6c4nAAAm disconnect END – z0w0W4scKZ8o6c4nAAAm disconnect START – LLnSgRBV9NZ35mjrAAAk disconnect START – djl3hyNvIwAhSEDbAAAn disconnect END – LLnSgRBV9NZ35mjrAAAk disconnect END – djl3hyNvIwAhSEDbAAAn 正如你所看到的,一个START在达到END之前中断另一个…

如何在socket.io中locking全局数组

如果我有一个全局数组: var users = new Array(); 我想在所有的客户中维持这个arrays: socket.on('connect', function() { users.push(socket.id); }); socket.on('disconnect', function() { users.splice(users.indexOf(socket.id), 1); }); 如果我有另一个function呢? socket.on('new_score', function(s) { for (u in users) { … do some processing … io.sockets.connected[users[u]].emit('new_score', socket.id, s); … do some processing … } }); 由于socket.io是asynchronous的,在我最后一个函数发出的时候,用户可能已经被断开连接。 所以我需要一种方法来安全地访问数组与所有这些其他functionasynchronous操纵它…

跨多个Amazon EC2实例水平缩放socket.io

使用运行我的节点应用程序的2个Amazon EC2服务器正确安装并正常工作。 目前坐在应用程序负载平衡器后面。 我使用这样的代码发送套接字消息 const ioredis = require('socket.io-redis'); io = require('socket.io')(server); io.adapter(ioredis({ host: 'localhost', port: 6379 })); io.to('roomName').emit('message', data); 但是,使用socket.io发送消息时,消息仅从始发节点服务器广播。 服务器1发出一个socket.io消息 – >连接到服务器1的任何人都会听到该消息,但是连接到服务器2的任何人都不会。 服务器2发出一个socket.io消息 – >连接到服务器2的任何人都会听到该消息,但连接到服务器1的任何人都不会。 我需要帮助的是如何从服务器1发出socket.io消息,并将其中继到所有其他服务器,也可能通过在单独的服务器上使用单个redis实例? 要么 将另一台服务器作为服务器1和服务器2发送和接收套接字消息的套接字发射器。 不太确定哪个选项是最好的和正确的方式去,任何帮助将不胜感激。

Express – socket.io – 会话。 将用户标识作为套接字标识

我正在使用express-socket.io会话 。 我想我可以通过查看教程来设置基本configuration: //BASIC CONFIG? var clients = []; var session = require("express-session")({ secret: 'some key', resave: true, saveUninitialized: true }); var sharedsession = require("express-socket.io-session"); app.use(session); io.use(function(socket, next){ next(); }); io.use(sharedsession(session, { autoSave:true })); io.on('connection', function(socket) { console.log("CLIENT CONNECTED"); var session = socket.handshake.session; clients.push(socket); socket.on('disconnect', function() { console.log("CLIENT DISCONNECTED"); }); }); 我现在想要做的就是引用特定的客户端套接字,而不是由套接字引用,而是由应该分配给该套接字的会话标识引用。 当用户login时发生这种情况: req.session.user_id = […]

Socket.io本地networking未连接

好的,我有以下设置: https : //i.stack.imgur.com/4T9SX.jpg (如果下面的图片太小) 问题是计算机2无法连接到计算机1的socket.io。 是的,我在电脑2中包含了socket.io: 任何想法,为什么计算机2无法连接到计算机1与socket.io而平可以? 额外的信息: – Socket.io版本1.4.5 – 两台计算机都是Windows 10 – 计算机2 JavaScript是在Phonegap – 计算机2通过Wi-Fi连接,计算机1通过以太网 问候 从客户端(计算机2,启动时调用init) 编辑代码: KerstAppHome.prototype.init = function(){ var address = 'http://192.168.2.120:2017'; console.log("Connecting to: " + address); this.socket = io.connect(address); this.socket.on('connect', this.proxy(function(){ console.log("Connected to socket!"); this.socketIsConnected = true; this.socket.on('disconnect', this.proxy(function(){ console.log("Disconnected from socket!") this.socketIsConnected = false; })); this.socket.on('musicBlob', […]

Android客户端没有收到来自node.js服务器的socket.io消息

我已经使用socket.io将Android客户端连接到node.js服务器,并且能够将消息发送到服务器,但不能在客户端上接收。 对于客户端我喜欢 Log.i("MainActivity: ", "sending message"); final JSONObject sdpObj = new JSONObject(); try { sdpObj.put("id","presenter"); sdpObj.put("sdpOffer",localSdpOffer.description); } catch (JSONException e) { e.printStackTrace(); } LoginActivity.mSocket.emit("new message", sdpObj); 并在服务器上收到对象如: io.sockets.on('connection',function(socket){ socket.on('new message',function(message){ // some logic socket.emit('created',object); 那么在客户端: LoginActivity.mSocket.on("created", new Emitter.Listener() { @Override public void call(Object… args) { Log.i( TAG, "message back:received "); User user = new User(); […]

Socket.io SSL错误

我正在努力确保我的网站 一切都好,直到我终于安装了SSL证书(从CloudFlare,而不是一个自签名的证书) 所以问题是:当我通过HTTP打开我的网站 – 一切正常,但是当我通过https打开它 – 网站正在失去连接到主机(它需要工作) 在控制台中,我可以看到: socket.io-1.4.5.js:1 GET https://188.226.131.219:8080/socket.io/?EIO=3&transport=polling&t=LlI-URK net :: ERR_CONNECTION_CLOSED 如果我理解正确,这是一个端口问题。 使用HTTP端口80是可以的,使用https端口443有问题。 有什么办法来交换端口?