文档章节

Java8 + Tomcat8 实现Websocket 例子

netkiller-
 netkiller-
发布于 2016/05/06 09:23
字数 650
阅读 1893
收藏 71

背景

公司网站上线需要一个实时报价功能,于是想到了 Websocket, 我在多年前就尝试过Websocket 那时 HTML5标准尚未产生,各家实现均有不同,Websocket 版本也非常多,实现兼容也比较复杂,于是放弃Websocket。最近看到Websocket 开始流行起来,兼容也不再是障碍。

以下节选自《Netkiller Java 手札》,下面例子实现一个简单的 Echo Server


第 7 章 WebSocket

环境:Java8 + Tomcat8

7.1. Server

package websocket;

/**
 * Websocket Server
 * 
 * @author netkiller<netkiller@msn.com>
 */

import java.util.Collections;
import java.util.HashSet;
import java.util.Set;

import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;

@ServerEndpoint(value = "/echo")
public class PriceServer {

	private Set<Session> sessions = Collections.synchronizedSet(new HashSet<Session>());

	/**
	 * Callback hook for Connection open events. This method will be invoked
	 * when a client requests for a WebSocket connection.
	 * 
	 * @param session
	 *            the session which is opened.
	 */
	@OnOpen
	public void onOpen(Session session) {
		sessions.add(session);
	}

	/**
	 * Callback hook for Connection close events. This method will be invoked
	 * when a client closes a WebSocket connection.
	 * 
	 * @param session
	 *            the session which is opened.
	 */
	@OnClose
	public void onClose(Session session) {
		sessions.remove(session);
	}

	/**
	 * Callback hook for Message Events. This method will be invoked when a
	 * client send a message.
	 * 
	 * @param message
	 *            The text message
	 * @param session
	 *            The session of the client
	 */
	@OnMessage
	public void onMessage(String message, Session session) {
		System.out.println("Message Received: " + message);
		for (Session remote : sessions) {
			System.out.println("Sending to " + remote.getId());
			remote.getAsyncRemote().sendText(message);
		}
	}
}



第 7 章 WebSocket

环境:Java8 + Tomcat8

7.1. Server

package websocket;

/**
 * Websocket Server
 * 
 * @author netkiller<netkiller@msn.com>
 */

import java.util.Collections;
import java.util.HashSet;
import java.util.Set;

import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;

@ServerEndpoint(value = "/echo")
public class PriceServer {

	private Set<Session> sessions = Collections.synchronizedSet(new HashSet<Session>());

	/**
	 * Callback hook for Connection open events. This method will be invoked
	 * when a client requests for a WebSocket connection.
	 * 
	 * @param session
	 *            the session which is opened.
	 */
	@OnOpen
	public void onOpen(Session session) {
		sessions.add(session);
	}

	/**
	 * Callback hook for Connection close events. This method will be invoked
	 * when a client closes a WebSocket connection.
	 * 
	 * @param session
	 *            the session which is opened.
	 */
	@OnClose
	public void onClose(Session session) {
		sessions.remove(session);
	}

	/**
	 * Callback hook for Message Events. This method will be invoked when a
	 * client send a message.
	 * 
	 * @param message
	 *            The text message
	 * @param session
	 *            The session of the client
	 */
	@OnMessage
	public void onMessage(String message, Session session) {
		System.out.println("Message Received: " + message);
		for (Session remote : sessions) {
			System.out.println("Sending to " + remote.getId());
			remote.getAsyncRemote().sendText(message);
		}
	}
}



7.2. Client

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

	<script language="JavaScript">
		var wsuri = "ws://localhost:8080/m.example.com/echo";
		var ws = null;

		function connectEndpoint() {
			ws = new WebSocket(wsuri);
			ws.onmessage = function(evt) {
				//alert(evt.data);
				document.getElementById("echo").value = evt.data;
			};

			ws.onclose = function(evt) {
				//alert("close");
				document.getElementById("echo").value = "end";
			};

			ws.onopen = function(evt) {
				//alert("open");
				document.getElementById("echo").value = "open";
			};
		}

		function sendmsg() {
			ws.send(document.getElementById("send").value);
		}
	</script>
