博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
2.WebSocket编程—生命周期
阅读量:6245 次
发布时间:2019-06-22

本文共 3425 字,大约阅读时间需要 11 分钟。

hot3.png

WebSocket的生命周期

    WebSocket的端点,以事件的角度看,有四个生命周期事件:

  1. 打开事件:此事件发生在端点上建立连接时并且在任何其他事件发生之前;
  2. 消息事件:此事件在接收WebSocket对话中另一端发送的消息。它可以发生在WebSocket端点接收了打开事件之后并且在接收关闭事件关闭之前的任何时刻发生;
  3. 错误事件:此事件在WebSocket连接或端点发生错误时发生;
  4. 关闭事件:此事件在WebSocket连接或者端点发生错误时发生;

    以注解来声明这的话,可以用@OnOpen、@OnMessage、@OnError和@OnClose这四个注解。

    以一个例子来体现WebSocket的生命周期:

    点击打开连接按钮,与端点进行连接,这个时候会执行@OnOpen修饰的函数。

    点击发送消息,向端点发送文本框中的内容,这个时候会执行@OnMessage修饰的函数。

    点击关闭客户端连接按钮,客户端终端与端点的连接,这个时候会调用@OnClick修饰的函数。

    点击关闭服务端连接:

    端点关闭连接,关闭时大多数会产生一个异常会执行由@OnError修饰的函数,具体代码如下:

4.0.0
cn.net.bysoft
websocketapp
0.0.1-SNAPSHOT
war
javax.servlet
javax.servlet-api
3.0.1
javax.servlet
jstl
1.2
javax
javaee-api
7.0
javax.websocket
javax.websocket-api
1.0
provided

    服务端代码:

package cn.net.bysoft.websocketapp.lesson2;import java.io.IOException;import javax.websocket.OnClose;import javax.websocket.OnError;import javax.websocket.OnMessage;import javax.websocket.OnOpen;import javax.websocket.Session;import javax.websocket.server.ServerEndpoint;@ServerEndpoint("/lifecycle")public class LifeCycle {	private static String START_TIME = "Start Time";	private Session ws_session;	@OnOpen	public void onOpen(Session ws_session) {		// 设置session,并记录建立连接时间		this.ws_session = ws_session;		ws_session.getUserProperties().put(START_TIME, System.currentTimeMillis());		// 通知客户端连接成功		this.sendMessage("success:opened.");	}	@OnMessage	public void onMessage(String message) {		// 如果客户端发送过来close,则关闭连接		if ("close".equals(message)) {			try {				// 关闭前向客户端发送消息				this.sendMessage("danger:server closing after " + this.getConnectionSeconds() + "s.");				// 关闭连接				ws_session.close();			} catch (IOException e) {				System.out.println("Method: onMessage, Error closeing session " + e.getMessage());			}			return;		}		// 如果消息不是close,则正常处理,处理完毕后通知客户端		this.sendMessage("info:processed a message.");	}	@OnError	public void onError(Throwable t) {		// 发生异常时,如果连接还是打开状态,则通知客户端错误信息		if (ws_session.isOpen()) {			this.sendMessage("warning:Error:" + t.getMessage());		}	}	@OnClose	public void onClose() {		// 关闭连接时,需要做的事情在该函数内完成,例如关闭数据库连接等		System.out.println("serivce close.");	}	private void sendMessage(String message) {		try {			// 以同步的方式向客户端发送消息			ws_session.getBasicRemote().sendText(message);		} catch (IOException e) {			System.out.println("Method: sendMessage, Error closeing session " + e.getMessage());		}	}	private int getConnectionSeconds() {		long millis = System.currentTimeMillis() - ((Long) this.ws_session.getUserProperties().get(START_TIME));		return (int) millis / 1000;	}}

    客户端代码:

Insert title here

WebSocket的生命周期

源码地址:

转载于:https://my.oschina.net/u/2981366/blog/777056

你可能感兴趣的文章
网页总结
查看>>
我用过的那些电脑 -- 致逝去的美好时光
查看>>
SQLiteOpenHelper学习
查看>>
Tomcat路径下目录的介绍
查看>>
TopCoder SRM 628 DIV 2
查看>>
实验吧_简单的sql注入_1、2、3
查看>>
BZOJ3779重组病毒LCT
查看>>
T-SQL (一)
查看>>
词法分析
查看>>
安装laravel框架
查看>>
Linux 目录结构
查看>>
第二次实验
查看>>
R中,求五数,最小值、下四分位数、中位数、上四分位数、最大值
查看>>
【python-Day3】
查看>>
接上一篇——上海有哪些值得加入的互联网公司
查看>>
VFS相关内容
查看>>
【转载】同步和互斥的POSIX支持(互斥锁,条件变量,自旋锁)
查看>>
+load和+initialize的区别
查看>>
hdu 1319 Prime Cuts
查看>>
Effective_STL 学习笔记(二十四) 当关乎效率时应该在 map::operator[] 和 map-insert 之间仔细选择...
查看>>