在Java中构建WebSocket应用(基于JSR356)


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>  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值