这自己实现很容易吧,保存好已连接的socket,然后想怎么群发就怎么群发。
刚研究net模块,能有简单的实例吗,多谢大神
这个是我用socket.io写的一个小项目的一段代码,和net中的socket是一样道理的,希望对你有帮助
var socketConns = {};//保存连接实例 soceketIO.setMaxListeners(0);//不限制监听最大数 soceketIO.sockets.on("connection",function(socket) { socket.setMaxListeners(0);//不限制监听最大数 socket.volatile.emit("who",{msg:""}); var clientSocket=new Object(); socket.on("verify",function(data) { clientSocket.soct=socket; clientSocket.nickname=data.nickname; clientSocket.uid=data.uid; clientSocket.username=data.username; //var socID=socket.id; socketConns[socket.id]=clientSocket; for(var socId in socketConns) //广播效果 { if(socId===socket.id) { var userlist="["; for(var socId in socketConns) { var oneuser="{nickname:"+"\""+socketConns[socId].nickname+"\""+",username:"+"\""+socketConns[socId].username+"\""+",uid:"+"\""+socketConns[socId].uid+"\""+"},"; userlist=userlist+oneuser; } userlist=userlist.substr(0,userlist.length-1); userlist=userlist+"]"; socketConns[socId].soct.volatile.emit("userlist",{userlist:userlist});//发送聊天室列表 } else { socketConns[socId].soct.volatile.emit("new user",{msg:data.nickname+"加入聊天室!",nickname:socketConns[socket.id].nickname,uid:socketConns[socket.id].uid,username:socketConns[socket.id].username}); //volatile指可丢弃的数据 } } hand_mysql.updateUserOnline(data.username,1);//设置数据库用户在线 }); socket.on("disconnect", function () { var leaveName=socketConns[socket.id].nickname; var leaveNameUid=socketConns[socket.id].uid; var leaveUsername=socketConns[socket.id].username; delete socketConns[socket.id]; for(var socId in socketConns) { socketConns[socId].soct.volatile.emit("userdisconnect", {msg:leaveName+"已经离开聊天室!",uid:leaveNameUid}); } hand_mysql.updateUserOnline(leaveUsername,0); }); socket.on("msg",function(data) { console.log("Get a msg from client..."); for(var socId in socketConns) //广播效果 { if(socId!=socket.id) socketConns[socId].soct.volatile.emit("user message",data); } //socket.broadcast.emit("user message",data); // }); });
@showen 谢大神,我看看
但是,net模块没有类似
socket.broadcast.emit("user message",data);
这些广播用的方法,原来socket.io我也用过,但是浏览器不兼容,改成flash了,我知道存数组的方法,但是就是不知道广播的方法
net模块直接用
socket.write('aaaaa');
只能当前连接的接收到,别的没法接收
var XML =
‘<cross-domain-policy>’ + ’<allow-access-from domain="" to-ports="" />’ + ’</cross-domain-policy>\0’
var net = require(‘net’), http = require(“http”), fs = require(“fs”), path = require(“path”), url = require(“url”), ctrl = require("./ctrl");
var server = net.createServer(function(socket){ socket.on(‘data’, function(data) { if(data.toString()==’<policy-file-request/>\0’){ socket.end(XML); console.log(‘客户端flash已与服务器建立连接,可以正常传输数据了!’); }else{ console.log(data.toString()); socket.write(data.toString()); } });
socket.on('error',function(){ console.log('程序出现异常!'); });
}); server.listen(3944, ‘192.168.1.122’); console.log(‘服务端已开启…’);
没有必要用broadcast,自己保存连接实例然后想给哪些连接发就给哪些发
socket.io的broadcast只是一个快捷方式,底层就是在所有在线的客户端socket上write。
哦了,把他们添加到数组,多谢
你说得对,多谢
@438041502 呵呵
CNode 社区为国内最专业的 Node.js 开源技术社区,致力于 Node.js 的技术研究。
这自己实现很容易吧,保存好已连接的socket,然后想怎么群发就怎么群发。
刚研究net模块,能有简单的实例吗,多谢大神
这个是我用socket.io写的一个小项目的一段代码,和net中的socket是一样道理的,希望对你有帮助
@showen 谢大神,我看看
但是,net模块没有类似
这些广播用的方法,原来socket.io我也用过,但是浏览器不兼容,改成flash了,我知道存数组的方法,但是就是不知道广播的方法
net模块直接用
只能当前连接的接收到,别的没法接收
‘<cross-domain-policy>’ + ’<allow-access-from domain="" to-ports="" />’ + ’</cross-domain-policy>\0’
var net = require(‘net’), http = require(“http”), fs = require(“fs”), path = require(“path”), url = require(“url”), ctrl = require("./ctrl");
var server = net.createServer(function(socket){ socket.on(‘data’, function(data) { if(data.toString()==’<policy-file-request/>\0’){ socket.end(XML); console.log(‘客户端flash已与服务器建立连接,可以正常传输数据了!’); }else{ console.log(data.toString()); socket.write(data.toString()); } });
}); server.listen(3944, ‘192.168.1.122’); console.log(‘服务端已开启…’);
没有必要用broadcast,自己保存连接实例然后想给哪些连接发就给哪些发
socket.io的broadcast只是一个快捷方式,底层就是在所有在线的客户端socket上write。
哦了,把他们添加到数组,多谢
你说得对,多谢
@438041502 呵呵