websocket协议的优点
(1)因为连接在端口80(ws)或者443(wss)上创建,与HTTP使用的端口相同,几乎所有的防火墙都不会阻塞WebSocket链接
(2)因为它使用HTTP 进行握手,所以该协议可以自然地集成到网络浏览器和HTTP服务器中
(3)心跳消息(称为ping和pong)将反复被发送,保持WebSocket连接几乎一直处于活跃状态。基本上,一个节点周期性地发送一个小数据包另一个节点(ping),而另一个节点则使用包含了相同数据的数据包作为响应(pong)。这将使这两个节点处于连接状态
(4)该协议将代表你构建消息(不需要额外的代码),这样当消息启动和它的内容到达时,服务器和客户端都可以知道。
(5)WebSocket连接关闭时将发送一个特殊的关闭消息,其中可以包含原因代码和用语解释连接被关闭原因的文本
(6)WebSocket协议可以安全地支持跨域连接,避免Ajax和XMLHttpRequest上的限制
(7)HTTP规范要求浏览器将并发连接数限制为每个主机名两个连接,但是在我手完成之后该限制就不再存在,因为此时连接已经不再是HTTP连接了
websocket的用途
(1)JavaScript聊天
(2)多人在线游戏
(3)在线股票网站
(4)在线即时新闻网站
(5)高清视频流
(6)应用程序群集节点之间的通信
(7)在应用程序之间跨网络传输大量事务数据
(8)远程系统或者软件状态和性能的实时监控
环境
实现了 服务端向客户端的双向推送
服务端使用java + tomcat 7.0
客户端为html
代码可以在此处下载 http://download.youkuaiyun.com/detail/ch717828/8190573
代码
// @ServerEndpoint注解,标示出这是一个WebSocket的Server端 , value属性表示访问这个server的url
@ServerEndpoint(value="/websocket/{user}")
public class WebSocketServerDemo {
private static Set<Session> peers = new HashSet<Session>();
private Session session;
// open方法的注解,当一个客户端连上来时触发,每个客户端会被分配一个session,这个session可不是httpsession.
// open方法里有个参数user被加上了注解@PathParam(value = "user")String user,这个就是从url中获取user的方式
@OnOpen
public void open(Session session , @PathParam(value="user") String user)
{
this.session = session;
// 存储这个新session
peers.add(session);
System.out.println("WebSocketServerDemo open from sessionId:"+this.session.getId());
}
// 收到客户端发送的消息时触发
@OnMessage
public void inMessage(String message)
{
System.out.println("WebSocketServerDemo inmessage from sessionId:"+this.session.getId()+
":"+message);
}
// 客户端断开时触发
@OnClose
public void end()
{
System.out.println("WebSocketServerDemo end from sessionId:"+this.session.getId());
}
// 向所有客户端发送一条消息
public static void broadcase(String msg)
{
System.out.println("WebSocketserverDemo broadcase ");
for(Session session : peers)
{
try {
session.getBasicRemote().sendText("这是我(服务器)向你们(客户端)推送的消息,不要惊讶");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
接下来的jsp是服务器向所有客户端推送消息的
这个页面会向所有的客户端发送一条消息,通过websocket <br>
<%
my.WebSocketServerDemo.broadcase("111");
%>
接下来是客户端代码
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Index</title>
<script type="text/javascript">
var ws = null;
function startWebSocket() {
if ('WebSocket' in window)
{
console.log("support Websocket")
ws = new WebSocket("ws://localhost:8080/WebSocketDemo/websocket/{1}");
}
else if ('MozWebSocket' in window)
{
console.log("support MozWebsocket")
ws = new MozWebSocket("ws://localhost:8080/WebSocketDemo/websocket/{2}");
}
else
alert("not support");
// 收到消息
ws.onmessage = function(evt) {
alert(evt.data);
};
// 断开连接
ws.onclose = function(evt) {
alert("close");
};
// 打开连接
ws.onopen = function(evt) {
alert("open");
};
}
// 向服务端发送消息
function sendMsg() {
ws.send(document.getElementById('writeMsg').value);
}
</script>
</head>
<body onload="startWebSocket();">
<input type="text" id="writeMsg"></input>
<input type="button" value="send" onclick="sendMsg()"></input>
</body>
</html>