使用 Socket.IO 开发聊天室

前言

Socket.IO 是一个用来实现实时双向通信的框架,其本质是基于 WebSocket 技术。

我们首先来聊聊 WebSocket 技术,先设想这么一个场景:

· 用户小A,打开了某个网站的充值界面,该界面上有一个付款的二维码。

· 当小A 用某宝的 APP 扫码付款之后,网页要自动跳转到付款成功的界面。最简单的方法就是网页每隔一段时间就请求一次服务器——“怎么样?那货付款没有?”,“怎么样?还没付吗?”,“怎么样?这次总该付了吧”。

· 当接收到服务端返回确认付款的标识后,页面再进行跳转。

这种定时对服务端发送 HTTP 请求的技术也被称为“轮询”。轮询的缺点也显而易见,短时间内的多次访问无疑会对服务器造成很大压力。

  后来,人们发明了长轮询技术。这与短轮询的区别在于,每次浏览器请求服务器后,服务器并不会立即返回“用户还未付款”的结果,而是一直将 HTTP 保持在挂起状态,只有当用户付款后才会返回给浏览器 “用户已经付款” 的结果。当然,如果用户在规定时间内仍未付款还是会断开此次连接,之后浏览器再开始发送下一轮的长连接。相比短轮询,长轮询有了一定的优势,但这还是不够好。直到 HTML5 里 WebSocket 技术的诞生。

  WebSocket,即 Web 浏览器与 Web 服务器之间的全双工通信标准。最初 WebSocket 只是作为 HTML5 标准的一部分,而后来却逐渐变成了独立的协议标准。一旦浏览器与服务器建立起 WebSocket 协议的通信连接,之后所有的通信都依靠该协议进行。不论是服务器还是浏览器,任何一方都能向对方发送报文。通信过程中可相互发送 JSON、HTML或图片等任意格式的数据。

  关于 WebSocket 的原生 API 如何使用,本文不赘述了。 这里主要聊聊关于 Socket.IO 这个库的使用方式。Socket.IO 与 ws 等其他基于 WebSocket 通信的库相比,它的好处在于,当浏览器支持 WebSocket 技术时它能正常使用 WebSocket 来工作,当浏览器不支持 WebSocket 时,它能平稳退化成轮询进行工作。

首先放出自己做的聊天室 DEMO 源码,将源码克隆到本地,执行下面两个命令:

npm install
npm start

接着用浏览器访问 localhost:8000 即可,实际界面如下图:

     

Socket.IO 在客户端与服务端二者均有一套 API,我们举几个常用的进行说明。

服务端

new Server

因为 WebSocket 协议是建立在 HTTP 协议之上的,所以在创建 WebSocket 服务时需要调用 http 模块并调用其下的 createServer 方法,将生成的 server 作为参数传入 socket.io 的方法中。

var server = require(‘http‘).createServer(),
    io = require(‘socket.io‘)(server);

server.listen(8000);

io.onconnection(socket)

io 的 connection 事件表示客户端与服务器成功建立连接,它会接收一个回调函数,该回调函数会接收一个 socket 参数。

io.on(‘connection‘, (socket) => {
    console.log(socket);
});

io.emit(EventName, param1, param2...)

io.emit 方法用于向服务器发送消息,其第一个参数表示自定义的数据名,后面表示需要配合事件传入的参数。

io.on(‘connection‘, (socket) => {
    io.emit(‘server message‘, {msg: ‘Hello World.‘})
});

socket.on(EventName, callback)

socket.on 方法用于接收客户端发送来的消息,EventName 参数为客户端自定义的事件名,callback 为回调函数,回调函数接收的参数即客户端传递来的参数。

io.on(‘connection‘, (socket) => {
    socket.on(‘client message‘, (data) => {
        console.log(data);
    });
});

socket.broadcast.emit() 

socket.broadcast.emit() 方法表示向除了自己以外的客户端发送消息。举个例子,当我们输入 “Message” 点击发送,只需要将 “Message” 通过服务器发送给其他客户端用于显示,而本地只需要将 “Message” 通过 js 代码添加进聊天窗口即可,而不需要经过服务器。

