博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Node.js和Socket.IO搭建Web Chat application
阅读量:6757 次
发布时间:2019-06-26

本文共 3081 字,大约阅读时间需要 10 分钟。

WebSocket与Socket.IO

WebSocket是一种协议,有了它就可以在TCP协议的基础上在浏览器和服务器之间建立起了一种全双工的通道,它完全兼容HTTP协议,有了它使得Web应用程序可以在浏览器和服务器之间进行实时的交互,现在主流浏览器都支持这种协议。


Socket.IO是JavaScript library,是Node.js的module,它可以建立起一个基于事件的实时的双向交流方式,极大的简化了WebSocket的处理过程。在这个Chat application中将会用到它。

开始Chat application

搭建这个应用几乎只需要Node.js和Socket.IO最初级的知识,因为只搭建一个基本的程序。

web 框架

最初的构想是一个简单的HTML页面,由一个表单和消息列表组成,要使用Node.js和express框架,首先确保Node.js已经安装好了。


首先创建项目目录chat-example文件夹,然后在里边创建package.json文件来描述项目信息以及依赖。

{  "name": "socket-chat-example",  "version": "0.0.1",  "description": "my first socket.io app",  "dependencies": {}}

然后到命令行cd到项目目录安装express,npm install --save express

--save参数可以把自动把express添加到package.json的dependencies中。
express安装好后创建一个index.js,来配置应用。

//index.jsvar app = require('express')();var http = require('http').Server(app);app.get('/', function(req, res){  res.send('

Hello world

');});http.listen(3000, function(){ console.log('listening on *:3000');});

上边代码可以这样翻译一下:

  1. Express初始化了一个函数句柄可以应用于HTTP server于第2行

  2. 定义一个路由来访问网站首页

  3. 开启http服务监听3000端口

在命令行中node index.js得到如下结果:

图片描述
到浏览器中访问结果如下:
图片描述

之前我们使用res.send('<h1>Hello world</h1>');来传递html字符串,如果文档内容多了这样做就有点low了,换种方式新建一个index.html文件,访问它就可以了。

首先来重构之前的路由:

app.get('/', function(req, res){res.sendFile(__dirname + '/index.html');});

然后创建index.html

      Socket.IO chat            

    重启服务,到浏览器查看是这个样子:

    图片描述

    把Socket.IO引入

    Socket.IO由2部分组成:

    • 服务端Node.JS HTTP Server: socket.io

    • 浏览器端的js库:socket.io-client

    接下来npm install --save socket.io添加模块

    然后编辑index.js中的内容如下:

    var app = require('express')();var http = require('http').Server(app);var io = require('socket.io')(http);app.get('/', function(req, res){  res.sendFile(__dirname + '/index.html');});io.on('connection', function(socket){  console.log('a user connected');});http.listen(3000, function(){  console.log('listening on *:3000');});

    注意通过把http(the HTTP server)对象传递给socket.io初始化了一个socket.io的实例,然后监听connection事件,并且在控制台中打印出来

    在index.html的</body>之前增加如下几行:

    这就是用来加载socket.io-client的,暴露出一个全局的io,然后connect

    注意我调用io()的时候并没有指定任何的URL,因为它默认就是去当前跑的页面去和server连接
    重启服务,多开几个页面,在控制台中可以看到如下结果:
    图片描述

    每个socket还有一个特殊的disconnect事件:

    io.on('connection', function(socket){  console.log('a user connected');  socket.on('disconnect', function(){    console.log('user disconnected');  });});

    发射事件

    Socket.IO的主要想法就是你能够发射和接收任何你喜欢的事件,任何对象都会被编码成Json,也支持二进制数据


    那接下来就做我们发送信息的时候server接收到chat message事件,index.html中的script部分改写如下:

    在index.js中我们打印出chat message事件

    io.on('connection', function(socket){  socket.on('chat message', function(msg){    console.log('message: ' + msg);  });});

    在浏览器端发射,控制台观察如下:

    图片描述

    广播消息Broadcasting

    接下来的目标是从server发送消息给其余的在线用户,为了能把消息传递给everyone,Socket.IO给我们提供了io.emit

    io.emit('some event', { for: 'everyone' });

    如果你想发消息给everyone,除去一个特定的socket,那就快用broadcast 标志吧

    io.on('connection', function(socket){  socket.broadcast.emit('hi');});

    像下面这样就能把消息发给所有人,包括消息的发送者

    io.on('connection', function(socket){  socket.on('chat message', function(msg){    io.emit('chat message', msg);  });});

    下面到客户端捕获chat message事件,把消息内容插到消息列表中:

    到浏览器多开几个选项卡就可以疯狂的发射和接收消息了,非常实时,短短20几行代码就能实现这样的效果,真是令人发指啊!

    总结

    哈哈,其实这个例子是socket.io官网的小栗子,喜欢学英语的朋友可以去玩一下,那里的video演示很直观,你可以戳这里

    转载地址:http://tzzeo.baihongyu.com/

    你可能感兴趣的文章
    xshell常用命令大全
    查看>>
    Day01_变量,数据类型_程序交互_流程控制
    查看>>
    POJ 3087 Shuffle'm Up 模拟,看着不像搜索啊
    查看>>
    你知道 GNU Binutils 吗?【binutils】
    查看>>
    OC与swift相互调用
    查看>>
    quartus ii 中文注释乱码解决办法
    查看>>
    Linux网卡配置与绑定
    查看>>
    java学习之路--String类方法的应用
    查看>>
    auto,register,static分析
    查看>>
    百度BAE JAVA环境项目部署和调试
    查看>>
    CSS盒模型
    查看>>
    Log4Net 添加自定义字段并保存到数据库
    查看>>
    Redis集群(三)Cluster集群
    查看>>
    NSURLSession
    查看>>
    JFinal学习 & Gradle配置续 & Tomcat配置
    查看>>
    CSS进度条
    查看>>
    android的color值
    查看>>
    对于linux下system()函数的深度理解(整理)
    查看>>
    软件设计和开发准备
    查看>>
    ROS + Kinect2 跑ORB_SLAM2 安装步骤记录
    查看>>