怎样才能注册电孑企业电子邮箱注册?

还有人不会搭建即时通讯服务器WebSocket?
在直播中,聊天和发礼物,需要用到及时通讯技术,市面上的App大多数采用的都是第三方SDK,融云,环信等,但是本例子采用websocket搭建及时通讯服务器。
即时通讯(Instant messaging,简称IM)是一个终端服务,允许两人或多人使用网路即时的传递文字讯息、档案、语音与视频交流
即时通讯技术原理(了解Socket)
Socket介绍: 套接字或者插座,用于描述IP地址和端口号,是一种网络的通信机制。
Socket作用: 网络通信底层都是通过socket建立连接的,因为它包含IP和端口,只要有这两个就能准确找到一台主机上的某个应用。
IM通信原理(T):
客户端A与客户端B如何产生通信?客户端A不能直接和客户端B,因为两者相距太远。
这时就需要通过IM服务器,让两者产生通信.
客户端A通过socket与IM服务器产生连接,客户端B也通过socket与IM服务器产生连接
A先把信息发送给IM应用服务器,并且指定发送给B,服务器根据A信息中描述的接收者将它转发给B,同样B到A也是这样。
通讯问题: 服务器是不能主动连接客户端的,只能客户端主动连接服务器
那么当服务器要推信息给客户端B,但是客户端B这时候没有与服务器产生连接,就推送不了.
这样就延迟,不即时了。
即时通讯技术实现
即时通讯核心是`即时``,那怎么达到即时?
目前实现即时通讯的有四种方式(短轮询、长轮询、SSE、Websocket)
短轮询: 每隔一小段时间就发送一个请求到服务器,服务器返回最新数据,然后客户端根据获得的数据来更新界面,这样就间接实现了即时通信。优点是简单,缺点是对服务器压力较大,浪费带宽流量(通常情况下数据都是没有发生改变的)。
短轮询: 主要是客户端人员写代码,服务器人员比较简单,适于小型应用
长轮询: 客户端发送一个请求到服务器,服务器查看客户端请求的数据(服务器中数据)是否发生了变化(是否有最新数据),如果发生变化则立即响应返回,否则保持这个连接并定期检查最新数据,直到发生了数据更新或连接超时。同时客户端连接一旦断开,则再次发出请求,这样在相同时间内大大减少了客户端请求服务器的次数.
长轮询底层实现:在服务器的程序中加入一个死循环,在循环中监测数据的变动。当发现新数据时,立即将其输出给浏览器并断开连接,浏览器在收到数据后,再次发起请求以进入下一个周期
长轮询弊端:服务器长时间连接会消耗资源,返回数据顺序无保证,难于管理维护
长轮询处理:不能一直持续下去,应该设定一个最长时限,可以通过心跳包的方式,设置多少秒没有接到心跳包,就关闭当前连接。
心跳包:就是在客户端和服务器间定时通知对方自己状态的一个自己定义的命令字,按照一定的时间间隔发送,类似于心跳,所以叫做心跳包
SSE(Server-sent Events服务器推送事件):为了解决浏览器只能够单向传输数据到服务端,HTML5提供了一种新的技术叫做服务器推送事件SSE,SSE技术提供的是从服务器单向推送数据给浏览器的功能,但是配合浏览器主动请求,实际上就实现了客户端和服务器的双向通信.
WebSocket:上面的这些解决方案中,都是利用浏览器单向请求服务器或者服务器单向推送数据到浏览器,而在HTML5中,为了加强web的功能,提供了websocket技术,它不仅是一种web通信方式,也是一种应用层协议。它提供了浏览器和服务器之间原生的全双工跨域通信,通过浏览器和服务器之间建立websocket连接,在同一时刻能够实现客户端到服务器和服务器到客户端的数据发送.
什么是websocket?是 HTML5 一种新的协议。它实现了浏览器与服务器全双工通信,能更好的节省服务器资源和带宽并达到实时通讯,它建立在 TCP 之上,同 HTTP 一样通过 TCP 来传输数据
WebSocket 是一种双向通信协议,在建立连接后,WebSocket 服务器和 客户端 都能主动的向对方发送或接收数据,就像 Socket 一样。
WebSocket 需要类似 TCP 的客户端和服务器端通过握手连接,连接成功后才能相互通信
websocket提供两种数据传输:文本数据和二进制数据
websocket协议头:ws
WebSocket原理
Websocket流程: WB是先进行一次HTTP请求,这个请求头不同于普通HTTP请求,然后服务器开始辨认请求头,如果是WB的请求头,则开始进行普通的TCP连接,即三次握手。如果不是WB的HTTP请求头,那就是按普通的HTTP请求处理
Websocket协议解析:
Sec-WebSocket-Key:其值采用编码的随机16字节长的字符序列
Sec-WebSocket-Accept如何生成:/hustskyking/p/websocket-with-node.html
Socket.IO简介
WebSocket的功能是很强大的,使用起来也灵活,可以适用于不同的场景。不过WebSocket技术也比较复杂,需要加密解密,包装协议,自己实现3次握手,还需要对数据流进行加密解密处理,服务器端和浏览器端的实现都不同于一般的Web应用,因此自己实现很麻烦,可以使用Socket.IO框架。
Socket.IO:是一个完全由Java实现、基于Node.js、支持WebSocket的协议用于实时通信、跨平台的开源框架。
Socket.IO:它包括了客户端(iOS,Android)和服务器端(Node.js)的代码,可以很好的实现iOS即使通讯技术。
Socket.IO框架地址: /socketio
Socket.IO教程
Socket.IO建立连接 服务器代码
1.如何导入Socket.IO?
和导入express框架一样,使用package
给package文件添加依赖
2.如何创建socket
socket本质还是http协议,所以需要绑定http服务器,才能启动socket服务.
而且需要通过web服务器监听端口,socket不能监听端口,有人访问端口才能建立连接,所以先创建web服务器
3.如何建立socket连接(服务器不需要主动建立连接,建立连接是客户端的事情,服务器只需要监听连接)
客户端主动连接会发送connection事件,只需要监听connection事件有没有发送,就知道客户端有没有主动连接服务器
Socket.IO本质是通过发送和接受事件触发服务器和客户端之间的通讯,任何能被编辑成JSON或二进制的对象都可以传递。
监听事件,用socket.on,这个方法会有两个参数,第一个参数是事件名称,第二个参数是监听事件的回调函数,监听到就会执行这个回调函数
监听connection,回调函数会传入一个连接好的socket,这个socket就是客户端的socket
socket连接原理,就是客户端和服务端通过socket连接,服务器有socket,客户端也有
书写客户端代码,验证是否能建立连接
Socket.IO建立连接 客户端代码
1.下载Socket.IO-Client-Swift
Socket.IO只有swift,如果需要用OC代码,需要swift和OC混编
还有如果代码是OC,并且使用cocoapods,就不要使用cocoapods导入swift代码,会有问题.
2.下载完了,直接把Source文件夹拖入到自己工程中.
会报错,说当前swift版本过时,需要更新。点击Xcode顶部Edit =& Convert =& TO Current Swift Syntas 就好了。
3.OC和Swift混编,Swift代码怎么在OC中使用,直接导入”工程文件名-Swift.h”就可以使用,这个文件Xcode会自动帮我们生成,无序手动自己生成.
4.注意工程文件名不能带有-这个符号,而且有时候会延迟,并不是马上导入”工程文件名-Swift.h”就好.
5.创建socket对象,然后连接用connect方法,socket对象需要强引用
注意协议:ws开头
创建socket对象,需要传入字典,字典配置如下。
6.因为需要进行3次握手,不可能马上建议连接,需要监听是否连接成功的回调,使用on方法
7.ON方法两个参数(第一个参数,监听的事件名称,第二个参数:监听事件回调函数,会自动调用)
回调函数也有两个参数(第一个参数:服务器传递的数据 第二个参数:确认请求数据)
在TCP/IP协议中,如果接收方成功的接收到数据,那么会回复一个ACK数据。
SocketIO发送事件,通过事件传递数据
SocketIO 客户端发送事件代码
注意:只有连接成功之后,才能发送事件
向服务器发送事件(emit:第一参数事件的名称,第二个参数传输的数据,是一个数组)
SocketIO 服务器监听事件代码
监听客户端事件,需要嵌套在连接好的connect回调函数中
必须使用回调函数的socket参数,如function(s)中的s,监听事件,因此这是客户端的socket,肯定监听客户端发来的事件
服务器监听连接的回调函数的参数可以添加多个,具体看客户端传递数据数组有几个,每个参数都是与客户段一一对应,第一个参数对应客户端数组第0个数据
SocketIO 服务器发送事件代码
这里的socket一定要用服务器端的socket
给当前客户端发送数据,其他客户端收不到.
发给所有客户端,不包含当前客户端
发给所有客户端,包含当前客户端
SocketIO 客户端监听事件代码
SocketIO分组
开发中什么场景需要使用SocketIO分组?(T)
一个客户端和服务器只会保持一个socket连接,比如直播App中会开很多主播房间,每个房间都有自己的聊天室,不可能每个聊天室都建立一个socket,但如果只有一个socket,比如A用户要给A主播间发送信息,怎么推送过去,通过服务器只能给当前客户端推送,那一推,当前客户端所有直播间都有A用户的信息。
怎么解决多个直播聊天室问题?
给每个主播的房间都分组,服务器就可以给指定组推送数据,就不会影响到其他直播间
SocketIO如何分组?
服务器代码: socket.join(),()里面放分组名称,与之对应的 socket.leave()
注意这里的socket是客户端的socket,也就是连接成功,传递过来的socket
socket分组的原理,只要客户端socket调用join,服务器就会把客户端socket和分组的名称绑定起来,到时候就可以根据分组的名称找到对应客户端的socket,就能给指定的客户端推送信息.
注意:一个客户端socket只能添加到一组,离开的时候,要记得移除.
客户端可以这样测试,搞两台电脑/两台手机在同一个局域网内,运行就有两个客户端,分别加入不同组.
服务器只给一个客户端socket发送信息,另外一个客户端收不到
服务器代码
内容下载和更多交流,尽在
责任编辑:
声明:本文由入驻搜狐号的作者撰写,除搜狐官方账号外,观点仅代表作者本人,不代表搜狐立场。html5利用websocket完成的推送功能(tomcat)_HTML5教程_前端技术
您的位置: &
& 详细内容
插播一条消息,5天后会删掉的
本人东北大学软件学院大三学生,现在正在寻找实习,qq:
利用websocket和java完成的消息推送功能,服务器用的是tomcat7.0,一些东西是自己琢磨的,也不知道恰不恰当,不恰当处,还请各位见谅,并指出。
程序简单来说,就是客户A可以发送消息给客户B,但有很多可以扩展的地方,
1.如果加入数据库后,A发消息时客户B未上线,服务端将会把消息存在数据库中,等客户B上线后,在将消息取出发送给客户B
2.服务端也可发送消息到任意客户端上。
程序的运行效果截图如下(在chrome,搜狗,firefox下测试通过):代码将在最后给出
首先我们打开一个浏览器,显示输入您的名字,这里我输入soar
在打开第二个浏览器,这里我输入bill
这是如果我发送hello bill i am soar给bill,点击send
在另一个浏览器上就可以看到
1.websocket是什么?
WebSocket是为解决客户端与服务端实时通信而产生的技术。其本质是先通过HTTP/HTTPS协议进行握手后创建一个用于交换数据的TCP连接,
此后服务端与客户端通过此TCP连接进行实时通信。
2.websocket的优点
以前我们实现推送技术,用的都是轮询,在特点的时间间隔有浏览器自动发出请求,将服务器的消息主动的拉回来,在这种情况下,我们需要不断的向服务器 发送请求,然而HTTP request
的header是非常长的,里面包含的数据可能只是一个很小的值,这样会占用很多的带宽和服务器资源。会占用大量的带宽和服务器资源。
WebSocket API最伟大之处在于服务器和客户端可以在给定的时间范围内的任意时刻,相互推送信息。在建立连接之后,服务器可以主动传送数据给客户端。
此外,服务器与客户端之间交换的标头信息很小。
WebSocket并不限于以Ajax(或XHR)方式通信,因为Ajax技术需要客户端发起请求,而WebSocket服务器和客户端可以彼此相互推送信息;
关于ajax,comet,websocket的详细介绍,和websocket报文的介绍,大家可以参看& 网页设计]Ajax、Comet与Websocket,
我如果以后有时间,也会写出来的
3.如何使用websocket
在支持WebSocket的浏览器中,在创建socket之后。可以通过onopen,onmessage,onclose即onerror四个事件实现对socket进行响应
一个简单是示例
var ws = new WebSocket(&ws://localhost:8080&);
ws.onopen = function()
& console.log(&open&);
& ws.send(&hello&);
ws.onmessage = function(evt)
& console.log(evt.data)
ws.onclose = function(evt)
& console.log(&WebSocketClosed!&);
ws.onerror = function(evt)
& console.log(&WebSocketError!&);
1.var ws = new WebSocket(&ws://localhost:8080&);
申请一个WebSocket对象,参数是需要连接的服务器端的地址,同http协议使用http://开头一样,WebSocket协议的URL使用ws://开头,另外安全的WebSocket协议使用wss://开头。
ws.send(&hello&);
用于叫消息发送到服务端
2.ws.onopen = function() { console.log(&open&)};
当websocket创建成功时,即会触发onopen事件
3.ws.onmessage = function(evt) { console.log(evt.data) };
当客户端收到服务端发来的消息时,会触发onmessage事件,参数evt.data中包含server传输过来的数据
4.ws.onclose = function(evt) { console.log(&WebSocketClosed!&); };
当客户端收到服务端发送的关闭连接的请求时,触发onclose事件
5.ws.onerror = function(evt) { console.log(&WebSocketError!&); };
如果出现连接,处理,接收,发送数据失败的时候就会触发onerror事件
我们可以看出所有的操作都是采用事件的方式触发的,这样就不会阻塞UI,使得UI有更快的响应时间,得到更好的用户体验。
现在有很多的服务器软件支持websocket,比如node.js,jetty,tomcat等
这里我使用的是tomat 7.0和eclipse4.2
在tomcat下使用websocket首先需要导入相关的jar
tomcat7提供的与WebSocket相关的类均位于包org.apache.catalina.websocket之中(包org.apache.catalina.websocket的实现包含于文件catalina.jar之中
这里我们把tomcat的全部导入就行了
在build path-&configure build path-&librarise-&add library-&server runtime-&apache tomcat v7.0
同时需要import以下包
import org.apache.catalina.websocket.MessageI
import org.apache.catalina.websocket.StreamI
import org.apache.catalina.websocket.WsO
import org.apache.catalina.websocket.WebSocketS
我们需要两个类
第一个用于处理websocket请求
第二个用于处理每一次具体的WebSocket任务
public class SocketServer extends WebSocketServlet {
&&& private static final long serialVersionUID = 1L;
&&& @Override
&&& protected StreamInbound createWebSocketInbound(String arg0,
&&&&&&&&&&& HttpServletRequest arg1) {
&&&&&&& // TODO Auto-generated method stub
&&&&&&& return new ChatWebSocket(users);
这个Servlet继承自WebSocketServlet,实现createWebSocketInbound方法。该方法返回第二个类的实例。
public class ChatWebSocket extends MessageInbound {
&&&&&&& @Override
&&&&&&& protected void onTextMessage(CharBuffer message) throws IOException {
&&&&&&& @Override
&&&&&&& protected void onOpen(WsOutbound outbound) {
&&&&&&&&&&&
&&&&&&& @Override
&&&&&&& protected void onClose(int status) {
&&&&&&&&&&&
&&&&&&& @Override
&&&&&&& protected void onBinaryMessage(ByteBuffer arg0) throws IOException {
protected void onTextMessage(CharBuffer message) throws IOException { }
文本消息响应
protected void onBinaryMessage(ByteBuffer arg0) throws IOException { }
二进制消息响应
protected void onOpen(WsOutbound outbound) { }
建立连接的触发的事件
protected void onClose(int status) { }
关闭连接时触发的事件
4.程序代码
&!DOCTYPE HTML&
&meta charset=&utf-8&&
&script type=&text/javascript& src=&js/jquery.js&&&/script&
&script type=&text/javascript& src=&js/socket.js&&&/script&
&title&无标题文档&/title&
&script language=&javascript&&
&&& &td&Message&/td&
&&& &td&&input type=&text& id=&message&&&/td&
&&& &td&Name&/td&
&&& &td&&input type=&text& id=&othername&&&/td&
&&& &td&&input id=&sendbutton& type=&button& value=&send& onClick=&click&& disabled=&true&&
&&&&& &/input&&/td&
js部分(关于jquery部分不进行讲解)
var username = window.prompt(&输入你的名字:&);
document.write(&Welcome&p id=\&username\&&&+username+&&/p&&);
if (!window.WebSocket && window.MozWebSocket)
&&& window.WebSocket=window.MozWebS
if (!window.WebSocket)
&&& alert(&No Support &);
$(document).ready(function(){
&&&& $(&#sendbutton&).attr(&disabled&, false);
&&&& $(&#sendbutton&).click(sendMessage);
&&& startWebSocket();
function sendMessage()
&&& var othername=$(&#othername&).val();
&&& var msg=&MSG\t&+username+&_&+othername+&_&+$(&#message&).val();
&&& send(msg);
function send(data)
&&& console.log(&Send:&+data);
&&& ws.send(data);
function startWebSocket()
&&& ws = new WebSocket(&ws://& + location.host + &/WebSocket/SocketServer&);
&&& ws.onopen = function(){
&&&&&&& console.log(&success open&);
&&&&&&& $(&#sendbutton&).attr(&disabled&, false);
&&&& ws.onmessage = function(event)
&&&&&&&& console.log(&RECEIVE:&+event.data);
&&&&&&&& handleData(event.data);
&&&&& ws.onclose = function(event) {
&&& console.log("Client notified socket has closed",event);
function handleData(data)
&&& var vals=data.split(&\t&);
&&& var msgType=vals[0];
&&& switch(msgType)
&&& case &NAME&:
&&&&&&& var msg=vals[1];
&&&&&&& var mes=&NAME&+&\t&+msg+&_&+
&&&&&&& send(mes);
&&& case &MSG&:
&&&&&&& var val2s=vals[1].split(&_&);
&&&&&&& var from=val2s[0];
&&&&&&& var message=val2s[2];
&&&&&&& alert(from+&:&+message);
&&& default:
&&&&&&&&&&&
import java.io.IOE
import java.nio.ByteB
import java.nio.CharB
import javax.servlet.http.HttpServletR
import java.util.S
import java.util.concurrent.CopyOnWriteArrayS
import org.apache.catalina.websocket.MessageI
import org.apache.catalina.websocket.StreamI
import org.apache.catalina.websocket.WsO
import org.apache.catalina.websocket.WebSocketS
public class SocketServer extends WebSocketServlet {
&&& private static final long serialVersionUID = 1L;
&&& public final Set&ChatWebSocket& users = new CopyOnWriteArraySet&ChatWebSocket&();
&&& public static int USERNUMBER = 1;
&&& @Override
&&& protected StreamInbound createWebSocketInbound(String arg0,
&&&&&&&&&&& HttpServletRequest arg1) {
&&&&&&& // TODO Auto-generated method stub
&&&&&&& return new ChatWebSocket(users);
&&& public class ChatWebSocket extends MessageInbound {
&&&&&&& private S
&&&&&&& private Set&ChatWebSocket& users = new CopyOnWriteArraySet&ChatWebSocket&();;
&&&&&&& public ChatWebSocket() {
&&&&&&& public ChatWebSocket(Set&ChatWebSocket& users) {
&&&&&&&&&&& this.users =
&&&&&&& @Override
&&&&&&& protected void onTextMessage(CharBuffer message) throws IOException {
&&&&&&&&&&& // 这里处理的是文本数据
&&&&&&& public void onMessage(String data) {
&&&&&&&&&&& String[] val1 = data.split(&\\t&);
&&&&&&&&&&& if(val1[0].equals(&NAME&))
&&&&&&&&&&& {
&&&&&&&&&&&&&&& String[] val2=val1[1].split(&_&);
&&&&&&&&&&&&&&& for(ChatWebSocket user:users){
&&&&&&&&&&&&&&&&&&& if (user.username.equals(val2[0])){
&&&&&&&&&&&&&&&&&&&&&&& user.username=val2[1];
&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&& }
&&&&&&&&&&& }
&&&&&&&&&&& else if(val1[0].equals(&MSG&))
&&&&&&&&&&& {
&&&&&&&&&&&&&&& String[] val2=val1[1].split(&_&);
&&&&&&&&&&&&&&& for(ChatWebSocket user:users){
&&&&&&&&&&&&&&&&&&& if (user.username.equals(val2[1])){
&&&&&&&&&&&&&&&&&&&&&&& try {
&&&&&&&&&&&&&&&&&&&&&&&&&&& CharBuffer temp=CharBuffer.wrap(data);
&&&&&&&&&&&&&&&&&&&&&&&&&&& user.getWsOutbound().writeTextMessage(temp);
&&&&&&&&&&&&&&&&&&&&&&& } catch (IOException e) {
&&&&&&&&&&&&&&&&&&&&&&&&&&& // TODO Auto-generated catch block
&&&&&&&&&&&&&&&&&&&&&&&&&&& e.printStackTrace();
&&&&&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&& }&&&&&&&
&&&&&&&&&&& }
&&&&&&&&&&& else
&&&&&&&&&&& {
&&&&&&&&&&&&&&& System.out.println(&ERROR&);
&&&&&&&&&&& }
&&&&&&& @Override
&&&&&&& protected void onOpen(WsOutbound outbound) {
&&&&&&&&&&& // this.connection=
&&&&&&&&&&& this.username = "#" + String.valueOf(USERNUMBER);
&&&&&&&&&&& USERNUMBER++;
&&&&&&&&&&& try {
&&&&&&&&&&&&&&& String message = &NAME& + &\t& + this.
&&&&&&&&&&&&&&& CharBuffer buffer = CharBuffer.wrap(message);
&&&&&&&&&&&&&&& this.getWsOutbound().writeTextMessage(buffer);
&&&&&&&&&&& } catch (IOException e) {
&&&&&&&&&&&&&&& // TODO Auto-generated catch block
&&&&&&&&&&&&&&& e.printStackTrace();
&&&&&&&&&&& }
&&&&&&&&&&& users.add(this);
&&&&&&& @Override
&&&&&&& protected void onClose(int status) {
&&&&&&&&&&& users.remove(this);
&&&&&&& @Override
&&&&&&& protected void onBinaryMessage(ByteBuffer arg0) throws IOException {
这里我的想法是
1 每个用户在访问的时候首先需要输入自己的名字,接着向服务端发送连接请求
2 服务端在接受到客户端的连接请求后,会new ChatWebSocket(users);用于处理这个请求,并把它加入在线的用户列表中,由于这个时候,服务端尚不知道客户的名字。它会给这个用户假定一个名字,#1,然后服务端会发送&NAME& + &\t& +&#1&给客户端,你叫什么?
3 客户端收到这个消息会知道,服务器在问自己叫什么名字,于是客户端会发送&NAME&+&\t&+&#1&+&_&+ 自己的名字到服务端,(我叫xxx)
4 服务端收到这个消息后根据#1在当前在线的用户列表中进行查找,将#1替换为客户的名字,这样服务端就知道了这个客户的名字了
5 当客户离开时,服务端会触发onClose事件,服务端会把当前用户从在线列表中移除
用图画出来类似这样(画的不好,&_&!!)
ws = new WebSocket(&ws://& + location.host + &/WebSocket/SocketServer&);
连接服务端
protected StreamInbound createWebSocketInbound(String arg0,
&&&&&&&&&&& HttpServletRequest arg1) {
&&&&&&& // TODO Auto-generated method stub
&&&&&&& return new ChatWebSocket(users);
创建一个chatwebsocket用于处理这个请求,触发该chatwebsocket对象的onOpen事件
&&& protected void onOpen(WsOutbound outbound) {
&&&&&&& // this.connection=
&&&&&&& this.username = "#" + String.valueOf(USERNUMBER);
&&&&&&& USERNUMBER++;
&&&&&&& try {
&&&&&&&&&&& String message = &NAME& + &\t& + this.
&&&&&&&&&&& CharBuffer buffer = CharBuffer.wrap(message);
&&&&&&&&&&& this.getWsOutbound().writeTextMessage(buffer);
&&&&&&& } catch (IOException e) {
&&&&&&&&&&& // TODO Auto-generated catch block
&&&&&&&&&&& e.printStackTrace();
&&&&&&& users.add(this);
为这个客户假定一个姓名,并发送NAME+&\t&+假定的姓名& 给该客户端,同时将该客户端加入当前连接的客户列表中
function handleData(data)
&&& var vals=data.split(&\t&);
&&& var msgType=vals[0];
&&& switch(msgType)
&&& case &NAME&:
&&&&&&& var msg=vals[1];
&&&&&&& var mes=&NAME&+&\t&+msg+&_&+
&&&&&&& send(mes);
&& //&&&&&&&&&&&&&&
接受并处理服务端发来到的消息,发现是服务端问自己叫什么名字,于是发送&NAME&+&\t&+假定的名字+&_&+ 真正的名字 给服务端
public void onMessage(String data) {
&&&&&&& String[] val1 = data.split(&\\t&);
&&&&&&& if(val1[0].equals(&NAME&))
&&&&&&&&&&& String[] val2=val1[1].split(&_&);
&&&&&&&&&&& for(ChatWebSocket user:users){
&&&&&&&&&&&&&&& if (user.username.equals(val2[0])){
&&&&&&&&&&&&&&&&&&& user.username=val2[1];
&&&&&&&&&&&&&&& }
&&&&&&&&&&& }
处理并接受客户端发来的消息,发现是客户端回复自己叫什么名字,于是在根据先前假定的名字在当前连接的客户列表中进行查找,将假名变成真名
function sendMessage()
&&& var othername=$(&#othername&).val();
&&& var msg=&MSG\t&+username+&_&+othername+&_&+$(&#message&).val();
&&& send(msg);
客户对另一个人发起对话,消息格式为:&MSG&+自己的名字+_+对方的名字+_+消息
public void onMessage(String data) {
&&&&&& ///&&&&
&&&&&&& else if(val1[0].equals(&MSG&))
&&&&&&&&&&& String[] val2=val1[1].split(&_&);
&&&&&&&&&&& for(ChatWebSocket user:users){
&&&&&&&&&&&&&&& if (user.username.equals(val2[1])){
&&&&&&&&&&&&&&&&&&& try {
&&&&&&&&&&&&&&&&&&&&&&& CharBuffer temp=CharBuffer.wrap(data);
&&&&&&&&&&&&&&&&&&&&&&& user.getWsOutbound().writeTextMessage(temp);
&&&&&&&&&&&&&&&&&&& } catch (IOException e) {
&&&&&&&&&&&&&&&&&&&&&&& // TODO Auto-generated catch block
&&&&&&&&&&&&&&&&&&&&&&& e.printStackTrace();
&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&& }
&&&&&&&&&&& }&&&&&&&
&&&&&& ///&&&&
发现是客户发送的消息,根据对方的姓名,在当前连接的客户列表中查找,并将消息发给他
function handleData(data)
&&& var vals=data.split(&\t&);
&&& var msgType=vals[0];
&&& switch(msgType)
&&& case &MSG&:
&&&&&&& var val2s=vals[1].split(&_&);
&&&&&&& var from=val2s[0];
&&&&&&& var message=val2s[2];
&&&&&&& alert(from+&:&+message);
&&& default:
&&&&&&&&&&&
发现是另一个客户发来的消息,通过alert显示出来
&&&&&&& protected void onClose(int status) {
&&&&&&&&&&& users.remove(this);
发现客户离开了,将客户从连接的客户列表中移除
可以改进的地方
1.若客户端A发送消息给B时,B不在线,可将消息存入数据库中,当发现B上线时,从数据库中取出,发送给B
2 服务端发送你叫什么时,可加入超时机制,若客户端一定时间内没有回复自己叫什么,则可将该客户从在线列表中删掉
( 16:54:59)
( 16:54:52)
( 13:46:01)
( 14:11:45)
( 14:11:43)
( 14:11:42)
( 14:11:35)
( 14:11:33)
相关排行总榜

我要回帖

更多关于 怎么才能注册公司 的文章

 

随机推荐