当前位置: 首页 > news >正文

NodeJs 搭建简单的聊天室

为什么80%的码农都做不了架构师?>>>   hot3.png

var WebSocketServer = require('ws').Server
  , wss = new WebSocketServer({port: 8081, maxPayload: 0});

var wsClient = [];

wss.on('connection', function(ws){
    ws.on('message', function(data, flags){
        var json = {};
        try{
            json = JSON.parse(data);
            console.log(json);
        }catch(err){

        }
        if( !json.type ) return;
        switch(json.type){
        	case 1:
        		// 注册
        		act.reg(ws, json);
        	break;
        	case 2:
        		// 发送消息
        		act.send(json);
        	break;
        }
        
    });

    ws.on('close',function(){
        act.remove(ws.uid);
    });
});

var act = {
	reg: function(ws, json){
		if( json.uid ){
			act.remove(json.uid);
			ws.uid = json.uid;
			wsClient.push(ws);
			ws.send(JSON.stringify({type: 1, error: 0}));
		}
	},

	send: function(json){
		if( json.toUid ){
			var ws = act.getWs(json.toUid);
			if( ws ){
				ws.send(JSON.stringify(json));
			}
        }
	},

	// 移除指定的客户端
	remove: function(uid){
		for(var i=0; i < wsClient.length; i++){
            if( wsClient[i].uid == uid ){
            	wsClient.splice(i,1);
            } 
        }
	},

	// 获取指定的客户端 
	getWs: function(uid){
		for(var i = 0; i < wsClient.length; i++){
        	if( wsClient[i].uid == uid ){
        		return wsClient[i];
        	}
    	}

    	return null;
	}
};

 

客户端 :

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <meta name="format-detection" content="telephone=no" />
    <meta name="format-detection" content="email=no" />
    <meta content="width=device-width, initial-scale=1.0, user-scalable=0" name="viewport">
    <title>多人聊天室</title>
    <!--[if lt IE 8]><script src="./json3.min.js"></script><![endif]-->
    <!--script src="http://realtime.plhwin.com:3000/socket.io/socket.io.js"></script-->
</head>

<body>
    <div id="loginbox">
        <div style="width:260px;margin:200px auto;">
            请先输入你在聊天室的昵称
            <br/>
            <br/>
            <input type="text" style="width:180px;" placeholder="请输入用户名" id="username" name="username" />
            <input type="button" style="width:50px;" value="提交" onclick="CHAT.usernameSubmit();" />
        </div>
    </div>
    <div id="chatbox" style="display:none;">
        <div style="background:#3d3d3d;height: 28px; width: 100%;font-size:12px;">
            <div style="line-height: 28px;color:#fff;">
                <span style="text-align:left;margin-left:10px;">Websocket多人聊天室</span>
                <span style="float:right; margin-right:10px;"><span id="showusername"></span>|
                <a href="javascript:;" onclick="CHAT.logout()" style="color:#fff;">退出</a>
                </span>
            </div>
        </div>
        <div id="doc">
            <div id="chat">
                <div id="message" class="message">
                    <div id="onlinecount" style="width:background:#EFEFF4; font-size:12px; margin-top:10px; margin-left:10px; color:#666;">
                    </div>
                </div>
                <div class="input-box">
                    <div class="input">
                    <input type="text" maxlength="140" placeholder="发送给谁" id="uid" name="content" />
                        <input type="text" maxlength="140" placeholder="请输入聊天内容,按Ctrl提交" id="content" name="content" />
                    </div>
                    <div class="action">
                        <button type="button" id="mjr_send" onclick="CHAT.submit();">
                            提交
                        </button>
                    </div>
                </div>
            </div>
        </div>
    </div>
    <!--script type="text/javascript" src="./client.js"></script-->
    <script type="text/javascript">
    // 创建一个Socket实例
    var socketArr = [];
    var CHAT = {};

    var cid = 1;
    
    var socket;
    var wss = function(uid){
		socket = new WebSocket('ws://192.168.2.222:8081');
		
		// 打开Socket 
		socket.onopen = function(event) {

			// 发送一个初始化消息
			var data = {
				uid: uid,
				username: 'aaa',
                type: 1
			};

			socket.send(JSON.stringify(data));

			// 监听消息
			socket.onmessage = function(event) {
				//console.log('onMessage>', event);
                var $msg = document.getElementById("message");
                var con  = $msg.innerHTML;
                $msg.innerHTML = con + '<p>'+ event.data +'</p>';

                var json = {};
                try{
                    json = JSON.parse(event.data);
                    console.log(json);
                }catch(err){

                }

                if( json.type == 1 && json.error == 0 ){
                    console.log('reg ok...');
                }
			};

			// 监听Socket的关闭
			socket.onclose = function(event) {
				console.log('Client notified socket has closed', event);
			};

			// 关闭Socket.... 
			//socket.close() 
		};
		
		//socketArr.push(socket);
	}
	
	//console.debug(socketArr.length);



    CHAT.usernameSubmit = function(){
        var name = document.getElementById("username").value;
        CHAT.name = name;
        document.getElementById("showusername").html = CHAT.name;
        document.getElementById("chatbox").style.display = "block";

        wss(name);
    }

    CHAT.submit = function(){
        var uid = document.getElementById("uid").value;
        var msg = document.getElementById("content").value;

        // 发送消息
        var data = {
            uid: CHAT.name,
            toUid: uid,
            type: 2,
            msg: msg
        };

        socket.send(JSON.stringify(data));
    }
    </script>
