Articles of 套接字

什么是存储大量sockets的最佳做法?

为了testing的目的,我想创build一个套接字服务器,它将包含1000多个并发的套接字连接,分布在AWS上的X个ec2实例上(仍然决定使用JXCore,Java或Erlang的node.js)。 这些套接字将每隔10秒将消息随机发送到另一个套接字。 我只是无法理解如何有效地存储和读取这些套接字。 我可以看到的两个选项是将套接字对象存储在应用程序本身的地图中,或者将套接字存储在快速数据库(如Redis)中。 将套接字存储在应用程序内部的数据结构中的问题是它将能够扩展,变得健壮,以及当数百万个套接字需要find另一个套接字时,读取性能如何。 而且如果我把它们存储在像redis这样的数据库之类的地方,每次都必须有一个networking调用,因为Socket A需要知道Socket B发送消息的位置。 我担心这会大大降低性能。 我想知道什么是可扩展套接字服务器的最佳做法,因为我无法find任何在互联网上回答这个问题。 我在网上find的每个套接字服务器简单地广播到每个其他套接字,而不是有特定的套接字,只包含像10个套接字。

Socket.IO + Express:获取与快速会话关联的套接字

我正在寻找从快速http路由处理程序提出应用程序范围内的事件。 例如,用户修改logging,并将事件发送给任何其他感兴趣的用户。 在某些情况下,我想广播给所有客户端,除了(http)请求的客户端。 这可以通过广播针对您希望排除的套接字来实现,但是我目前无法访问与会话validationhttp请求相关联的套接字。 我见过一些例子 ,演示了如何从套接字请求中为用户检索快速会话(即从cookie中获取会话ID,从sessionStore中检索会话)。 是否有可能在反向工作,并可能存储socketId对会议以供日后检索? 任何人都可以用这种方法识别任何即时的警告或陷阱? 如果套接字是通过一个redis存储分布在不同的服务器上的,那么也会产生什 我可以预见,每个用户的http请求都会通过套接字请求进入不同的节点。 非常感谢!

我可以在节点js的networking套接字中使用的端口范围

嗨,我正在使用节点js的聊天应用程序。 我想知道我可以使用的端口号的范围 var webSocketsServerPort = 1337; server.listen(webSocketsServerPort, function() { console.log((new Date()) + " Server is listening on port " + webSocketsServerPort); });

当从socket.io – node.js接收到消息时,从客户端播放audio

