前言

网络聊天室在web1.0的时代就出现了,但当时技术支持比较有限,大都是通过浏览器插件BHO,JavaApplet,Flash实现的。如今HTML5技术风起云涌,通过websocket实现的网络聊天室,被定义为websocket的第一个实验,就像Hello World一样的简单。

今天我也动手完成了这个实验,感觉真的很爽!

目录

  1. socket.io介绍
  2. 服务器端和客户端通信设计
  3. 服务器端实现
  4. 客户端实现
  5. 完整案例代码

1. socket.io介绍

socket.io一个是基于Nodejs架构体系的,支持websocket的协议用于时时通信的一个软件包。socket.io 给跨浏览器构建实时应用提供了完整的封装,socket.io完全由javascript实现。

基于Nodejs实现webscoket其他的框架,请参考文章:Nodejs实现websocket的4种方式

2. 服务器端和客户端通信设计

上图中client1 和 server 描述通信过程,client2描述对其他的客户端,通过广播进行消息通信。

  1. client1向server发起连接请求
  2. server接受client的连接
  3. client1输入登陆用户名
  4. server返回欢迎语
  5. server通过广播告诉其他在线的用户,client1已登陆
  6. client1发送聊天信息
  7. server返回聊天信息(可省略)
  8. server通过广播告诉其他在线的用户,client1的聊天消息
  9. client1关闭连接,退出登陆
  10. server通过广播告诉其他在线的用户,client1已退出

我们看一下测试截图:

  1. 左边: aaa 登陆
  2. 右边: bbb 登陆
  3. 左边: aaa 收到 bbb登陆欢迎消息
  4. aaa 和 bbb 实现对话
  5. 右边: bbb 刷新浏览自动退出
  6. 左边: aaa 收到 bbb的退出消息
  7. 右边: CCC 登陆
  8. 左边: aaa 收到 CCC 登陆欢迎消息
  9. aaa 和 CCC 实现对话

3. 服务器端实现

我们这里使用socket.io和express3的混合模式,让HTTP请求和WebSocket请求都使用3000端口。

服务器端实现,只有一个核心文件app.js。


//引入程序包
var express = require('express'), path = require('path'), app = express(), server = require('http').createServer(app), io = require('socket.io').listen(server);//设置日志级别
io.set('log level', 1); //WebSocket连接监听
io.on('connection', function (socket) {socket.emit('open');//通知客户端已连接// 打印握手信息// console.log(socket.handshake);// 构造客户端对象var client = {socket:socket,name:false,color:getColor()}// 对message事件的监听socket.on('message', function(msg){var obj = {time:getTime(),color:client.color};// 判断是不是第一次连接,以第一条消息作为用户名if(!client.name){client.name = msg;obj['text']=client.name;obj['author']='System';obj['type']='welcome';console.log(client.name + ' login');//返回欢迎语socket.emit('system',obj);//广播新用户已登陆socket.broadcast.emit('system',obj);}else{//如果不是第一次的连接,正常的聊天消息obj['text']=msg;obj['author']=client.name;      obj['type']='message';console.log(client.name + ' say: ' + msg);// 返回消息(可以省略)socket.emit('message',obj);// 广播向其他用户发消息socket.broadcast.emit('message',obj);}});//监听出退事件socket.on('disconnect', function () {  var obj = {time:getTime(),color:client.color,author:'System',text:client.name,type:'disconnect'};// 广播用户已退出socket.broadcast.emit('system',obj);console.log(client.name + 'Disconnect');});});//express基本配置
app.configure(function(){app.set('port', process.env.PORT || 3000);app.set('views', __dirname + '/views');app.use(express.favicon());app.use(express.logger('dev'));app.use(express.bodyParser());app.use(express.methodOverride());app.use(app.router);app.use(express.static(path.join(__dirname, 'public')));
});app.configure('development', function(){app.use(express.errorHandler());
});// 指定webscoket的客户端的html文件
app.get('/', function(req, res){res.sendfile('views/chat.html');
});server.listen(app.get('port'), function(){console.log("Express server listening on port " + app.get('port'));
});var getTime=function(){var date = new Date();return date.getHours()+":"+date.getMinutes()+":"+date.getSeconds();
}var getColor=function(){var colors = ['aliceblue','antiquewhite','aqua','aquamarine','pink','red','green','orange','blue','blueviolet','brown','burlywood','cadetblue'];return colors[Math.round(Math.random() * 10000 % colors.length)];
}

4. 客户端实现

这里我们需要定义几个文件:chat.html, chat.js, jquery.min.js, main.css

1). views/chat.html


<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Socket.io - Simple chat</title>
<link rel="stylesheet" type="text/css" href="css/main.css">
<script src="javascripts/jquery.min.js"></script>
<script src="/socket.io/socket.io.js"></script>
<script src="javascripts/chat.js"></script>
</head>
<body>
<h1>Socket.io - Simple chat room</h1>
<div>
<span id="status">Connecting...</span>
<input type="text" id="input"/>
</div>
<div id="content"></div>
</body>
</html>

2). public/javascript/chat.js