<body onload="connectEndpoint()">
	<input type="text" size="20" value="5" id="send">
	<input type="button" value="send" onclick="sendmsg()">
	<br>
	<input type="text" id="echo">
</body>
</html>


© 著作权归作者所有

共有 人打赏支持
netkiller-

netkiller-

粉丝 693
博文 264
码字总数 368425
作品 10
深圳
部门经理
私信 提问
加载中

评论(4)

单行道
单行道
mark
MartinBockZhu
MartinBockZhu
mark
netkiller-
netkiller-

引用来自“只为老婆改变”的评论

这个兼容性怎么样?可以兼容到IE7么?还是只能在H5上面运行?
IE7 真没有试过
独孤夜魂
独孤夜魂
这个兼容性怎么样?可以兼容到IE7么?还是只能在H5上面运行?
tomcat8+websocket演示

tomcat8真正支持jsr-356(包含对websocket的支持), tomcat7部分版本的websocket实现不兼容jsr-356。 需要注意websocket与浏览器的兼容问题,有些早期版本的浏览器支持旧版本的websocket协议,...

爱喝貓的咖啡
2014/03/03
0
7
WebSocket连接失败(Java) Error during WebSocket handshake: Unexpected response code: 400

项目名 chat 端口号8080 访问路径:"ws://localhost:8080/websocket" jdk :1.8, Maven配置的tomcat是tomcat8, POM.xml添加了javax.websocket-api,spring-websocket和javax.servlet-api(provi......

今天天气不错啊
2018/01/11
2.5K
2
WebSocket之怎么将http和ws端口不共用或模块分离?

各位:   有问题请教大家。   因为http协议只是做WebSocket的握手,真正通信还是ws(即tcp协议)。   因此,为了考虑低耦合。我想法如下:   1)http:可能用tomcat8,因为其实现了W...

hillshills
2014/09/18
2.2K
3
tomcat8 有没有实现websocket客户端协议,可以发起一个websocket连接

tomcat8 有没有实现websocket客户端协议,可以发起一个websocket连接?

cyb_beta
2014/05/13
385
1
对于不支持websocket的采用何种方式替代?ScokJs

用tomcat作为服务器端,客户端浏览器支持就直接采用websocket,但有些客户端浏览器不支持,采用什么方式替代好呢,用了sockJs,怎么不起作用了? var sock = new SockJS("/msgChannel"); sock...

阿森lin1991
2014/09/19
2.4K
2

没有更多内容

加载失败,请刷新页面

加载更多

《1984》读后感作文4000字

《1984》读后感作文4000字: 新年的第一天,开始阅读Gorge Owell的政治寓言小说。以前阅读的是上译的董乐山的译本,也拜读过刘绍铭的译本,两人在翻译上各有千秋。董先生的译本显得有些压抑严...

原创小博客
17分钟前
1
0
Django集成Markdown编辑器【附源码】

专注内容写作的你一定不要错过markdown 简单介绍 markdown是一种标记语言,通过简单的标记语法可以使普通的文本内容具有一定的格式,使用非常简单,学习成本极低 目前各大Blog平台都已支持m...

运维咖啡吧
35分钟前
1
0
C++中虚函数的作用是什么?它应该怎么用呢?

C++中虚函数的作用: 1、简单地说,那些被virtual关键字修饰的成员函数,就是虚函数。 2、实现多态性,多态性是将接口与实现进行分离。 3、当基类指针指向一个子类对象,通过这个指针调用子类...

天王盖地虎626
39分钟前
0
0
简单聊聊Linux学习经历

学习,是我们一生中都规避不了的一个话题,人的一生中都是在不断的学习,无论是功成名就的人士,还是一无是处的小混混,始终都处在一个不断学习的环境中,只是学习的内容千差万别,有的人是为...

linuxprobe16
39分钟前
2
0
面试之ssm粗略简答

说实在的,spring源码对我来说可能就是报错的时候会一个个点进去找错误源头,其他都是为了让自己学习大神们优秀的编程思想和理念(顺便面试的时候吹吹牛皮~) 这次zhjj就直接抛了一个范围很...

无极之岚
45分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部