代码地址如下:
http://www.demodashi.com/demo/11579.html

界面展示:

首先展示demo的结果界面,只是简单消息的发送和接收,包括发送文字和发送图片。





ws说明:

在介绍socket.io之前,先简单介绍一下websocket:

Web Socket的目标是在一个单独的持久连接上提供全双工,双向通信

在JavaScript中建立了Web Socket之后,会有一个HTTP请求发送到浏览器以发送连接。取得服务器响应之后,建立的连接会使用HTTP升级从HTTP协议交换为WebSocket协议。WebSocket使用了自定义的协议,所以URL模式略有不同,未加密的是ws://,加密的是wss://,使用WebSocket的好处在于:可以在客户端和服务器端发送少量数据,减少开销,且由于全双工通信,适合即时应用。但是目前还达不到浏览器完全兼容。

Socket.IO

Socket.IO官网

官网列出了Socket.IO的四大优点:

  • 实时分析:将数据推送到客户端,这些客户端会被表示为实时计数器,图表或日志客户。
  • 实时通信和聊天:只需几行代码便可写成一个Socket.IO的”Hello,World”聊天应用。
  • 二进制流传输:从1.0版本开始,Socket.IO支持任何形式的二进制文件传输,例如:图片,视频,音频等。
  • 文档合并:允许多个用户同时编辑一个文档,并且能够看到每个用户做出的修改。

    Socket.IO对于支持ws的浏览器将采用ws通信,对于不支持ws的将采用轮询方式,所以Socket.IO是一个非常适合做即时通讯的类库。

Socket.IO API

由于Socket.IO在不同版本中,API会略有不同,所以本文介绍依赖于1.4.5版本(2016.9.8)

官网对于API及用法介绍全面,在此只做简单总结:

  • 1、安装:npm install socket.io
  • 2、客户端:客户端需引用socket.io.js
  1. <script src="/javascripts/socket.io.js"></script>
  2. <script>var socket = io.connect();</script>
  • 3、服务器端:demo中服务器端采用框架express(~4.13.1),将引用模块命名为io
  1. //引入模块
  2. var server = app.listen(3000,function(){
  3. console.log('Express.js server listening on port'+ app.get('port'));});
  4. var io = require('socket.io').listen(server);
  5. //io使用
  6. io.on('connection', function (socket) {})
  • 4、服务器端API
  1. io.on('connection',function(socket){});//建立连接
  2. io.sockets.emit(约定参数,data);//向全体人员广播
  3. io.emit(约定参数, data);//向全体人员广播
  4. socket.emit(约定参数,data)//发送信息
  5. socket.on(约定参数,callback);//接收信息
  6. socket.on('disconnect',callback);//用户断开连接触发事件

Socket.IO对于每一个连接用户会自动分配一个随机的,不重复的Socket#id ,通过Socket#id可以实现将信息分发给个人

  1. var socketId = socket.id;
  2. socket.broadcast.to(socketId ).emit('my message', msg);//socket均为connect中回调函数中的socket
  • 5、客户端API
  1. socket.emit(约定参数,data)//发送信息
  2. socket.on(约定参数,callback);//接收信息

Demo介绍

package.json

  1. {
  2. "name": "ezsocket",
  3. "version": "0.0.0",
  4. "private": true,
  5. "scripts": {
  6. "start": "node app.js"
  7. },
  8. "dependencies": {
  9. "body-parser": "~1.13.2",
  10. "cookie-parser": "~1.3.5",
  11. "debug": "~2.2.0",
  12. "express": "~4.13.1",
  13. "jade": "~1.11.0",
  14. "morgan": "~1.6.1",
  15. "multiparty":"4.1.2",
  16. "socket.io":"1.4.5",
  17. "serve-favicon": "~2.3.0"
  18. }
  19. }