$(function () {
var content = $('#content');
var status = $('#status');
var input = $('#input');
var myName = false;//建立websocket连接
socket = io.connect('http://localhost:3000');
//收到server的连接确认
socket.on('open',function(){
status.text('Choose a name:');
});//监听system事件,判断welcome或者disconnect,打印系统消息信息
socket.on('system',function(json){
var p = '';
if (json.type === 'welcome'){
if(myName==json.text) status.text(myName + ': ').css('color', json.color);
p = '<p style="background:'+json.color+'">system @ '+ json.time+ ' : Welcome ' + json.text +'</p>';
}else if(json.type == 'disconnect'){
p = '<p style="background:'+json.color+'">system @ '+ json.time+ ' : Bye ' + json.text +'</p>';
}
content.prepend(p);
});//监听message事件,打印消息信息
socket.on('message',function(json){
var p = '<p><span style="color:'+json.color+';">' + json.author+'</span> @ '+ json.time+ ' : '+json.text+'</p>';
content.prepend(p);
});//通过“回车”提交聊天信息
input.keydown(function(e) {
if (e.keyCode === 13) {
var msg = $(this).val();
if (!msg) return;
socket.send(msg);
$(this).val('');
if (myName === false) {
myName = msg;
}
}
});
});

3). public/javascript/jquery.min.js
从jquery官方下载: http://jquery.com/

4). public/css/main.css


* {padding:0px; margin:0px;}
body{font-family:tahoma; font-size:12px;margin:10px;}
p {line-height:18px;padding:2px;}
div {width:500px;}
#content { padding:5px; background:#ddd; border-radius:5px;border:1px solid #CCC; margin-top:10px;
}
#input { border-radius:2px; border:1px solid #ccc;margin-top:10px; padding:5px; width:380px;
}
#status { width:100px; display:block; float:left; margin-top:15px;
}

5. 完整案例代码

项目已经上传到github: https://github.com/bsspirit/chat-websocket

下载,安装,启动服务器


git clone https://github.com/bsspirit/chat-websocket.git
npm install
node app.js

打开浏览器
可以多打开几个窗口,模拟不同用户有的对话。

http://localhost:3000

做完实验,感觉棒极了。技术创新的革命!!

转载出处:http://blog.fens.me/nodejs-socketio-chat/

