一 需求

一个多商家的电商系统,比如京东商城,不同商家之间的客服是不同的,所面对的用户也是不同的。要实现一个这样的客服聊天系统,那该系统就必须是一个支持多客服、客服一对多用户的聊天系统。

二 思路

使用 Node.js 搭建服务器,全局安装 ws 模块、node-uuid模块。通过 Nodejs 服务处理客服端和用户端传递过来的 客服ID 和 用户ID,来实现消息的精准传送。

三 具体实现

下面主要谈谈客服聊天系统涉及 Nodejs 的方面。至于客服聊天系统的 PHP、MySQL 方面,主要是用来存储和获取聊天记录的,在此就省略了。

3.1 搭建 Node 服务器

3.1.1 Nodejs 的安装

参考本人前面的文章 《Centos6.8 下 Node.js 的安装》。

3.1.2 全局安装 ws 模块、node-uuid 模块(使用国内淘宝镜像)

npm --registry=https://registry.npm.taobao.org install -g ws
npm --registry=https://registry.npm.taobao.org install -g node-uuid

3.1.3 创建 kefu.js

在项目里面新建一个 kefu.js,创建服务,指定8906端口(下面是主要代码,仅供参考):

 1 const WebSocket = require('ws');
2 const wss = new WebSocket.Server({ port: 8906 });
3 const uuid = require('node-uuid');
4 // 省略一些参数的定义
5 // 服务端处理连接
6 wss.on('connection', function(ws) {
7 console.log('client [%s] connected', clientIndex);
8 var connection_uuid = uuid.v4();
9 var nickname = "AnonymousUser" + clientIndex;
10 clientIndex += 1;
11 clients.push({ "id": connection_uuid, "ws": ws, "nickname": nickname });
12
13 //服务器收到消息时
14 ws.on('message', function(e) {
15 var data = JSON.parse(e);
16 var type = data.type;
17 // 省略业务处理逻辑
18 });
19
20 // ws连接关闭时触发的操作
21 ws.on("close", function () {
22 websocketClose();
23 });
24
25 // 省略函数 websocketClose()、wsSend()、socketClose 的定义
26 // 聊天服务器关闭所触发的操作
27 process.on("SIGINT", function () {
28 console.log("SOCKET CLOSED!");
29 ("客服已关闭,请稍后再来");
30 process.exit();
31 });
32 });

3.1.4 创建 customer.html

该页面是用户页面。在页面上建立一个WebSocket的连接,并实现向服务器端发送消息(下面是主要代码,仅供参考):

 <script>
//建立连接
const ws = new WebSocket("ws://22.33.66.88:8906");
var client_id = ''; //ws连接打开后的操作
ws.onopen = function (e) {
//向服务器发送该ws连接的用户信息
}; //收到消息处理
ws.onmessage = function (e) {
// 省略
}; //ws连接出错所触发的操作
ws.onerror = function (e) {
// 省略
}; //ws连接关闭时所触发的操作
ws.onclose = function (e) {
// 省略
}; // 省略函数 appendLog()、sendMessage()、sendMessage2()、wsSendMessage() 的定义
</script>

3.1.5 创建 customerService.html

该页面是客服页面,类似于 customer.html,代码方面可参考 customer.html

至此,通过在Linux终端运行以下命令即可开启客服聊天服务:

node kefu.js

若在浏览器无法打开客服页面(比如customer.html),则可能需要将Linux系统的8906端口开启。

通过命令 node kefu.js 这种开启客服聊天服务的方式仅限于当前终端会话,若关闭当前终端会话则无法提供服务了。因此,还要做到让客服聊天服务在后台持续稳定地运行。

3.2 让客服聊天服务在后台持续稳定地运行

使用 pm2 这个 Nodejs 部署和进程管理工具可以实现这一目的。

3.2.1 全局安装 pm2 工具:

npm --registry=https://registry.npm.taobao.org install -g pm2

3.2.2 开启客服聊天服务:

pm2 start kefu.js

3.3 实现外网通过80端口访问 kefu.js(这一步非必需)

使用 Nginx 反向代理可以实现这一目的。

在 Nginx 配置目录下新建一个 kefu.test.com.conf 文件,配置如下:

upstream kefu.test.com {
server 127.0.0.1:;
}
server {
listen ;
server_name kefu.test.com;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forward-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-Nginx-Proxy true; proxy_pass http://kefu.test.com;
proxy_redirect off;
}
}

