socket.io入门,简易聊天室

介绍

通常我们web使用的是http协议,但是 HTTP 协议有一个缺陷:通信只能由客户端发起。

所以我们需要一个可以由服务端主动发出的协议,即WebSocket。

WebSocket是HTML5新增的一种通信协议,其特点是服务端可以主动向客户端推送信息,客户端也可以主动向服务端发送信息,是真正的双向平等对话,属于服务器推送技术的一种。

Socket.IO 是一个基于 Node.js 的实时应用程序框架,在即时通讯、通知与消息推送,实时分析等场景中有较为广泛的应用。

socket.io 包含两个部分:

  • 服务器端(server):运行在 Node.js 服务器上
  • 客户端(client):运行在浏览器中

开启服务

当然,socket.IO构架在一个nodejs服务上,这里开启一个express服务。

创建文件夹socketIODemo,然后安装

    npm init -y
    npm install express --save

之后在socketIO中创建文件index.js:

    const express = require('express')
    const app = express()

    app.use(express.static(__dirname + '/public'));

    app.listen(3000, () => console.log('Example app listening on port 3000!'))

创建静态资源public/index.html :

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Document</title>
        <style>
            * {
                margin: 0;
                padding: 0;
            }
            html,
            body {
                height: 100%;
                overflow: hidden;
            }
            .chat {
                float: left;
                padding: 1em 1em 0 2em;
                height: 100%;
                width: 500px;
                border-right: 1px solid #DA4;
                overflow-y: scroll;
            }
            .inputpart {
                float: left;
                margin-left: 10px;
            }
            #userName {
                font-size: 20px;
                color: rgb(3, 57, 109);
            }
        </style>
    </head>
    <body>
        <div class="chat">
            <ul id="messages">
                //聊天信息
            </ul>
        </div>
        <div class="inputpart">
            <div id="userName">
                //用来展示用户id
            </div>
            <form action="">
                <input autocomplete="off" id="inpB" /><button id="say">Send</button>
            </form>
        </div>
    </body>
    </html>

此时开启服务: node index, 访问localhost:3000。

服务开启!

使用socket.IO

安装:

    npm install socket.io --save

然后在index.js中注册socket.io,并改为http监听:

    let http = require('http').Server(app)
    const io = require('socket.io')(http)
    app.use(express.static(__dirname + '/public'));

    http.listen(3000, () => console.log('Example app listening on port 3000!'))

此时服务已改为WebSocket服务。

数据传输

服务端运行后会在根目录动态生成socket.io的客户端js文件,客户端可以通过固定路径/socket.io/socket.io.js添加引用。
在HTML中引用js文件,并调用:

        <script src="/socket.io/socket.io.js"></script>
        <script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
        <script>
            $(function () {
                var userName = '';
                while ($('#userName').text().trim() === '') {
                    //设置用户名
                    let promptName = prompt("请设置你的昵称", "")
                    userName = promptName ? promptName + ':' : '未命名:';
                    $('#userName').text(userName);
                }
                let socket = io();
                socket.on('connect', function () {
                    socket.emit('join', userName)
                })
                // 监听系统消息
                socket.on('sys', function (sysMsg) {
                    var message = '<div class="sysMsg">' + sysMsg + '</div>';
                    $('#messages').append(message);
                });
            })
        </script>

这段代码中,socket.on(‘connect‘, function () { })为默认监听事件,socket.io 提供了默认事件(如:connect, message, disconnect)。也可以自定义。socket.emit(‘action‘);表示发送了一个action命令,命令是字符串的。

后台index.js文件中:

    io.on('connection', function (socket) {
        console.log('a user connected')
        let userID = ''
        socket.on('join', function (userName) {
            userID = userName;
            io.emit('sys', userID + '已加入房间');
            console.log(userID + '加入了');
        });
    })

connection事件在客户端成功连接到服务端时触发,有了这个事件,我们可以随时掌握用户连接到服务端的信息。
当客户端成功建立连接时,在connection事件的回调函数中,我们还是可以为socket注册一些常用的事件,如:disconnect事件socket.on(‘disconnect‘,function(){...});,它在客户端连接断开是触发,这时候我就知道用户已经离开了。

重启服务,打开多个窗口,查看聊天框内容:

下面添加聊天功能。

在HTML文件中添加事件监听click:

      $('#say').click((e) => {
          e.preventDefault()
          socket.send($("#inpB")[0].value)
          $("#inpB")[0].value = ''
      })
      socket.on('msg', function (userName, userColor, msg) {
          var message = ' <div class="message">' +
              `<span class="user" style="font-size:1.5em; color: #${userColor}">` +                  userName + '</span>' +
              '  <span class="msg">' + msg + '</span>' +
              '</div>';
          $('#messages').append(message);
          // 滚动条保持最下方
          $('#messages').scrollTop($('#messages')[0].scrollHeight);
      });

这段代码中,首先监听事件并将input中内容send回去;socket.on为自定义事件msg 用来接收后台发送来的其他人的发言。

socket.emit和socket.send的区别在stackoverflow中有一个解释大意是说emit可以自定义事件,而send不可以,且只能以message接收。

后台index.js:

    io.on('connection', function (socket) {
        console.log('a user connected')
        let userID = '', userColor =parseInt(Math.random() * 16777216).toString(16)

        socket.on('join', function (userName) {
            userID = userName;
            io.emit('sys', userID + '已加入房间');
            console.log(userID + '加入了');
        });
        socket.on('message', function (msg){
            io.emit('msg', userID, userColor, msg)
        })
    })

