nodejs+websocket实时聊天系统改进版


Posted in NodeJs onMay 18, 2017

本文属于nodejs+websocket实时聊天系统的改进版本,具体内容如下

自己也是真的菜,一个websocket简单聊天系统硬被我搞了那么些天。

看来以后还是得写更多的代码。

client.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>Document</title>
 <style>
 .kuang {
  width: 600px;
  min-height: 50px;
  max-height: 296px;
  border: 1px solid;
  float: left;
  display: block;
  position: relative;
  overflow-y: scroll;
 }

 .value {
  width: 200px;
 }

 .input {
  display: block;
  position: absolute;
  left: 0;
  margin-top: 300px;
 }
 </style>
</head>

<body>
 <label>连接用户:</label>
 <input type="text" id="name" />
 <button id="conn">连接</button>
 <button id="close">断开</button><br/><br/>
 <div class="kuang" id="mess"></div>
 <div class="input">
 <input type="text" class="value" id="value1" />
 <button id="send">发送</button>
 </div>
 <script>
 var input = document.getElementById("name");
 var conn = document.getElementById("conn");
 var close = document.getElementById("close");
 var mess = document.getElementById("mess");
 var value1 = document.getElementById("value1");
 var pattern = /^[\u4e00-\u9fa5]{2,10}$/;

 close.disabled = true;
 if (window.WebSocket) {
  conn.onclick = function () {
  if (!pattern.test(input.value)) {
   alert("名称不能为空且必须为中文");
   return;
  }
  var ws = new WebSocket('ws://127.0.0.1:8082');
  conn.disabled = true;
  close.disabled = false;
  ws.onopen = function (e) {
   console.log("连接服务器成功");
   ws.send(input.value);
   input.setAttribute("readOnly", 'true');
   value1.setAttribute("readOnly", 'true');
  }
  ws.onmessage = function (e) {
   value1.removeAttribute("readOnly");
   var time = new Date();
   mess.innerHTML += time.toUTCString() + ":" + e.data + "<br>";
   document.getElementById("send").onclick = function (e) {
   ws.send(input.value + "说:" + value1.value);
   value1.value = " ";
   }
   document.onkeydown = function (e) {
   e = e || window.event;
   if (e.keyCode == 13) {
    document.getElementById("send").onclick();
    return false;
   }
   }
  }
  ws.onclose = function (e) {
   console.log("服务器关闭");
  }
  ws.onerror = function () {
   console.log("连接出错");
  }
  /**
   * 客户端主动断开连接
   * 
   * **/
  close.onclick = function () {
   ws.onclose();
   ws.send(input.value + 'close' + "了连接");
   input.removeAttribute("readOnly");
   conn.disabled = false;
   close.disabled = true;
  }

  }


 }
 </script>
</body>

</html>

 只能说界面丑陋忽略它。
server.js:

var ws = require("nodejs-websocket");
console.log("开始建立连接...");
var str1 = null, str2 = null, clientReady = false, serverReady = false;
var a = [];
var server = ws.createServer(function (conn) {
 conn.on('text', function (str) {
 a.push(str);
 if (!clientReady) {
  if (a[0] === str) {
  str1 = conn;
  clientReady = true;
  str1.sendText("欢迎你" + str);

  }
 } else if (!serverReady) {
  if (str.indexOf('close') >= 0) {
  a.splice(2, 1);
  clientReady = false;
  str1 = null;
  return;
  }
  if (a[1] === str) {
  str2 = conn;
  serverReady = true;
  str2.sendText("欢迎你" + str);
  str1.sendText(str + "在线啦,你们可以聊天啦");
  return;
  }
 } else if (clientReady && serverReady) {
  str2.sendText(str);
  str1.sendText(str);
  if (str.indexOf('close') >= 0) {
  a.splice(2, a.length);
  var len = a.length;
  for (var i = 0; i < len; i++) {
   // 定位该元素位置
   if (str.indexOf(a[i]) >= 0) {
   a.splice(i, 1);
   if (i == 0) {
    str1 = str2;
   }
   serverReady = false;
   str2 = null;
   return;
   }

  }
  }
 }


 })

 conn.on("close", function (code, reason) {
 console.log("关闭连接");
 clientReady = false;
 serverReady = false;
 })
 conn.on("error", function (code, reason) {
 console.log("异常关闭");
 });
}).listen(8082);
console.log("websocket连接完毕")

简单的截图说明一下:

nodejs+websocket实时聊天系统改进版nodejs+websocket实时聊天系统改进版

nodejs+websocket实时聊天系统改进版

