怎么在服务器上加websocket协议,教你怎么使⽤Java实现
WebSocket
⼀、WebSocket简介
WebSocket协议通过在客户端和服务端之间提供全双⼯通信来进⾏Web和服务器的交互功能。
在WebSocket应⽤程序中,服务器发布WebSocket端点,客户端使⽤url连接到服务器。建⽴连接后,服务器和客户端就可以互相发送消息。客户端通常连接到⼀台服务器,服务器接受多个客户端的连接。
1.1 WebSocket协议
WebSocket协议有两个部分:握⼿和传输。客户端通过向服务端URL发送握⼿请求来建⽴连接。握⼿与现有的基于HTTP的基础结构相兼容。Web服务器将其解释为升级版的HTTP连接请求。
⼀个客户端建⽴连接的握⼿请求:
GET /path/to/websocket/endpoint HTTP/1.1
Host: localhost
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: xqBt3ImNzJbYqRINxEFlkg==
Sec-WebSocket-Version: 13
⼀个服务端响应:
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: K7DJLdLooIwIG/MOpvWFB3y3FE8=
从上⾯的请求和响应中可以看出来,⼀个WebSocket连接的建⽴,需要客户端和服务端维护⼀个Key来作为该连接的连接凭证。
客户端向服务端发送WebSocketKey,服务器根据WebSocketKey⽣成WebSocketAccept返回给客户端,客户端对WebSocketKey的值再进⾏相同的操作,如果与服务器返回的Accept的值相匹配,就表⽰握⼿成功。握⼿之后客户端与服务端就互相发送消息。
1.2 WebSocket⽀持的消息类型
WebSocket⽀持⽂本消息(UTF-8编码)和⼆进制消息。WebSocket的控制消息由Close、Ping、Pong组成。ping和pong也有可能包含应⽤程序信息。
webSocket端点具有如下的URI形式表⽰:
ws://host:port/path?query
wss://host:port/path?query
ws代表未加密的连接,默认端⼝是80
wss代表加密的连接,默认端⼝是443
path:表⽰服务器内端点的位置
⼆、创建⼀个WebSocket程序
创建和部署WebSocket端点的过程如下:
1、创建⼀个端点类
2、实现端点的⽣命周期⽅法
3、将业务逻辑添加到端点
4、将端点部署到Web应⽤程序中
注意:与Servlet相反,WebSocket端点类会被实例化多次,容器针对与其部署的URI的每个连接都创建⼀个实例。每个实例都与⼀个连接相关联。因为在任何时间都只有⼀个线程执⾏端点实例的代码,所以有助于保持每个连接的⽤户状态简化开发。
2.1 ⽣命周期⽅法
EndPoint类中定义了三个⽣命周期⽅法:onOpen、onClose、onError
使⽤注解⽅式创建服务类
@ServerEndpoint("/echo")
public class EchoEndpoint {
@OnMessage
public void onMessage(Session session, String msg) {
try {
} catch (IOException e) { ... }
}
}
2.2 业务逻辑⽅法
@ServerEndpoint("/receive")
public class ReceiveEndpoint {
@OnMessage
public void textMessage(Session session, String msg) {
System.out.println("Text message: " + msg);
}
@OnMessage
public void binaryMessage(Session session, ByteBuffer msg) {
System.out.println("Binary message: " + String());
}
@OnMessage
public void pongMessage(Session session, PongMessage msg) {
}
}
注意:⼀个服务类最多可以有三个OnMessage注解,每个消息类型分别使⽤⼀种⽅法:Text、Binary、Pong
2.3 维护客户状态
有时在程序中我们可能需要在连接中维护⼀些⽤户参数,WebSocket也提供了这样的服务
如果要存储所有连接的客户端共有的信息,可以使⽤静态变量,但是需要⽤户保证对数据的线程安全访问。
@ServerEndpoint("/delayedecho")
public class DelayedEchoEndpoint {
@OnOpen
public void open(Session session) {
}
@OnMessage
public void message(Session session, String msg) {
String prev = (String) UserProperties()
.get("previousMsg");
try {
} catch (IOException e) { ... }
}
}
2.4 数据格式的编码与解码
由于客户端和服务端交互可能涉及数据格式的转换,所以提供了Decoder和Encoder的⽅式解决。
同时由于WebSocket的@Message注解只能有⼀个⽤来传输Text信息或Binary信息,所以要进⾏最常⽤的Json->entity转换解析就需要该⽅法
Encoder
Encoder.Text ⽤于⽂本消息Encoder.Binary ⽤于⼆进制消息
使⽤⽅法:
1、创建编解码类
public class MessageATextEncoder implements Encoder.Text {
public void init(EndpointConfig ec) { }
@Override
public void destroy() { }
@Override
public String encode(MessageA msgA) throws EncodeException {
// Access msgA's properties and convert to
return msgAJsonString;
}
}
2、在端点类注解中添加该Encoder
@ServerEndpoint(
value = "/myendpoint",
encoders = { MessageATextEncoder.class, MessageBTextEncoder.class }
)
public class EncEndpoint { ... }
3、这时候就可以发送MessageA和MessageB两种类型的Text数据
MessageA msgA = new MessageA(...);
MessageB msgB = new MessageB(...);
注意:webSocket会⾃动寻使⽤哪种编码器,所以发送数据统⼀使⽤sendObject即可
Decoder
实现Decoder以将WebSocket消息转换为Java对象
Decoder.Text ⽤于⽂本消息
Decoder.Binary ⽤于⼆进制消息
使⽤⽅法
与Encoder类似
注意:与Encoder不同,Decoder最多可以指定⼀个Binary和⼀个Text类型的Decoder,如果有两种以上的Java类型作为⽂本消息进⾏发送和接收需要进⾏定义处理。可以使多个消息继承⼀个公共的消息⽗类
1、编写Decoder类,对收到消息类型的不同进⾏不同的解码
public class MessageTextDecoder implements Decoder.Text {
@Override
public void init(EndpointConfig ec) { }
public void destroy() { }
@Override
public Message decode(String string) throws DecodeException {
//
if ( /* message is an A message */ )
java源代码加密return new MessageA(...);
else if ( /* message is a B message */ )
return new MessageB(...);
}
@Override
public boolean willDecode(String string) {
// Determine if the message can be converted into either a
// MessageA object or a
return canDecode;
}
}
2、在端点类中添加decoders={MessageDecoder.class}
@ServerEndpoint(
value = "/myendpoint",
encoders = { MessageATextEncoder.class, MessageBTextEncoder.class },
decoders = { MessageTextDecoder.class }
)
public class EncDecEndpoint { ... }
3、在@OnMessage⽅法中使⽤
@OnMessage
public void message(Session session, Message msg) {
if (msg instanceof MessageA) {
// We received a
} else if (msg instanceof MessageB) {
// We received a
}
}
到此这篇关于教你怎么使⽤Java WebSocket的⽂章就介绍到这了,更多相关Java WebSocket详解内
容请搜索脚本之家以前的⽂章或继续
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论