大家好,欢迎踏入野生程序猿的生存之道,我是你们的老朋友大猿!

之前已经给大家介绍了websocket的适用场景及前台实现一一【前端提升,不玩虚的!让你轻松理解啥是websocket】,今天为大家带来了websocket的JAVA后台实现。

环境

java:websocket是servlet 3.1的技术,所以JDK需要7或更高版本。

tomcat:从7.0.27开始支持websocket,但是7和8对websocket的实现有很大差异,我建议用tomcat8,开发简单高效。本文中的代码示例也是运行在8上的。(WebLogic从12.1.2开始也支持websocket)

依赖:websocket-api.jar

实现

tomcat8下的websocket实现真的非常非常简单,先上代码:



最关键的一行代码:@ServerEndpoint("/myWebSocket")

ServerEndpoint是JavaEE标准里的注解,当类添加了ServerEndpoint注解时,工程在启动的时候就会注册websocket服务,注解的入参即服务的请求地址。每连入一个客户端,都会产生一个MyWebSocket实例,这个实例会在连接关闭时销毁。

@OnOpen

连接建立成功后调用的方法。这个方法里通常是对会话的一些配置。

@OnClose

连接关闭时调用的方法。连接关闭后,实例会随之销毁。

@OnError

连接出错时调用的方法。这个方法里我们通常会实现一些日志记录的逻辑。

@OnMessage

客户端(浏览器)发来消息时会触发此方法。其中入参message就是我们上一节提到的消息体,session就是该客户端对应的websocket会话实例。示例中,消息体里我们约定了个参数“msg_type”,用来区分客户端发来的各种类型的消息。示例中实现了简单的登录和单聊逻辑。


其他的方法基本上结合注释就能看懂了。假设我现在要给A发消息,我们来梳理一下它是怎么运行的,步骤如下:

1、我打开浏览器,访问了这个网站,并录入用户名密码,点击登录。2、登录事件执行js脚本建立了一个websocket连接。3、连接建立成功后触发了后台的@onOpen方法和前台的ws.onopen方法。4、前台的onopen方法里向服务器发送了如下消息体:{'userID':'dayuan','password':'ps123','msg_type':'01'}5、后台的@OnMessage方法接收到了前台的消息,并由msg_type判断出这个消息是登录动作,于是走到了doLogon方法中。6、doLogon方法经过身份验证后,将此连接实例存入了Hashtable类型的容器wsTable中,登录完成。7、我在浏览器里找到好友A,打开对话框输入“你好”,并点击发送。8、发送事件执行js:ws.send("{'toID':'A','text':'你好','msg_type':'02'}");9、后台的@OnMessage方法接收到了前台的消息,并由msg_type判断出这个消息是聊天,于是走到了doChat方法。10、doChat方法根据toID从wsTable中拿到了A的连接实例,并调用A的sendMessage方法将消息发送到了A的浏览器。(wsTable中A的连接实例是在A登录时放进去的)11、A的浏览器里收到服务器的消息后,触发了ws.onmessage方法,并展示到了A的页面中。

不要被这些步骤吓到,理解了其实很简单,我告诉服务器我要给A发消息,服务器找到A的连接实例,并通过这个实例向A的浏览器发消息,就这么简单。

好了小伙伴们,你们学会了吗?点我头像能学习更多实用的开发小技巧,别忘了点关注哦~