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