io.on(‘connection‘, (socket) => {
    socket.broadcast.emit(‘server message‘, {
        msg: ‘Hello World.‘
    });
});

socket.ondisconnect

socket 的 disconnect 事件表示客户端与服务端断开连接。

io.on(‘connection‘, (socket) => {
    socket.on(‘disconnect‘, () => {
        console.log(‘连接已断开...‘);
    });
});

客户端

首先需要引入 socket.io 模块中的 socket.io.js 文件。

<!Doctype HTML>
<html>
<head>
    <title>Socket.IO chat</title>
    <script src="/socket.io/socket.io.js"></script>
</head>
</html>

引入成功后,就可能通过 io() 生成客户端所用的 socket 对象。

var socket = io();

socket.emit(EventName, param1, param2, .....)

socket.emit 方法用于客户端向服务端发送消息,服务端与之对应的是 socket.on 方法来接收消息。

//客户端
var socket = io();
socket.emit(‘client message‘, {
    msg: ‘Hello Server‘
});

//服务端
io.on(‘connection‘, (socket) => {
    socket.on(‘client message‘, (data) => {
        console.log(data.msg); // Hello Server
    });
});

socket.on(EventName)

socket.on 方法用于接收服务端发来的消息

//服务端
io.on(‘connection‘, (socket) => {
    io.emit(‘server message‘, {
        msg: ‘Hello Client‘
    });
});

//客户端
var socket = io();
socket.on(‘server message‘, (data) => {
    console.log(data.msg); // Hello Client
});

介绍完 Socket.IO 的 API,下面开始尝试写聊天室的 DEMO。

首先创建目录如下:

其中 server.js 中保存着服务端的代码,client 文件夹中保存着客户端代码,包括 HTML、CSS、JS、图片等。

编写 server.js 如下:

var express = require(‘express‘),
    app = express(),
    server = require(‘http‘).createServer(app),
    io = require(‘socket.io‘)(server),
    port = process.env.PORT || 8000;
//通过 express 加载前端部分的静态资源文件
app.use(express.static(__dirname + ‘/client‘));

io.on(‘connection‘, (socket) => {   //通过 socket.id 创建简易的用户名
    let user = ‘游客‘ + socket.id.substring(0, 6);

    //通知用户进入
    io.local.emit(‘user conncet‘, user + ‘进入聊天室‘);

    //接收从客户端发送来的消息,拼上消息发布者的名字后,广播给其他客户端
    socket.on(‘client message‘, (data) => {
        data.author = user;

        //将消息广播给除自己以外的客户端
        socket.broadcast.emit(‘server message‘, data);
    });

    //通知用户离开
    socket.on(‘disconnect‘, () => {
        io.local.emit(‘user disconnect‘, user + ‘离开聊天室‘);
    });
});

server.listen(port, () => {
    console.log(‘listening on %d...‘, port);
});

前端部分代码省略,这里只简单写一个发送消息的方法,具体的代码请参考 DEMO 源码

var socket = io();