框架及版本如上,视图采用jade模板,主要过程为用户进入聊天室先输入名字(未查重),点击确定后发送名字等信息,进入聊天页面,在文本框中输入,点击发送按钮,发送信息。接收服务器端的相应信息,对其处理,进行界面的展示。

  1. $(function(){
  2. var socket=io.connect();
  3. $('.j_btn').on('click',function(){//进入页面确定按钮点击事件
  4. console.log(8888);
  5. var msg = $('.j_nametext').val();
  6. socket.emit('login',msg);//向服务器发送用户注册名字信息
  7. })
  8. $('#j_mesbtn').on('click',function(){//文本框按钮点击事件
  9. var data = $('#j_msgtext').html();
  10. console.log(data);
  11. var str = '<li><div class="top-right-content"><pre>'+data+'</pre></div></li>'
  12. $('.right-top-ul').append(str);
  13. socket.emit('msg',data);//向服务器发送文本框中信息
  14. })
  15. socket.on('system',function(data){//接收服务器端信息
  16. var str = '<li class="right-top-time" style="color:red">欢迎??'+data+'??进入聊天室,撒花</li>';
  17. $('.right-top-ul').append(str);
  18. });
  19. socket.on('chat',function(data){
  20. console.log(data);
  21. var str = '<li><div class="top-left-content"><span>'+data.name+'</span><pre>'+data.data+'</pre></div></li>'
  22. $('.right-top-ul').append(str);
  23. })
  24. socket.on('loginSuccess',function(){//接收服务器端登录成功信息
  25. $('.float-player').css('display','none');
  26. $('.dialog').css('display','none');
  27. });
  28. socket.on('disconnect',function(data){//接收服务器端发送的用户离开的信息
  29. console.log(data);
  30. var str = '<li class="right-top-time" style="color:red">??'+data+'??离开了组织,愿他早日回到组织的怀抱</li>';
  31. $('.right-top-ul').append(str);
  32. });
  33. $('#j_sendmsg').on('change',function(){//上传文件事件
  34. // 判断上传文件类型
  35. var objFile = $('#j_sendmsg').val();
  36. var objType = objFile.substring(objFile.lastIndexOf(".")).toLowerCase();
  37. var formData = new FormData(document.forms.namedItem("test"));
  38. $.ajax({
  39. type : 'post',
  40. url : '/uploadUserImgPre',
  41. data: formData ,
  42. processData:false,
  43. async:false,
  44. cache: false,
  45. contentType: false,
  46. success:function(re){
  47. re.imgSrc = re.imgSrc.replace('public','');
  48. re.imgSrc = re.imgSrc.replace(/\\/g,'\/');
  49. $('#j_msgtext').append('[站外图片上传中……(4)]')
  50. },
  51. error:function(re){
  52. console.log(re);
  53. }
  54. });
  55. });
  56. })

服务器端主要功能为

1、前方发送登录信息,服务器端接收并广播给全部用户,将登录成功信息传给客户端,客户端进行相应操作。

2、客户端通过发送按钮发送信息,服务器端收到后,广播给除非发送人员所有人。

3、用户离开,触发服务器端disconnect,服武器端广播给全体在线人员。

代码如下:

  1. io.on('connection', function(socket) {
  2. console.log(socket.id);
  3. var socketId = socket.id;
  4. socket.on('login',function(nickname){//接收登录
  5. socket.nickname = nickname;
  6. socket.emit('loginSuccess');//发送登录成功信息
  7. io.sockets.emit('system', nickname);//广播
  8. });
  9. socket.on('msg',function(data){//接收文本框中信息
  10. console.log(data);
  11. var sendMsg = {'name':socket.nickname,'data':data}
  12. socket.broadcast.emit('chat',sendMsg);//广播
  13. });
  14. socket.on('disconnect',function(){
  15. io.sockets.emit('disconnect', socket.nickname);
  16. })
  17. });

项目文件截图:

运行:

下载后再package.json所在位置打开命令行,通过npm install安装依赖,安装好后通过node app.js 启动服务,在google浏览器中输入 localhost:3000

总结:

本文对Socket.IO做了简单了解,若有不足或错误之处,还请多多指出。利用socket.io+nodejs打造简单聊天室

代码地址如下:
http://www.demodashi.com/demo/11579.html

注:本文著作权归作者,由demo大师代发,拒绝转载,转载需要作者授权

