用socket.io实现一个聊天功能

服务端代码如下:

chart.js文件

const http = require('http');

const io = require('socket.io');

let httpServer = http.createServer(function(req, res){

    console.log("http创建成功");

});

httpServer.listen(8080);

let wsServer = io.listen(httpServer);

let sockList = [];

wsServer.on('connection', sock=>{

    sockList.push(sock);

    console.log("连接成功");

    sock.on('login_ret', (name, pass)=>{

        sock.emit('login_ret', {code: '0', user: name, msg: "登录成功"});

    });

    sock.on('reg_ret', (name, pass)=>{

        sock.emit('reg_ret', {code: '0', msg: "注册成功"});

    });

    // 消息通知

    sock.on('message_ret', (text, user)=>{

        sockList.forEach(function(item) {

            item != sock && item.emit("message_ret", {

                code: "0", user: user, msg: text

            });

        });

    });

    // 离线

    sock.on('disconnect', ()=>{

        sockList = sockList.filter(function(item){

            return item != sock;

        });

    });

});

char.html

页面代码如下:

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    <meta http-equiv="X-UA-Compatible" content="ie=edge">

    <title>chart window</title>

    <script src="http://localhost:8080/socket.io/socket.io.js"></script>

</head>

<style>

    .chart_contain {

        width: 100%;

        height: 70%;

        display: none;

    }

    .chart_content {

        width: 100%;

        height: 400px;

        overflow: scroll;

    }

    .left {

        float: left;

        clear: both;

        background-color: chartreuse;

    }

    .right {

        float: right;

        clear: both;

        background-color: white;

    }

    .send_content {

        width: 100%;

        height: 100px;

    }

</style>

<body>

    <form>

        <label for="userName">用户名:</label>

        <input type="text" id="userName" name="userName">

        <br>

        <label for="password">密码:</label>

        <input type="password" id="password" name="password">

        <br>

        <input type="button" id="regBtn" value="注册">

        <input type="button" id="loginBtn" value="登录">

    </form>

    <!-- 聊天界面 -->

    <div class="chart_contain">

        <div class="chart_content">

            <!-- todo -->

        </div>

        <div class="chart_footer">

            <textarea class="send_content"></textarea>

            <button  class="send_btn">发送</button>

        </div>

    </div>

    <script>

        var form = document.getElementsByTagName("form")[0];

        var user = document.getElementById("userName");

        var password = document.getElementById("password");

        var regBtn = document.getElementById("regBtn");

        var loginBtn = document.getElementById("loginBtn");

        var content = document.getElementsByClassName("chart_contain")[0];

        var sendBtn = document.getElementsByClassName("send_btn")[0];

        var text = document.getElementsByClassName("send_content")[0];

        var chart = document.getElementsByClassName("chart_content")[0];

        var userName, password;

        // 链接

        var sock = io.connect("ws://localhost:8080/");

        // 注册请求

        regBtn.onclick = function() {

            var name = user.value;

            var pass = password.value;

            sock.emit("reg_ret", name, pass);

        };

        // 登录请求

        loginBtn.onclick = function() {

            var name = user.value;

            var pass = password.value;

            sock.emit("login_ret", name, pass);

        };


        // 发送消息

        sendBtn.onclick = function() {

            sock.emit("message_ret", text.value, userName);

            render(userName, userName, text.value);

            text.value = "";

        };

        // 注册

        sock.on("reg_ret", function(res) {

            if(res.code == "0") {

                alert("注册成功,请登录");

            }

        });

        // 登录

        sock.on("login_ret", function(res) {

            if(res.code == "0") {

                userName = res.user;

                alert("登录成功");

                content.style.display = "block";

                form.style.display = "none";

            }

        });

        // 发消息

        sock.on("message_ret", function(res) {

            if(res.code == "0") {

                render(userName, res.user, res.msg);

            }

        });

        function render(userName, sender, msg) {

            var classTag = userName === sender ? "left" : "right";

            var node = document.createElement("div");

            node.innerHTML = `<span>${sender}:<span>

                            <span>${msg}<span>`;

            node.className = classTag;


            chart.appendChild(node);

        }

    </script>

</body>

</html>

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,039评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,223评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,916评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,009评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,030评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,011评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,934评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,754评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,202评论 1 309
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,433评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,590评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,321评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,917评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,568评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,738评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,583评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,482评论 2 352

推荐阅读更多精彩内容