开启服务,相同页面执行两遍,就可以聊天啦。反正过程就是这样。就是还有一个大的问题。比如我a断开连接了,只有b一个人在连接巨人b还能发信息,可以发信息算可以吧。居然b自己接收自己的信息。那就不能忍了。

nodejs+websocket实时聊天系统改进版

就是这种呀,逻辑都错乱了,理清逻辑是个费脑子的事情。有知道的同学吗?怎么处理呀

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

NodeJs 相关文章推荐
NodeJS与Mysql的交互示例代码
Aug 18 NodeJs
nodejs文件操作模块FS(File System)常用函数简明总结
Jun 05 NodeJs
NodeJS制作爬虫全过程(续)
Dec 22 NodeJs
NodeJS学习笔记之(Url,QueryString,Path)模块
Jan 13 NodeJs
nodejs 整合kindEditor实现图片上传
Feb 03 NodeJs
windows下安装nodejs及框架express
Aug 07 NodeJs
nodejs 中模拟实现 emmiter 自定义事件
Feb 22 NodeJs
详解如何在NodeJS项目中优雅的使用ES6
Apr 22 NodeJs
Nodejs实现多房间简易聊天室功能
Jun 20 NodeJs
nodejs操作mongodb的增删改查功能实例
Nov 09 NodeJs
浅谈JS和Nodejs中的事件驱动
May 05 NodeJs
NodeJs内存占用过高的排查实战记录
May 10 NodeJs
nodejs6下使用koa2框架实例
May 18 #NodeJs
Nodejs中使用captchapng模块生成图片验证码
May 18 #NodeJs
详解使用nodeJs安装Vue-cli
May 17 #NodeJs
NodeJS创建最简单的HTTP服务器
May 15 #NodeJs
NodeJS、NPM安装配置步骤(windows版本) 以及环境变量详解
May 13 #NodeJs
配置nodejs环境的方法
May 13 #NodeJs
nodejs multer实现文件上传与下载
May 10 #NodeJs
You might like
点评山进PR-D3L三波段收音机
2021/03/02 无线电
php数组中删除元素的实现代码
2012/06/22 PHP
php注册和登录界面的实现案例(推荐)
2016/10/24 PHP
收集的一些Array及String原型对象的扩展实现代码
2010/12/05 Javascript
js实现字符串的16进制编码不加密
2014/04/25 Javascript
node.js中的fs.fchownSync方法使用说明
2014/12/16 Javascript
JavaScript函数的一些注意要点小结及js匿名函数
2015/11/10 Javascript
基于javascript实现图片左右切换效果
2016/01/25 Javascript
学JavaScript七大注意事项【必看】
2016/05/04 Javascript
AngularJs Scope详解及示例代码
2016/09/01 Javascript
使用Vue组件实现一个简单弹窗效果
2018/04/23 Javascript
Vue父子组件双向绑定传值的实现方法
2018/07/31 Javascript
vue项目中实现图片预览的公用组件功能
2018/10/26 Javascript
弱类型语言javascript中 a,b 的运算实例小结
2019/08/07 Javascript
小程序怎样让wx.navigateBack更好用的方法实现
2019/11/01 Javascript
详解Vue+elementUI build打包部署后字体图标丢失问题
2020/07/13 Javascript
vue 动态生成拓扑图的示例
2021/01/03 Vue.js
Python MD5文件生成码
2009/01/12 Python
Python httplib模块使用实例
2015/04/11 Python
Python安装使用命令行交互模块pexpect的基础教程
2016/05/12 Python
windows下python安装paramiko模块和pycrypto模块(简单三步)
2017/07/06 Python
Python模拟脉冲星伪信号频率实例代码
2018/01/03 Python
Python GUI Tkinter简单实现个性签名设计
2018/06/19 Python
Python一行代码解决矩阵旋转的问题
2019/11/30 Python
Python3中configparser模块读写ini文件并解析配置的用法详解
2020/02/18 Python
django自定义非主键自增字段类型详解(auto increment field)
2020/03/30 Python
html+css3实现的登录界面
2020/12/09 HTML / CSS
HTML5实现页面切换激活的PageVisibility API使用初探
2016/05/13 HTML / CSS
猫途鹰英国网站:TripAdvisor英国(旅游社区和旅游评论)
2016/08/30 全球购物
香港零食网购:上仓胃子
2020/06/08 全球购物
俄罗斯园林植物网上商店:Garshinka
2020/07/16 全球购物
初中生评语大全
2014/04/24 职场文书
经济管理自荐书
2014/06/09 职场文书
2015年教师党员承诺书
2015/04/27 职场文书
Vue实现跑马灯样式文字横向滚动
2021/11/23 Vue.js
PHP RabbitMQ消息列队
2022/05/11 PHP