</body>

</html>

 

转载于:https://my.oschina.net/skq/blog/682762

相关文章:

  • SolrCloud 5.x 集群部署方法
  • Spring Boot 和Spring Data
  • centos7使用docker下安装mysql并配置
  • 数组 找出重复的数字(不修改数组)
  • 加入强调语气,使用strong和em标签
  • java内置了优先队列PriorityQueue
  • Hadoop和分布式系统
  • c++ 指向类成员函数的函数指针
  • 数组流中的中位数
  • Java——观察者模式实例
  • 连续子数组的最大和
  • 礼物的最大价值
  • 最长不含重复字符的字符串
  • Mac下JDK的安装的配置
  • 第二阶段个人总结09
  • [译] React v16.8: 含有Hooks的版本
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • 2017-09-12 前端日报
  • 2018以太坊智能合约编程语言solidity的最佳IDEs
  • es的写入过程
  • Go 语言编译器的 //go: 详解
  • Gradle 5.0 正式版发布
  • hadoop入门学习教程--DKHadoop完整安装步骤
  • iOS高仿微信项目、阴影圆角渐变色效果、卡片动画、波浪动画、路由框架等源码...
  • LeetCode18.四数之和 JavaScript
  • SpiderData 2019年2月25日 DApp数据排行榜
  • Vue.js-Day01
  • 开发了一款写作软件(OSX,Windows),附带Electron开发指南
  • 爬虫模拟登陆 SegmentFault
  • 浅析微信支付:申请退款、退款回调接口、查询退款
  • 突破自己的技术思维
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • 鱼骨图 - 如何绘制?
  • - 转 Ext2.0 form使用实例
  • elasticsearch-head插件安装
  • Nginx实现动静分离
  • Redis4.x新特性 -- 萌萌的MEMORY DOCTOR
  • ​LeetCode解法汇总2182. 构造限制重复的字符串
  • ​VRRP 虚拟路由冗余协议(华为)
  • # 20155222 2016-2017-2 《Java程序设计》第5周学习总结
  • #《AI中文版》V3 第 1 章 概述
  • #Java第九次作业--输入输出流和文件操作
  • #QT(一种朴素的计算器实现方法)
  • #使用清华镜像源 安装/更新 指定版本tensorflow
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • ${factoryList }后面有空格不影响
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (03)光刻——半导体电路的绘制
  • (C语言)字符分类函数
  • (接口封装)
  • (九)信息融合方式简介
  • (论文阅读30/100)Convolutional Pose Machines
  • (亲测)设​置​m​y​e​c​l​i​p​s​e​打​开​默​认​工​作​空​间...
  • (十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据
  • (一)基于IDEA的JAVA基础12