我已经寻找了一个解决这个问题的时间,但没有find太多。 我的目标是从udp客户端收到一条消息,服务器接收并转发给Web客户端,每次收到消息时都会播放一个audio剪辑。 但是,由于某些原因,audio不能播放。 如果我直接从我的目录打开页面,audio可以播放,但如果我尝试通过本地访问它,它无法加载。 有谁知道一个解决scheme? 这里是客户端JavaScript。 var mySound = new Audio('/public/audio/Bloom.mp3'); mySound.load(); var socket = io.connect('http://localhost'); socket.on('message', function(data){ console.log(data); $('#content').text(data); mySound.play(); //document.getElementById('audiotag1').play(); }); 这个页面是由server.js服务的,它是一个使用socket.io和express的node.js文件。 我没有收到我的console.log中的任何错误。 这里是server.js var app = require('express')() , server = require('http').Server(app) , io =require('socket.io')(server) , dgram = require('dgram'); var httpPort = 1234; var udpPort = 5000; server.listen(httpPort); app.use(server.express.static( __dirname + '/public')); app.get('/', […]

Android的/套接字 – 如何从主UI线程发送信息到套接字线程?

我一直在通过论坛阅读过去一天,我似乎无法find一个答案,这将有助于解决我的问题。 我想创build一个Android套接字/游戏客户端,其中: 连接到服务器上的一个新的套接字在一个单独的线程从UI(我想保持打开) 在套接字上侦听来自服务器的消息,并使用处理程序将其发送到UI线程。 从主UI线程获取信息(即用户input,获取文本视图,button点击),然后将信息发送到服务器。 继续收听/发送其余的活动。 我在实施#3方面遇到很多困难。 最初连接到服务器的套接字是在它自己的线程中,我想保持打开无限期。 从主UI线程获取信息的最佳方式是什么,以便我可以使用该线程和套接字将信息发送到服务器? 我看到很多关于从后台线程返回信息到UI线程的post,但没有反过来。 有没有这样做的标准方式? 谢谢!

最佳实践socket.io广播消息

目前我们正在尝试编写一个应用程序来对多个数据库环境(MSSQL,DB2,Oracle)进行健康检查。 已经编写了一个web服务来执行健康检查查询,该查询返回响应时间。 我认为,而不是一个Web客户端连接到Web服务来返回数据库状态,使用一个节点的socket.io服务器来运行web服务,并将结果推送到所有的webclient会更好,因为健康检查的开销数据库将是最小的(在50人同时使用web应用程序的情况下,每5秒钟只进行一次web服务调用,而不是同时进行50次web服务请求)。 这样,即使有一百万人在使用networking应用程序,数据库也不应受到任何影响。 (虽然会降低节点服务器。) 这是代码的套接字面。 我是新来的节点和套接字。 我的下一步是将结果logging在本地MongoDB中,并只广播更改(仅响应时间)而不是所有内容,以减lessnetworkingstream量并可能绘制历史结果。 我想知道是否有可能的socket.io断开连接,如果客户端有多个标签,它的浏览器和Web应用程序不是“聚焦”,并重新连接到一旦标签再次聚焦套接字。 只是想知道这是一个好方法还是有更好的方法来实现我的目标? 另外,将我的web应用程序放置在与节点套接字服务器相同的服务器中是否是一个好主意,或者将它们分开会更好? var express = require('express') , http = require('http'); var app = express(); var server = app.listen(3030); var io = require('socket.io').listen(server); var allClients = []; io.sockets.on('connection', function(socket) { allClients.push(socket.client.id); console.log(allClients); socket.on('disconnect', function() { var i = allClients.indexOf(socket.client.id); console.log(allClients[i] + ' is disconnect!'); delete allClients[i]; allClients […]

在重新连接60秒后,socket.io套接字断开连接

在断开事件中,我使用socket.socket.reconnect()再次连接到套接字。 一个套接字工作正常,直到重新连接。 重新连接后,我看到套接字每60秒断开连接。 这是我的连接代码: socket = io.connect("https://website.com:8080", {'close timeout':'3', 'force new connection':true}); 以下是我在断开连接时所做的事情: socket.on('disconnect', function () { alert("disconnect"); socket.socket.reconnect(); }); 现在,如果我在客户端触发一个socket.disconnect(),套接字每隔60秒就会断开连接并重新连接。 我究竟做错了什么?

sequelize-nodejs如何从表的其他字段获取数据

您好我正在开发一个聊天应用程序,只是想知道如何从mysqldatabase表中的其他字段使用sequelize获取数据,因为我是全新的。 下面是我试图做到这一点: io.on('connection', function(socket){ // Send all previously sent messages for( i in messages ) { socket.emit('chat message', messages[i]); } socket.on('chat message', function(msg){ console.log('message: ' + msg); // Push the message into the in-memory array. messages.push(msg); // Storage the message for when the application is restarted. sequelize.query('INSERT INTO chat_storage(chat) VALUES("'+msg+'")').success(function() { // Insert was successful. […]

在请求模块中捕获“套接字挂断”错误

我正在使用请求模块向第三方API发送请求(GET&POST)。 我正在使用超时选项来限制响应的等待时间(不能等太久)。 问题是,有时会引发下面的exception: 错误:套接字挂在Socket.ocket.socketCloseListener(http.js:1526:23)在Socket.mit(events.js:117:20)上的createHangUpError(http.js:1476:15)在TCP.close(net.js :465:12) 我猜这是因为请求被中止(由于超时),但套接字仍然打开,并在2分钟后挂断。 问题是 – 当一个请求被中止时如何closures套接字,或者如何捕获这个exception并且正常处理。 这里是我使用的相关代码: var request = require('request'), requestOptions = { url: 'http://example.com/api', timeout: 1000 }; request(requestOptions, function onResponse(error, response, body) { if (error) { //Trying to close the socket (to prevent socket hang up errors) //**Doesn't help** this.req.socket.destroy(); this.req.destroy(); return; } //Handle the response });

koush AndroidAsync Socket.IO:看起来ConnectCallback()在Google Glass上没有被触发

我试图让我的谷歌眼镜和我的android手机连接到我在我的电脑上运行的一个NodeJs服务器,以便我可以从我的android手机发送消息到我的谷歌眼镜。 为此,我正在使用AndroidAsync的AndroidAsync库,这在我的android手机上效果很好,而且用这个库连接手机和NodeJS服务器是完全没有问题的。 然而,相同的代码似乎不能在我的谷歌眼镜工作。 我的Google Glass DOES连接,因为我的NodeJS服务器的连接EventHandler被触发,它似乎不会触发我的Google Glass上的任何ConnectCallbackfunction。 以下是我在Google Glass应用中使用的代码: SocketIOClient.connect(AsyncHttpClient.getDefaultInstance(), "http://192.168.1.229:5000", new ConnectCallback() { @Override public void onConnectCompleted(Exception ex, SocketIOClient client) { Log.i("SOCKET", "CONNECTION COMPLETED"); if (ex != null) { ex.printStackTrace(); return; } client.setStringCallback(new StringCallback() { @Override public void onString(String string, Acknowledge acknowledge) { Log.d("SOCKET", string); } }); client.setJSONCallback(new JSONCallback() { @Override public void onJSON(JSONObject […]