使用Java搭建小程序WebSocket服务器

最近参加了一些计算机比赛,我们队根据题目要求制作了一个使用微信小程序作为客户端的实时社交应用系统,使用 Java 开发服务器端。因为小程序只支持 Https 和 WebSocket 方式与服务器交互,同时题目要求小程序具有实时通讯的功能(例如实时消息),所以我们使用 WebSocket 实现实时交互。

我们都知道,目前的网络应用大部分是客户端/服务器(Client/Server,C/S)架构,客户端可以使用 HTTP 协议去获取服务器端的内容,使用 HTTP 协议一定是客户端主动地去向服务器发出请求,服务器根据客户端的请求来返回相应的内容。传统的网站以及对信息实时性要求不高的网络应用使用 HTTP 协议获取内容是很好的选择,但是对于具有实时通讯功能(用户彼此实时交流)的应用来说,更好的选择是 WebSocket 协议。WebSocket 协议可以使客户端与服务器保持连接,并打破了只能是客户端主动获取服务器内容的局限,服务器可以主动向客户端推送信息,形成双向的信息流。

在 Java 平台使用 WebSocket 也是非常方便的,Java Specification Requests(JSR)标准中的 JSR356(https://jcp.org/en/jsr/detail?id=356)叙述了 WebSocket 的 Java API 使用方式,遵循这套模型开发的 WebSocket 代码,可以在不同的应用容器中运行(例如 Tomcat),应用容器 WebSocket 部分的实现都遵循这套标准。

对 JSR356 的简介如下:

JSR 356, Java API for WebSocket, specifies the API that Java developers can use when they want to integrate WebSockets into their applications—both on the server side as well as on the Java client side. Every implementation of the WebSocket protocol that claims to be compliant with JSR 356 must implement this API. As a consequence, developers can write their WebSocket-based applications independent of the underlying WebSocket implementation. This is a huge benefit, because it prevents a vendor-lock and allows for more choices and freedom of libraries and application servers.

一、编写 WebSocket 服务器

@ServerEndpoint(value=”/path/to/endpoint”)注解(类)

@OnOpen注解(方法)

@OnMessage注解(方法)

@OnClose注解(方法)

@OnError注解(方法)

@ServerEndpoint(value=”/path/to/endpoint”)

此注解用于标记实现 WebSocket 端点的类,即用于处理 WebSocket 消息、WebSocket 连接、WebSocket 异常的类。被此注解标记的类,会被 Tomcat 用于处理由客户端发起的 WebSocket 连接,具体对于连接进行处理的方式被定义在此类的各个方法中。

注解中的 value 属性的值定义了 WebSocket 端点在服务器上的访问路径,例如若服务器的域名为 maphical.cn,且 value 的值为“/path/to/endpoint”,则访问 WebSocket 端点的链接为“wss://maphical.cn/path/to/endpoint”。

@OnOpen

此注解标记用于处理新 WebSocket 连接的方法,当 Tomcat 接收到新的连接请求并建立连接后,将会调用此方法。此注解标记的方法在 WebSocket 服务中一般被用来将新会话保存进类中维护的会话列表中,使得系统能够在后续发送消息是能够根据 Session ID 找到相应的会话对象。同时也可以在此方法中维护 WebSocket 客户端连接数量等附加信息。

@OnMessage

此注解标记的方法用于处理 WebSocket 会话发送到服务器的消息,消息内容将会被以字符串参数的形式传入方法(上述代码中的 mess 参数)。当 Tomcat 接收到一条来自某个会话的消息后,会调用此方法并将消息内容与发送消息的会话对象作为参数一同传入方法中,之后的处理是由程序员的代码来完成。对于实时通讯类应用服务器来说,这个方法的通常用途是作为消息中转站,将接收到的消息进行处理转发到目标客户端。

@OnClose

此注解标记的方法用于处理 WebSocket 连接的关闭,当 Tomcat 关闭或者客户端即将关闭某个链接时,将会调用此方法,并将即将被关闭的会话对象作为参数传入(上述代码中的 sess 参数)。此方法的一般用途为,进行连接被关闭时的清理工作,例如从会话列表中删除即将关闭的会话等。

@OnError

此注解标记的方法用于处理其它过程中产生的异常,当发生异常时 Tomcat 会调用此方法,并将发生异常的会话对象以及异常对象作为参数传入方法中(上述代码中的 sess 和 e 参数)。此方法的一般用途为,通知客户端服务器发生异常,并为异常进行清理工作和日志的记录等。

二、部署 WebSocket 服务器

将端点类编写完毕之后,不需要改动其他的配置文件等,直接将项目打包成 war 文件并上传到 Tomcat 即可自动部署,服务器会自动识别代码中的注解,部署完毕后即可使用 WebSocket 客户端(如小程序等)连接 WebSocket 端点进行测试。

需要说明的是,小程序不支持没有进行 SSL 加密的 WebSocket 连接,需要提前在服务器上部署并配置域名 SSL 证书,并使用 wss:// 进行访问(wss 意为经过 SSL 加密的 WebSocket 协议,ws 意为没有经过 SSL 加密的 WebSocket 协议)。

WebSocket 的连接建立使用 HTTP 头,在建立 TCP 连接之后,服务器根据 HTTP 头部中的信息切换到 WebSocket 协议,所以 ws 默认使用 80 端口,wss 默认使用 443 端口。若你的服务器已经为 HTTPS 配置好了 SSL 证书和端口,那就可以直接使用 wss 协议访问 WebSocket 端点。

以上。

  • 发表于:
  • 原文链接:https://kuaibao.qq.com/s/20181124G1MC6500?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

同媒体快讯

扫码关注云+社区

领取腾讯云代金券