WebSocket的实现原理
Posted Kelly-Li
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WebSocket的实现原理相关的知识,希望对你有一定的参考价值。
1、客户端(浏览器)实现
(1)webSocket对象
实现WebSocket对象的web浏览器通过WebSocket对象公开所有必需的客户端功能。
创建WebSocket对象
var ws = new WebSocket(url);
//url格式:ws://ip地址:端口号/资源名称
(2)webSocket事件
webSocket相关的事件,浏览器与服务器建立连接、如何接收服务器消息、如何向服务器发送消息(这个使用的是webSocket对象中的方法)等事件描述。
事件 | 事件处理程序 | 描述 |
---|---|---|
open | webSocket对象.onopen | 连接建立时触发 |
message | webSocket对象.onmessage | 客户端接收服务端数据时触发 |
error | webSocket对象.onerror | 通信发生错误时触发 |
close | webSocket对象.onclose | 连接关闭时触发 |
(3)webSocket方法
方法 | 描述 |
---|---|
send() | 客户端向服务器端发送数据时的方法 |
2、服务器端的实现
前提:Tomcat 7.0.5版本后才开始支持WebSocket。
Java WebSocket应用由一系列的WebSocketEndpoint组成。
(1) Endpoint对象
Endpoint是Java中的一个对象,代表WebSocket链接的一端(每一个客户端需要创建一个Endpoint对象)
对于服务器端,Endpoint对象可以看作是处理WebSocket消息的接口。===类似Servlet与HTTP请求中的Servlet
(2)Endpoint对象的定义
两种方式定义Endpoint对象。
- 编程式,通过代码编程,继承类Javax.websocket.Endpoint并实现其方法;
- 注解式,通过定义一个POJO类,并使用**@ServerEndpoint**相关注解。
Endpoint对象实例在WebSocket握手时创建,并在客户端与服务端链接过程中有效,最后在链接关闭时结束。
在Endpoint接口中明确定义了与生命周期相关的方法。
方法 | 含义描述 | 对应注解 |
---|---|---|
onClose() | 当会话关闭时调用 | @Onclose |
onOpen() | 当开启一个新的会话时调用,该方法是客户端与服务端握手成功后调用的方法 | @OnOpen |
onError() | 当连接过程中异常时调用 | @OnError |
(3)服务端如何接收客户端发送的数据?
通过为Session添加MessageHandler消息处理器来接收消息。
当采用注解方式定义Endpoint时,可以使用**@OnMessage**注解指定接收消息的方法。
(4)服务器端如何推送数据给客户端?
服务器向客户端发送消息由RemoteEndpoint完成,其实例由Session维护,根据使用情况,可以通过Session.getBasicRemote获取同步消息发送的实例,然后调用sendXxx()方法就可以发送消息。可以通过Session.getAsyncRemote获取异步消息发送实例。
简易聊天室服务端代码实例:
import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.HashSet;
import java.util.Set;
@ServerEndpoint("\\robin")
public class chatEndPoint {
private static Set<chatEndPoint> webSocketSet = new HashSet<chatEndPoint>();
private Session session;
/**
* 接收到客户端发送过来的消息时,该方法自动调用。
* @param message 接收到的客户端发送过来的消息。
* @param session
* @throws IOException
*/
@OnMessage
public void onMessage(String message,Session session) throws IOException {
System.out.println("接收的消息是:"+message);
System.out.println(session);
//将消息发送给其他的用户
for(chatEndPoint chat:webSocketSet){
if (chat != this){
chat.session.getBasicRemote().sendText(message);
}
}
}
/**
* 建立连接时,自动调用
* @param session
*/
@OnOpen
public void onOpen(Session session){
this.session = session;
webSocketSet.add(this);
}
/**
* 建立关闭时,自动调用
* @param session
*/
@OnClose
public void onClose(Session session){
System.out.println("连接关闭了....");
}
/**
* 建立出错时,自动调用
* @param session
*/
@OnError
public void onError(Session session,Throwable error){
System.out.println("出错了...."+error.getMessage());
}
}
以上是关于WebSocket的实现原理的主要内容,如果未能解决你的问题,请参考以下文章