利用socket.io+nodejs打造简单聊天室的更多相关文章

  1. 利用socket.io实现多人聊天室(基于Nodejs)

    socket.io简单介绍 在Html5中存在着这种一个新特性.引入了websocket,关于websocket的内部实现原理能够看这篇文章.这篇文章讲述了websocket无到有,依据协议,分析数据 ...

  2. 基于react+react-router+redux+socket.io+koa开发一个聊天室

    最近练手开发了一个项目,是一个聊天室应用.项目虽不大,但是使用到了react, react-router, redux, socket.io,后端开发使用了koa,算是一个比较综合性的案例,很多概念和 ...

  3. vue + socket.io实现一个简易聊天室

    vue + vuex + elementUi + socket.io实现一个简易的在线聊天室,提高自己在对vue系列在项目中应用的深度.因为学会一个库或者框架容易,但要结合项目使用一个库或框架就不是那 ...

  4. 基于Node.js+socket.IO创建的Web聊天室

    这段时间进了一个新的项目组,项目是用Appcan来做一个跨平台的移动运维系统,其中前台和后台之间本来是打算用WebSocket来实现的,但写好了示例后发现android不支持WebSocket,大为受 ...

  5. html5的新通讯技术socket.io,实现一个聊天室

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. socket 实现一个类似简单聊天室的功能(多客户端互相通信)

    server端: #coding=utf-8 ''' 一个广播程序,linux运行 ''' import select,socket import traceback def broadcast(co ...

  7. 利用socket.io构建一个聊天室

    利用socket.io来构建一个聊天室,输入自己的id和消息,所有的访问用户都可以看到,类似于群聊. socket.io 这里只用来做一个简单的聊天室,官网也有例子,很容易就做出来了.其实主要用的东西 ...

  8. 使用socket.io打造公共聊天室

    最近的计算机网络课上老师开始讲socket,tcp相关的知识,当时脑袋里就蹦出一个想法,那就是打造一个聊天室.实现方式也挺多的,常见的可以用C++或者Java进行socket编程来构建这么一个聊天室. ...

  9. Python Socket 简单聊天室2

    上篇文章写了一个简单的单线程的一问一答的简单聊天室.这次我们使用SocketServer模块搭建一个多线程异步的聊天室. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ...

随机推荐

  1. 安卓 内存泄漏 MemoryAnalyzer

    韩梦飞沙 yue31313 韩亚飞 han_meng_fei_sha 313134555@qq.com 需要 获取 root 权限 步骤: 1,使用eclipse 自带的 DDMS 工具分析各线程的内 ...

  2. [P3806] Divide and Conquer on Tree

    Link: P3806 传送门 Solution: 询问树上是否存在两点间的距离为$k$,共有$m$次询问($m\le 100,k\le 1e7$) 预处理出所有距离的可能性再$O(1)$出解的复杂度 ...

  3. BZOJ 2120 数颜色(带修改莫队)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2120 [题目大意] 给出一颜色序列,每次可以修改一个位置的颜色或者询问一个区间不同颜色 ...

  4. 【BFS】bzoj2252 [2010Beijing wc]矩阵距离

    要注意一开始将所有为'1'的点入队,然后通过一次BFS去更新所有点的距离,直到无法更新为止. #include<cstdio> #include<queue> #include ...

  5. [转]Java中子类调用父类构造方法的问题分析

    在Java中,子类的构造过程中,必须调用其父类的构造函数,是因为有继承关系存在时,子类要把父类的内容继承下来,通过什么手段做到的? 答案如下:    当你new一个子类对象的时候,必须首先要new一个 ...

  6. [转]SSH包全解

    Struts2 Core Libraries 必须引入的包 : struts2-core.jar——Struts2的核心包 xwork-core.jar——Command模式框架,WebWork和St ...

  7. [标准性文档]WEB应用安全验证标准

    这是根据OWASP ASVS翻译过来的,可作为WEB应用开发的验收标准(未包含具体细节),值得注意的是,验收标准并非越严格越好,应根据企业自身的业务需求判定. WEB应用安全验证标准 安全验证等级的定 ...

  8. HDU 4655 Cut Pieces(2013多校6 1001题 简单数学题)

    Cut Pieces Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)Total ...

  9. HDU 4631 Sad Love Story (2013多校3 1011题 平面最近点对+爆搞)

    Sad Love Story Time Limit: 40000/20000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others ...

  10. 未能加载文件或程序集“System.Web.Razor 2.0.0 or system.web.webpages.razor 2.0.0

    出现这种问题,有两种情况: 一.bin目录下没有相应的dll,可以将相应dll拷贝至bin目录或者设置相关dll的属性“复制到本地”:true 二.如果是高于Visual Studio2013版本的开 ...