0
回答
优客服开源客服系统通信功能介绍
利用AWS快速构建适用于生产的无服务器应用程序,免费试用12个月>>>   

1.1   优客服功能

1.1.1     优客服功能组成

优客服,是一个多渠道融合的客户支持服务平台,包含WebIM,微信,电话,邮件,短信等接入渠道,在渠道接入方面,优客服主要包含以下几种:

WebIM优客服提供WebIM功能,在线坐席能够通过工作台操作界面,接收来自WebIM的咨询请求,优客服通过整合多个渠道来源,让坐席在同一个工作界面上处理来自PC端、移动端、微信端,微博等渠道的服务请求。

社交媒体: 接入微信和微博渠道,将社交媒体渠道的的咨询请求接入进入 优客服 坐席工作平台,让客服统一响应和受理 

邮件、短信: 多种邮件处理方式,能够将邮箱的消息转为坐席的待处理任务,可以将待处理任务或邮件转为工单

电话语音接入:呼叫中心功能,能够接入电话呼叫中心功能。

1.1.2    实时通信组件部分功能

实时消息的推送,PC端的推送技术可以使用socket建立一个长连接来实现。传统的web服务都是客户端发出请求,服务端给出响应。但是现在直观的要求是允许特定时间内在没有客户端发起请求的情况下服务端主动推送消息到客户端。

实现webim方法有很多,最关键的问题是保持和服务端的连接。如何保障会话的即时性和连通性。常用的有poll, long poll,  comet等。

有哪些可以实现web消息推送的技术:

不断地轮询(俗称“拉”,polling)是获取实时消息的一个手段:Ajax 隔一段时间(通常使用 JavaScript 的 setTimeout 函数)就去服务器查询是否有改变,从而进行增量式的更新。但是间隔多长时间去查询成了问题,因为性能和即时性造成了严重的反比关系。间隔太短,连续不断的请求会冲垮服务器,间隔太长,务器上的新数据就需要越多的时间才能到达客户机。

优点:服务端逻辑简单;

缺点:其中大多数请求可能是无效请求,在大量用户轮询很频繁的情况下对服务器的压力很大;

应用:并发用户量少,而且要求消息的实时性不高,一般很少采用;

长轮询技术(long-polling):客户端向服务器发送Ajax请求,服务器接到请求后hold住连接,直到有新消息或超时(设置)才返回响应信息并关闭连接,客户端处理完响应信息后再向服务器发送新的请求。

优点:实时性高,无消息的情况下不会进行频繁的请求;

缺点:服务器维持着连接期间会消耗资源;

基于Iframe及htmlfile的流(streaming)方式:iframe流方式是在页面中插入一个隐藏的iframe,利用其src属性在服务器和客户端之间创建一条长链接,服务器向iframe传输数据(通常是HTML,内有负责插入信息的javascript),来实时更新页面。

优点:消息能够实时到达;

缺点:服务器维持着长连接期会消耗资源;

插件提供socket方式:比如利用Flash XMLSocket,Java Applet套接口,Activex包装的socket。

优点:原生socket的支持,和PC端和移动端的实现方式相似;

缺点:浏览器端需要装相应的插件;

WebSocket:是HTML5开始提供的一种浏览器与服务器间进行全双工通讯的网络技术。

优点:更好的节省服务器资源和带宽并达到实时通讯;

缺点:目前还未广泛普及,浏览器支持不好,IE9及以下的浏览器不能很好的支持;

综上,考虑到浏览器兼容性和性能问题,采用长轮询(long-polling)是一种比较好的方式。

netty-socketio是一个开源的Socket.io服务器端的一个java的实现, 它基于Netty框架。

1.     

2.     

3.     

3.1.     

1.1.3    NettySocketIO介绍

NettySocketIO是一个开源的通信服务器的java的实现, 它基于Netty框架。可应用于服务端主动推送消息到客户端等场景,和WebSocket是功能类似,只NettySocketIO可支持大部分主流的浏览器。

项目地址为: https://github.com/mrniko/netty-socketio

Socket.IO除了支持WebSocket通讯协议外,还支持许多种轮询(Polling)机制以及其它实时通信方式,并封装成了通用的接口,并且在服务端实现了这些实时机制的相应代码。Socket.IO实现的Polling通信机制包括Adobe Flash Socket、AJAX长轮询、AJAX multipart streaming、持久Iframe、JSONP轮询等。Socket.IO能够根据浏览器对通讯机制的支持情况自动地选择最佳的方式来实现网络实时应用。

1.1.4    NameSpace和Room的概念

NameSpace和Room的概念其实用来同一个服务端Socket多路复用的。NameSpace,Room和Socket的关系如下。

Socket会属于某一个Room,如果没有指定,那么会有一个默认的Room。这个Room又会属于某个NameSpace,如果没有指定,那么就是默认的NameSpace/.

最后SocketIO有用所有的NameSpace。

客户端连接时指定自己属于哪个NameSpace,   

io.connect(  http://localhost/namespace)。 服务端看到NameSpace就会把这个socket加入指定的NameSpace。

如果客户端没有具体指定哪个room,则服务端会放入默认room中,或者服务端通过代码socket.join("agent") 放入 agent的Room中。

有了这个概念之后,就比较好理解Socket.IO是如何广播的,广播的时候是以NameSpace为单位的,如果只想广播给某个Room,那就需要另外指定Room的名字。

socketio.send("send to the clients which belong to default namespace(/)");

这个调用没有指定NameSpace和Room,那么这个广播的对象就是 广播给默认NameSpace/ 和默认Room。 如果你的客户端连接到服务器的path是 http://localhost/agent,

客户端是属于agent NameSpace,那么这个客户端就收不到这个消息。只有那些path是 http://localhost的才能收到。
socket.broadcast.emit('message', "send to the clients which belong to namespace(socket belong to) except sender");

通过socket广播时,是广播给这个socket所属的 namespace里的所有客户端。只有跟socket同一个namespace里的客户端才能收到数据。

socket.broadcast.in('chat).emit('message', "send to the clients which belong to namespace(socket belong to) except sender");

广播给跟socket同一个NameSpace下面的,名字为 chat的room里的除自己以外的客户端。

socketio.of('/private').send("send to all the clients which belong to namespace(priavte)");

发给 private namespace里的所有客户端。

socketio.of('/private').in('chat').send("send to all the clients in the chat room which belong to namespace(private)");

发给private namespace里面的 chat room的所有客户端。

记忆这些函数也比较容易 ,如果是socket开头的,那么namespace已经指定,只能修改room。如果是socketio开头的,那么可以指定namesapce和room。

如果没有任何指定,那就是默认的NameSpace和默认的Room。

<无标签>
举报
顶部