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中exports与module.exports的区别详细介绍
Jan 14 NodeJs
使用upstart把nodejs应用封装为系统服务实例
Jun 01 NodeJs
基于NodeJS的前后端分离的思考与实践(三)轻量级的接口配置建模框架
Sep 26 NodeJs
你一定会收藏的Nodejs代码片段
Feb 04 NodeJs
nodejs个人博客开发第一步 准备工作
Apr 12 NodeJs
win系统下nodejs环境安装配置
May 04 NodeJs
nodejs多版本管理总结
Apr 03 NodeJs
解决nodejs的npm命令无反应的问题
May 17 NodeJs
webpack打包nodejs项目的方法
Sep 26 NodeJs
nodejs微信开发之自动回复的实现
Mar 17 NodeJs
nodejs中各种加密算法的实现详解
Jul 11 NodeJs
NodeJS 文件夹拷贝以及删除功能
Sep 03 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
php中的MVC模式运用技巧
2007/05/03 PHP
gd库图片下载类实现下载网页所有图片的php代码
2012/08/20 PHP
PHP实现根据浏览器跳转不同语言页面代码
2013/08/02 PHP
jQuery+PHP+ajax实现微博加载更多内容列表功能
2014/06/27 PHP
Smarty简单生成表单元素的方法示例
2016/05/23 PHP
Zend Framework入门教程之Zend_Db数据库操作详解
2016/12/08 PHP
在PHP中实现使用Guzzle执行POST和GET请求
2019/10/15 PHP
php计数排序算法的实现代码(附四个实例代码)
2020/03/31 PHP
JavaScript二维数组实现的省市联动菜单
2014/05/08 Javascript
JavaScript代码因逗号不规范导致IE不兼容的问题
2016/02/25 Javascript
BootStrap下拉框在firefox浏览器界面不友好的解决方案
2016/08/18 Javascript
jQuery中slidedown与slideup方法用法示例
2016/09/16 Javascript
js获取时间函数及扩展函数的方法
2016/10/30 Javascript
JS获取多维数组中相同键的值实现方法示例
2017/01/06 Javascript
原生js实现轮播图
2017/02/27 Javascript
基于node.js制作简单爬虫教程
2017/06/29 Javascript
Webpack 之 babel-loader文件预处理器详解
2018/03/23 Javascript
为什么使用koa2搭建微信第三方公众平台的原因
2018/05/16 Javascript
JS/HTML5游戏常用算法之路径搜索算法 随机迷宫算法详解【普里姆算法】
2018/12/13 Javascript
Vue数字输入框组件的使用方法
2019/10/19 Javascript
vue 数据操作相关总结
2020/12/17 Vue.js
python爬取网页内容转换为PDF文件
2020/07/28 Python
python实现词法分析器
2019/01/31 Python
python实现ip代理池功能示例
2019/07/05 Python
python编写扎金花小程序的实例代码
2021/02/23 Python
CSS3中引入多种自定义字体font-face
2020/06/12 HTML / CSS
露营世界:Camping World
2017/02/02 全球购物
Android面试题附答案
2014/12/08 面试题
会计实习生自我鉴定
2013/12/12 职场文书
三年级语文教学反思
2014/02/01 职场文书
古汉语文学求职信范文
2014/03/16 职场文书
入党培养人考察意见
2015/06/08 职场文书
上帝为你开了一扇窗之Tkinter常用函数详解
2021/06/02 Python
浅析NIO系列之TCP
2021/06/15 Java/Android
用PYTHON去计算88键钢琴的琴键频率和音高
2022/04/10 Python
实现GO语言对数组切片去重
2022/04/20 Golang