websocket (html5新规范)

WebSocket是HTML5规定的新协议。它允许服务端向客户端实时推送新消息;当然,客户端也可以通过websocket实时向server发消息。
应用场景:聊天。user1向user2发消息,用服务器中转,那么server就要向client实时推送。

1.js部分

//建立连接
var url="ws://yichudu.com/yichuMessage/websocket/chat";
var webSocket = new WebSocket(url);

//绑定事件
webSocket.onopen=function(){/*建立连接后的操作*/}
webSocket.onmessage = function(event) {/*收到信息后的操作*/}
webSocket.onclose = function() {/*断开连接后的操作*/}

//发送消息,以json为例
webSocket.send(JSON.stringify(msg));


1.1 例子

<html>
<script>
url='ws://localhost:7002/websocket'
var webSocket = new WebSocket(url);
webSocket.onopen = function() {
		console.log('WebSocket has been connected');
		webSocket.onmessage = function(event) {
			console.log('receive:'+event.data);
		}
		webSocket.onclose = function() {
			console.log('WebSocket has been disconnected。');
		}
	}
</script>
</html>

2.server部分

需要tomcat支持,以tomcat8为例。用eclipse建立一个Dynamic Web Project。

@javax.websocket.server. ServerEndpoint
该注解作用在类上,注解的value参数指定了建立连接的URL路径。
//以该注解为例,那么真实地址就是ws://host:port/project/websocket/chat
@ServerEndpoint(value = "/websocket/chat")

@javax.websocket. OnOpen
作用在函数上,注入参数javax.websocket.Session。

@javax.websocket. OnClose
作用在函数上。

@javax.websocket. OnMessage
作用在函数上。注入参数String。
void javax.websocket.RemoteEndpoint.Basic. sendText(String text)
此函数用于发消息。

@javax.websocket. OnError

作用在函数上。注入参数Throwable。异常的时候会调用。

2.1 例子

package com.yichudu.qa.websocket;

import java.io.IOException;
import java.util.Set;
import java.util.concurrent.CopyOnWriteArraySet;

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;

import org.apache.log4j.Logger;
import org.springframework.stereotype.Component;

@ServerEndpoint(value = "/websocket")
public class MyWebSocket {

	Logger logger =Logger.getLogger(MyWebSocket.class);
	//静态变量,用来记录当前在线连接数。
    private static int onlineCount = 0;

    //concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象。
    private static Set<MyWebSocket> webSocketSet = new CopyOnWriteArraySet<MyWebSocket>();

    //与某个客户端的连接会话,需要通过它来给客户端发送数据
    private Session session;

    /**
     * 连接建立成功调用的方法*/
    @OnOpen
    public void onOpen(Session session) {
        this.session = session;
        webSocketSet.add(this);     //加入set中
        onlineCount++;
        logger.info("有新连接加入!当前在线人数为" +onlineCount);
        try {
        	sendMessage("ni hao");
        } catch (IOException e) {
        	 logger.error("IO异常");
        }
    }

    @OnClose
    public void onClose() {
        webSocketSet.remove(this);  //从set中删除
        onlineCount--;
        logger.info("有一连接关闭!当前在线人数为" + onlineCount);
    }

    @OnMessage
    public void onMessage(String message) {
        logger.info("来自客户端"+session.getId()+"的消息:" + message);
    }

    @OnError
    public void onError(Throwable error) {
        logger.error(error);
    }
    
    void sendMessage(String text) throws IOException{
    	session.getBasicRemote().sendText(text);
    }

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值