用NodeJs使用Io做一个聊天室

功能分析
我们要做一个聊天室,简单起见,就不做私聊的功能了,那么我们想要的功能可以是这些:
  1. 每个人有自己的昵称,在进入聊天室的时候自己输入。
  2. 每个人都可以发言
  3. 有一个区域用来展示所有的发言,并且要实时更新
  4. 有人加入的时候提示xxx加入了群聊
 
第一步,初始设定
 
1,在window安装nodejs,这一步省。
 
2,检查环境及安装
 
npm config ls    //修改文件夹名
 
npm install express  //安装express框架
 
npm install socket 
 
在E:\node_IM\development\node-chat当前目录,多出一个node_modules目录。
 
E:.
└─node-chat
    └─node_modules
        ├─express
        │  ├─lib
        │  │  ├─middleware
        │  │  └─router
        │  └─node_modules
        │      ├─.bin
        │      ├─accepts
        │      ├─array-flatten
        │      ├─body-parser
        │      │  └─lib
        │      │      └─types
        │      ├─bytes
        │      ├─content-disposition
        │      ├─content-type
        │      ├─cookie
        │      ├─cookie-signature
                ......    
        ├─socket.io
 
 
新建server.js文件在node-chat目录。
 
c0e613571467394281abf3c989bbca5e4bf.jpg
 
3,在vscode环境调试运行:
 
Administrator@7O1CMG3I79XXOLV MINGW64 /e/node_IM/development/node-chat
$ node server.js
listening on *:8080
 
 
f96f39688ea8d5dbdc95db27e1116291e38.jpg
 
 
第二步,聊天室页面的实现
1,在index.html中输入以下代码:
<!doctype html>
    <html>
    <head>
        <title>Socket.IO chat</title>
        <style>
            * {
                margin: 0;
                padding: 0;
                box-sizing: border-box;
            }
            body {
                font: 13px Helvetica, Arial;
            }
            form {
                background: #000;
                padding: 3px;
                position: fixed;
                bottom: 0;
                width: 100%;
            }
            form input {
                border: 0;
                padding: 10px;
                width: 90%;
                margin-right: .5%;
            }
            form button {
                width: 9%;
                background: rgb(130, 224, 255);
                border: none;
                padding: 10px;
            }
            #messages {
                list - style - type: none;
                margin: 0;
                padding: 0;
            }
            #messages li {
                padding: 5px 10px;
            }
            #messages li:nth-child(odd) {
                background: #eee;
            }
        </style>
      
        <script src="http://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
        
    </head>
    <body>
        <ul id="messages"></ul>
        <form action="">
            <input id="m" autocomplete="off" /><button>发送</button>
        </form>
    </body>
    </html>
 
 
保存。

2,根目录跳转

前面我们在server.js中写了根目录返回hello world,现在我们让它跳转到聊天室页面。将server.js中的
//当访问根目录时,返回Hello World
app.get('/', function (req, res) {
   res.send('<h1>Hello world</h1>');
});
替换为
app.get('/', function(req, res){
   res.sendFile(__dirname + '/index.html');  
});
然后在CMD中ctrl+c结束,重新运行node server.js。
现在在浏览器中访问localhost:8080,已经跳转到聊天页面了。
 

第三,引入Socket

1,继续修改server.js,增加下方标注内容:
var express = require('express');
var app = express();
var http = require('http').Server(app); //将express注册到http中
var io = require('socket.io')(http);
//当访问根目录时,返回Hello World
app.get('/', function (req, res) {
    res.sendFile(__dirname+"/index.html");
});
 
var usocket = [];
io.on('connection',function(socket){
    console.log('a user connect');    //当有新的socket连接成功之后,就打印一下信息。
});
 
//启动监听,监听3000端口
http.listen(8080, function () {
    console.log('listening on *:8080');
});
 
 
2,然后编辑index.html,添加jquery.min.js和socket.io.js
<script src="http://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
<script src="/socket.io/socket.io.js"></script>
 
然后我们重新启动node服务,访问localhost:3000。就会有以下结果。
 
 
第三,添加交互
       当用户有动作的时候,我们要显示在聊天面板中,就插入一个li标签好了。在index.html的script中写一个方法,后面显示什么内容,就调用这个方法在面模板中插入一条li就好了。在前面功能分析的时候,我们就说用户刚进来的时候,需要输入自己的昵称。
将以下代码写到index.html中。
var name = prompt("请输入你的昵称:");
function addLine(msg) {
        $('#messages').append($('<li>').text(msg));
}

1,发送昵称数据到后端

       新用户发送自己的昵称给服务器后,要让所有处在聊天室的人知道,所以服务器要发一个广播。发送数据给后端,调用socket的emit方法,这里指定一个事件名字叫join,然后后端会处理这个事件。
然后现在我们的script标签中是这样的。
<script>
    var name   = prompt("请输入你的昵称:");
    var socket = io()
    //发送昵称给后端
    socket.emit("join", name)
    function addLine(msg) {
        $('#messages').append($('<li>').text(msg));
    }
</script>

 

2,后端发送广播

       为了在后端区分用户,我们用一个usocket数组来保存每一个用户的socket实例。
首先监听join事件,在接收到昵称之后,将该用户的加入聊广播给所有用户。
server.js代码如下:
var express = require('express');
var app = express();
var http = require('http').Server(app); //将express注册到http中
var io = require('socket.io')(http);
 
//当访问根目录时,返回Hello World
app.get('/', function (req, res) {
    res.sendFile(__dirname+"/index.html");
});
 
var usocket = [];  //全局变量
io.on('connection',function(socket){ //
    console.log('a user connect');
     //监听join事件
    socket.on("join", function (name) {
        usocket[name] = socket;
        console.log(usocket);
        io.emit("join", name) //服务器通过广播将新用户发送给全体群聊成员
    })
    //new addition
    socket.on("message", function (msg) {
        io.emit("message", msg) //将新消息广播出去
    })
});
 
//启动监听,监听3000端口
http.listen(8080, function () {
    console.log('listening on *:8080');
});

然后在index.html的script中添加以下代码,接受到新用户加入事件的处理:
<script>
        var name = prompt("请输入你的昵称:");
        function addLine(msg) {
            $('#messages').append($('<li>').text(msg));
        }
 
        var socket = io();
         //发送昵称给后端
        socket.emit("join", name)
 
        //收到服务器发来的join事件时
            socket.on("join", function (user) {
                addLine(user + " 加入了群聊")
            })
 
        //接收到服务器发来的message事件
        socket.on("message", function (msg) {
                addLine(msg)
            })
 
       //当发送按钮被点击时
        $('form').submit(function () {
            var msg = $("#m").val() //获取用户的信息
            socket.emit("message", '('+ name+'):'+msg) //将消息发送给服务器
            $("#m").val("")
            return false; //阻止form提交
        })
</script>
 
现在我们再来测试一下,node server.js开启后端服务,然后访问localhost:8080,输入用户名iimT
 
演示效果:
54e3b0aa9cce0328b8c52eed1be362fa95c.jpg
 
 
 
 
 
 
 
 
 
 
 
 

转载于:https://my.oschina.net/7795442/blog/3017182

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值