Nodejs实时通讯 在线聊天室(Socket.io)_收藏相关推荐

  1. AgileEAS.NET SOA 中间件平台.Net Socket通信框架-完整应用例子-在线聊天室系统-代码解析...

    一.AgileEAS.NET SOA中间件Socket/Tcp框架介绍 在文章AgileEAS.NET SOA 中间件平台.Net Socket通信框架-介绍一文之中我们对AgileEAS.NET S ...

  2. JAVA利用多线程和Socket制作GUI界面的在线聊天室

    目录 前言 功能设计 GUI画面展示 服务器端 客户端 私聊窗口 主要代码 服务器端 客户端 其它代码 打包成jar 打包成exe文件 如何让其它电脑访问聊天室? 最后 前言 最近刚好是期末,碰上Ja ...

  3. 可以发送图片文件的php聊天室,基于 Swoole 开发实时在线聊天室(十四):发送图片消息...

    基于 Swoole 开发实时在线聊天室(十四):发送图片消息 由 学院君 创建于1年前, 最后更新于 1年前 版本号 #1 2055 views 0 likes 0 collects 上篇教程我们演示 ...

  4. Unity联网之使用Socket简单实现多人在线聊天室(一)

    「前言」 之前在一直在写lua联网等一些知识,虽然lua重要,但C#联网也必不可少是吧.所以呢,本篇博客就主要介绍如何使用Unity和C#在实现多人在线聊天室. 服务器 客户端工作原理:(通过消息类型 ...

  5. Java+Springboot+Websocket在线聊天室

    1.什么是websocket? websocket是由HTML5定义了WebSocket协议,能更好的节省服务器资源和带宽,并且能够更实时地进行通讯.它是一种在单个TCP连接上进行全双工通信的协议.W ...

  6. WebSocket创建局域网在线聊天室

    WebSocket的简要介绍: WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议. WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服 ...

  7. Java网络编程,使用Java实现UDP和TCP网络通信协议,以及基于UDP的在线聊天室。

    文章目录 前言 一.网络编程概念 1.网络 2. 网络编程的目的 3.想要达到这个效果需要什么 4.网络分层 二.网络编程Java类 1.IP地址:InetAddress 2.端口 3.TCP连接 3 ...

  8. rudesocket如何使用_[WebSocket入门]手把手搭建WebSocket多人在线聊天室(SpringBoot+WebS...

    前言 本文中搭建了一个简易的多人聊天室,使用了WebSocket的基础特性. 源代码来自老外的一篇好文: 本文内容摘要: 初步理解WebSocket的前后端交互逻辑 手把手使用 SpringBoot ...

  9. 云信小课堂|搭建应用级别在线聊天室,7步就够了!

    Vol. 6 从2000年至今,聊天室一直活跃在人们的各种生活场景中,目前广泛运用于超级小班课.互动大班课.连麦开黑.主播 PK 等场景,还具备文本.表情.点赞.撒花等互动方式,架起沟通桥梁的同时,玩 ...

最新文章

  1. 【技术干货】如何进行低功耗设计和开发
  2. linux hadoop测试,快速搭建Hadoop环境并测试mapreduce
  3. 汽车电子专业知识篇(一)-汽车行业质量人必知的41个体系术语
  4. 信息学奥赛C++语言: 趣味整数5(勾股数)
  5. 数据结构 二叉树面试笔试编程题集
  6. 特斯拉CEO马斯克:将离开推特一段时间
  7. Mac平台使用SnapMotion从视频中提取图像
  8. java单元测试模拟输入_java – 单元测试:在定义模拟行为后调用...
  9. ai人工智能将替代人类_人类可以信任AI吗?
  10. python实现 wifi密码 破解-密码字典篇【本篇文章仅供娱乐,请不要做非法用途】
  11. python在线问卷调查系统_GitHub - imze/surveySystem: 问卷调查系统
  12. 在电脑上如何快速制作一寸照片?在线一键制作工具推荐给你
  13. 北京邮电大学计算机考研难,北京邮电大学(专业学位)计算机技术考研难吗
  14. 2022款联想拯救者R7000P和联想小新Pro16 选哪个好
  15. 【修改el-menu主菜单和子菜单悬浮的背景色】
  16. 计算机垃圾回收站内容怎么恢复,回收站的文件怎么恢复_回收站文件清空了怎么恢复-win7之家...
  17. java 里面matches什么意思_java中的matches()方法
  18. 编码时,不要让字母和数字产生混淆,影响开发判断
  19. 求数学系或计算机系姓张的学生的信息,实验二数据库的简单查询和连接查询.docx...
  20. Unity3D 之 打砖块(一)

热门文章

  1. 笔试题--你准备好了吗
  2. Q105:PC双系统:Windows 7下硬盘安装Ubuntu 16.04
  3. 常见数据分析误区有哪些
  4. 机器学习初级入门(二)KNN
  5. Typescript 类型的常用知识与技能
  6. 基于matlab模糊pid控制系统,基于MATLAB的模糊自适应PID控制器的设计
  7. oracle 10g ocp 047解析(精简版),ORACLE 10G OCP 043 笔记
  8. python版本控制git_实验一:Git代码版本管理
  9. AcWing 9. 分组背包问题(分组背包模板)
  10. 加入HA后的完全分布式集群搭建