TypeError: io.sockets.socket is not a function 解决方案
来源:互联网 发布:统计学 算法模型 编辑:程序博客网 时间:2024/06/10 17:10
近日使用socket.io开发即时聊天应用程序时遇到这么一个问题,就是使用io.sockets.socket(socketid).emit('String', data) 给
指定的客户端发送消息时,报了一个 TypeError: io.sockets.socket is not a function 的错误,找了很久的原因,原来是当
socket.io版本大于1.0.x时,我们应该使用 io.to(socketid).emit('String', data) 来替代。
扩展一下,这个socketid我们可以怎么获取呢?
假如我们的业务是客户端每个用户都有对应的用户名,都通过socket连接到服务器,我们已经知道socketid只能在服务器端获
取,那么直接通过socket.id来获取socketid是不行的,因为不同的用户socketid不一样。那怎样解决呢?方法很简单,解决方案如下:
首先当客户端通过socket连接到服务器时,可以emit它的用户名,即:
socket.emit('postUsername', { username: username});
这里value的username是已经被赋值了的。
然后在服务器端通过一张hash表来存储socketid即可,key为用户名,value为对应的socketid,具体代码如下:
var fs=require('fs');var io= require('socket.io').listen(3000); io.sockets.on('connection',function(socket){ //保存用户的socketid到hash表 socket.on('postUsername',function(data){ saveUserinfoToJson(data.username,socket.id); }) //监听用户发送消息 socket.on('postMessage',function(data){ var username=data.to; //发给谁 getSocketIdAndSendMessage(username,data); //私发给指定的这个用户 /* 坑:私发给指定用户,不能像下面这样写,因为fs的readFile的第三个参数是一个回调函数,不能通过return来获取SocketId。 // var socketid=getUserSocketId(data.to); // io.to(socketid).emit('receiveMessage',data); //现在只能用这个了 */ /*坑:私发的以下两个API都不行了 //io.sockets.connected[socketid].emit('receiveMessage',data); 这个也不行了 //io.sockets.socket(socketid).emit('receiveMessage',data); 这个不行了 */ //群发用下面的api //io.sockets.emit('receiveMessage',data); });})/*建一张hash表,保存用户的socketid*/function saveUserinfoToJson(username,id){ fs.readFile( __dirname + "/" + "users.json", 'utf8', function (err, data) { var data = JSON.parse(data); data[username] =id; fs.writeFile(__dirname + "/" + "users.json",JSON.stringify(data), function (err1) { if(err1) console.log(err1); }) });}/*根据用户名获取用户的socketid并私发消息给用户*/function getSocketIdAndSendMessage(username,message){//错误的写法// var socketid;// fs.readFile( __dirname + "/" + "users.json", 'utf8', function (err, data) {// var data = JSON.parse(data);// socketid =data[username];// });// return socketid;fs.readFile( __dirname + "/" + "users.json", 'utf8', function (err, data) { var data = JSON.parse(data); var socketid =data[username]; io.to(socketid).emit('receiveMessage',message);});}
当然我们得在同级目录下建一个users.json文件,内容为空的json,即 {}。
关于这个项目,源码地址 :https://github.com/lensh/chat-websocket,目前项目还在开发中(后续更新)
1 0
- TypeError: io.sockets.socket is not a function 解决方案
- TypeError: $.cookie is not a function解决方案
- UnCaught TypeError:date.getFullYear is not a function解决方案
- typeError: form.submit is not a function
- Uncaught TypeError: undefined is not a function
- Uncaught TypeError: string is not a function
- TypeError: e[h] is not a function
- Uncaught TypeError: object is not a function
- TypeError: jQuery(...).validationEngine is not a function
- TypeError: $(...).ajaxSubmit is not a function
- Uncaught TypeError: undefined is not a function
- Uncaught TypeError: undefined is not a function
- Uncaught TypeError: object is not a function
- Uncaught TypeError: boolean is not a function
- Uncaught TypeError: $(...).appendChild is not a function
- TypeError: Buffer.allocUnsafe is not a function
- typeError: $(...).ajaxSubmit is not a function
- jquery TypeError: $.widget is not a function
- unity创建拖拽的圆周运动效果
- Vim实用技巧记录(一直更新)
- C#中的匿名类
- python学习笔记2-字典的使用
- Junit官方入门指南
- TypeError: io.sockets.socket is not a function 解决方案
- Android Studio初次进入Building卡住
- 14.06
- ES callback轮询机制
- Binary Tree Path Sum 解题报告
- 分布式架构学习之:014--消息中间件在分布式系统中的作用
- ajax POST跨域请求完美解决
- JavaScript入门
- 【HDU3449】 consumer