用 WebSocket 实现一个简单的客服聊天系统的更多相关文章

  1. 基于SpringBoot+WebSocket搭建一个简单的多人聊天系统

    前言   今天闲来无事,就来了解一下WebSocket协议.来简单了解一下吧. WebSocket是什么   首先了解一下WebSocket是什么?WebSocket是一种在单个TCP连接上进行全双工 ...

  2. 用socket.io实现websocket的一个简单例子

    socket.io 是基于 webSocket 构建的跨浏览器的实时应用. 逛博客发现几个比较好的 一.用socket.io实现websocket的一个简单例子 http://biyeah.iteye ...

  3. 通过WebSocket实现一个简单的聊天室功能

    WebSocket WebSocket是一个协议,它是是基于TCP的一种新的网络协议,TCP协议是一种持续性的协议,和HTTP不同的是,它可以在服务器端主动向客户端推送消息.通过这个协议,可以在建立一 ...

  4. Comet反向ajax技术实现客服聊天系统

    说明:Comet反向Ajax是在看了燕十八老师的视频以后,结合他讲解的例子,自己用ajax+java实现了一遍.在这里把代码贴出来,以供大家学习.同时,ajax轮询技术也可以用在消息推送的功能中,下次 ...

  5. 如何用WebSocket实现一个简单的聊天室以及单聊功能

    百度百科中这样定义WebSocket:WebSocket协议是基于TCP的一种新的网络协议.它实现了浏览器与服务器全双工(full-duplex)通信——允许服务器主动发送信息给客户端.简单的说,We ...

  6. 学习WebSocket(二):使用Spring WebSocket做一个简单聊天室

    聊天室高频率.低延时完全符合websocket的特点,所以聊天室使用websocket再适合不过了. 聊天室的功能并没有比上一节代码多多少,主要在握手阶段对用户的session做处理,对用户的消息进行 ...

  7. 后端Python3+Flask结合Socket.io配合前端Vue2.0实现简单全双工在线客服系统

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_158 在之前的一篇文章中:为美多商城(Django2.0.4)添加基于websocket的实时通信,主动推送,聊天室及客服系统,详 ...

  8. WebSocket介绍和一个简单的聊天室

    WebSocket是什么呢? WebSocket一种在单个 TCP 连接上进行全双工通讯的协议.WebSocket通信协议于2011年被IETF定为标准RFC 6455,并被RFC7936所补充规范, ...

  9. Django 学习笔记之六 建立一个简单的博客应用程序

    最近在学习django时建立了一个简单的博客应用程序,现在把简单的步骤说一下.本人的用的版本是python 2.7.3和django 1.10.3,Windows10系统 1.首先通过命令建立项目和a ...

随机推荐

  1. (转)求质数算法的N种境界[1] - 试除法和初级筛法

    ★引子 前天,俺在<俺的招聘经验[4]:通过笔试答题能看出啥?>一文,以"求质数"作为例子,介绍了一些考察应聘者的经验.由于本文没有政治敏感内容,顺便就转贴到俺在CSD ...

  2. noip 1999 回文数

    题目描述 若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数. 例如:给定一个10进制数56,将56加65(即把56从右向左读),得到121是一个回文数. 又如:对于10进制数 ...

  3. FZU 2105 Digits Count(按位维护线段树)

    [题目链接] http://acm.fzu.edu.cn/problem.php?pid=2105 [题目大意] 给出一个序列,数字均小于16,为正数,每次区间操作可以使得 1. [l,r]区间and ...

  4. 【动态规划】 Codeforces Round #416 (Div. 2) C. Vladik and Memorable Trip

    划分那个序列,没必要完全覆盖原序列.对于划分出来的每个序列,对于某个值v,要么全都在该序列,要么全都不在该序列.  一个序列的价值是所有不同的值的异或和.整个的价值是所有划分出来的序列的价值之和.   ...

  5. 【预处理】【分类讨论】Playrix Codescapes Cup (Codeforces Round #413, rated, Div. 1 + Div. 2) C. Fountains

    分几种情况讨论: (1)仅用C或D买两个 ①买两个代价相同的(实际不同)(排个序) ②买两个代价不同的(因为买两个代价相同的情况已经考虑过了,所以此时对于同一个代价,只需要保存美丽度最高的喷泉即可)( ...

  6. ncnn阅读 - CMakeLists.txt

    CMAKE_TOOLCHAIN_FILE This variable is specified on the command line when cross-compiling with CMake. ...

  7. 在Linux系统环境下修改MySQL的root密码

    root用户登录系统 /usr/local/mysql/bin/mysqladmin -u root -p password 新密码 enter password 旧密码 第二种方法: root用户登 ...

  8. 从connect到express01-connect

    介绍 Connect是一个node中间件框架.每个中间件在http处理过程中通过改写request, response的数据.状态,实现了特定的功能. 根据中间件在整个http处理流程的位置,将中间件 ...

  9. 【笔记】选择框 change 事件获取内容

    还记得之前做过一次js 的联动效果,在获取下拉框change事件后的 value 时,当时的我做得比较费劲. 现在看了高程的表单脚本那一章之后发现有一个更好的方法,那就是直接获取下拉框change 事 ...

  10. TestNG 六 测试结果

    一.成功.失败和断言 如果一个测试没有抛出任何异常就完成运行或者说抛出了期望的异常(参见@Test注解的expectedExceptions属性文档),就说,这个测试时成功的. 测试方法的组成常常包括 ...