为新的成员随机匹配颜色,并将message监听到的信息通过自定义为msg的事件emit出去。

此时,一个简易聊天室已经完成。

读者可以自行添加退出功能,或者设置多个房间。。。

参考代码

原文地址:https://www.cnblogs.com/coldant/p/10437220.html

时间: 2024-10-09 20:48:44

socket.io入门,简易聊天室的相关文章

Socket编程(简易聊天室客户端/服务器编写、CocoaAsyncSocket)

Socket编程(简易聊天室客户端/服务器编写.CocoaAsyncSocket) 一.Socket 1.1 Socket简介 Socket就是为网络服务提供的一种机制.网络通信其实就是Socket间的通信,通信的两端都是Socket,数据在两个Socket间通过IO传输. 在Web服务大行其道的今天,调用Web服务的代价是高昂的,尤其是仅仅是抓取少量数据的时候尤其如此.而使用Socket,可以只传送数据本身而不用进行XML封装,大大降低数据传输的开销.Socket允许使用长连接,允许应用程序运

node+express+socket.io制作一个聊天室功能

首先是下载包: npm install express npm install socket.io 建立文件: 服务器端代码:server.js 1 var http=require("http"); 2 var express=require("express"); 3 var sio=require("socket.io"); 4 5 var app=express(); 6 app.use(express.static(__dirname+

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

最近的计算机网络课上老师开始讲socket,tcp相关的知识,当时脑袋里就蹦出一个想法,那就是打造一个聊天室.实现方式也挺多的,常见的可以用C++或者Java进行socket编程来构建这么一个聊天室.当然,我毫不犹豫选择了node来写,node有一个名叫socket.io的框架已经很完善的封装了socket相关API,所以无论是学习还是使用都是非常容易上手的,在这里强烈推荐!demo已经做好并放到我的个人网站了,大家可以试试,挺好玩的. 进去试试 ->   http://www.yinxiang

基于C/S模式的简易聊天室

一.任务简要描述 移动互联网技术的广泛应用为人们提供了非常便捷的沟通方式.QQ.微信和微博等是便携式聊天系统的典型代表,它们的功能非常强大. 本系统利用TCP/IP协议的Socket和ServerSocket类,实现基于C/S模式的简易聊天室.该聊天室包括服务端和客户端两部分,服务端是客户端发送消息的中转站:客户端之间可以直接通信,也可以与服务器通信.聊天结束后客户端断开与服务端的连接,服务器也可以停止信息中转服务. 二.系统需求分析 本系统采用C/S软件架构,服务器端负责监听客户端发来的消息,

php+websocket搭建简易聊天室实践

1.前言 公司游戏里面有个简单的聊天室,了解了之后才知道是node+websocket做的,想想php也来做个简单的聊天室.于是搜集各种资料看文档.找实例自己也写了个简单的聊天室. http连接分为短连接和长连接.短连接一般可以用ajax实现,长连接就是websocket.短连接实现起来比较简单,但是太过于消耗资源.websocket高效不过兼容存在点问题.websocket是html5的资源 如果想要详细了解websocket长连接的原理请看https://www.zhihu.com/ques

docker搭建swoole简易聊天室

docker搭建swoole的简易聊天室 首先pull镜像 docker pull docker.io/kong36088/nginx-php7-swoole 创建容器 docker run --name {自己创建的名字} -p 9501:9501 -p 8089:80 -d -it kong36088/nginx-php7-swoole /bin/bash 进入容器 docker exec -it {容器名字或id} /bin/bash 进入容器之后进入nginx配置文件 cd /etc/n

php_3_“简易聊天室 ”实现的关键技术 详解

                  PHP+MySQL实现Internet上一个简易聊天室的关键技术  系统目标: 聊天室使用数据库汇集每个人的发言,并可将数据库内的发言信息显示在页面,让每个用户都可以看到,具体功能如下: a.用户登录:用户发言时显示其登录名信息 b.用户发言:用户输入说的话 c.显示发言信息:用户浏览所有发言信息 设计思路: (1).建立聊天室数据库及相关数据表 (2).实现用户登录页面(login.php) (3).实现发言页面(speak.php) (4).实现发言显示页

[Redis]-Redis简易聊天室

代码来自图书<左手MongoDB,右手Redis>第六章-简易聊天室 1.下载代码 2.安装部署py运行环境 yum install python3 -y yum install python-virtualenv -y pip install pipenv pip install --upgrade pip 3.运行代码 cd /RedisChat/ pipenv install export FLASK_APP=main.py flask run -h 10.0.0.51 -p 5000

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

vue + vuex + elementUi + socket.io实现一个简易的在线聊天室,提高自己在对vue系列在项目中应用的深度.因为学会一个库或者框架容易,但要结合项目使用一个库或框架就不是那么容易了.功能虽然不多,但还是有收获.设计和实现思路较为拙劣,恳请各位大大指正. 可以达到的需求 能查看在线用户列表 能发送和接受消息 使用到的框架和库 socket.io做为实时通讯基础 vuex/vue:客户端Ui层使用 Element-ui:客户端Ui组件 类文件关系图 服务端: 客户端: 服