function sendMsg() {
    var message = document.querySelector(‘#input‘);

    socket.emit(‘client message‘, {
        text: message,
        time: new Date()
    });

    document.querySelector(‘#content‘).innerHTML += ‘<div class="msgList">‘+message+‘</div>‘;
}

如上,当运行 server.js 文件后,在浏览器地址栏中输入 localhost:8000 就可以看到聊天室的界面了。 这样我们就完成了一个简易的聊天室,它包括如下功能:

· 发送/接收消息

· 通知用户进入/离开

· 为进入聊天室的用户命名,名称唯一

有兴趣的朋友还可以尝试自行完成如下功能:

· 用户登陆

· 查看所有在线用户

· @ 功能

···

感觉你的浏览,希望能有所帮助。

时间: 2024-10-03 23:15:37

使用 Socket.IO 开发聊天室的相关文章

nodejs 基于socket.io实现聊天室

由于之后要做的网页视频直播项目要用到socket.io模块,所以特地花时间研究了下,参照网上的代码做了些改进,自己写了个聊天室代码.不得不承认后端事实推送能力有点厉害,这是以前我用php一直苦恼的事情.下面简单介绍下我的项目,顺带讲解下nodejs. 事实上,在看别人写的代码之前,我一直不知道nodejs是干嘛的,直到真正接触到才明白这也可以算作是服务端代码,丰富的第三方库使其功能极其强大.它可以像golang的beego一样直接通过命令行开启服务器,不过要用到express模块.加载模块的方式

Socket.io在线聊天室

从零开始nodejs系列文章,将介绍如何利Javascript做为服务端脚本,通过Nodejs框架web开发.Nodejs框架是基于V8的引擎,是目前速度最快的Javascript引擎.chrome浏览器就基于V8,同时打开20-30个网页都很流畅.Nodejs标准的web开发框架Express,可以帮助我们迅速建立web站点,比起PHP的开发效率更高,而且学习曲线更低.非常适合小型网站,个性化网站,我们自己的Geek网站!! 关于作者 张丹(Conan), 程序员Java,R,PHP,Java

Node.js+socket.io在线聊天室

Node.js+socket.io实现在线聊天室,照着这个教程做的,稍加改动即可实现. Node.js:0.10.31 Express:3.* 创建工程chat: 添加几个文件,工程结构如下 代码: package.json: { "name": "application-name", "version": "0.0.1", "private": true, "scripts": { &

node.js + socket.io实现聊天室一

前段时间,公司打算在社区做一个聊天室.决定让我来做.本小白第一次做聊天类功能,当时还想着通过ajax请求来实现.经过经理提示,说试试当前流行的node.js 和socket.io来做.于是就上网学习研究起来. 首先,先看一下node.js.本小白当时还以为是一个什么js的框架或者类库.结果才知道,原来完全不是那么回事. node.js 诞生于2009年,是一种轻量级的web服务.如果查看node.js的官网,真的非常简答,简短的几行代码,就搭建了一个web服务. var http = requi

基于Socket的Android聊天室

1        基于Socket的Android聊天室 Socket通信是网络通信中最常用的技术之一,通过Socket建立的可靠连接,可以让多个终端与服务器保持通信,最典型的应用是建立一个多人聊天程序.本实例使用ServerSocket建立聊天服务器.将服务器端所有的通讯线程保存到一个集合当中,当有用户发来数据,则转发给所有用户,实现聊天室效果.Android端通过使用Socket建立客户端链接,并且在AsyncTask中执行网络读写的任务,将用户输入的内容发送到服务器,并接收服务器发来的数据

java socket控制台版本聊天室程序源码下载

原文:java socket控制台版本聊天室程序源码下载 代码下载地址:http://www.zuidaima.com/share/1550463257578496.htm java socket控制台版本聊天室程序源码下载,学习的时候写的,适合学习java基础 java网络编程基础用 标签: java socket 控制台 聊天室 源码话题: 网络编程 java socket控制台版本聊天室程序源码下载,布布扣,bubuko.com

我的学习笔记之node----node.js+socket.io实时聊天(2)

废话不多说,直接贴代码吧.注释很详细了. 服务端代码: /** * Created by LZX on 2015/10/7. */(function () { var d = document, w = window, p = parseInt, dd = d.documentElement, db = d.body, dc = d.compatMode == 'CSS1Compat', dx = dc ? dd: db, ec = encodeURIComponent; window.CHAT

【总结】学习Socket编写的聊天室小程序

1.前言 在学习Socket之前,先来学习点网络相关的知识吧,自己学习过程中的一些总结,Socket是一门很高深的学问,本文只是Socket一些最基础的东西,大神请自觉绕路. 传输协议 TCP:Transmission Control Protocol 传输控制协议TCP是一种面向连接(连接导向)的.可靠的.基于字节流的运输层(Transport layer)通信协议. 特点: 面向连接的协议,数据传输必须要建立连接,所以在TCP中需要连接时间. 传输数据大小限制,一旦连接建立,双方可以按统一的

使用socket实现简单聊天室

通过socket实现简单的聊天室 1.服务端代码:serverselect.py #!/usr/bin/env python #coding:utf8 import socket import select class SelectServer(object): def __init__(self,host,port,backlog): self.host = host self.prot = port self.address = (host,port) self.backlog = back