java消息推送_java实现后台服务器消息推送
1.什么是WebSocket
WebSocket协议是基于TCP的⼀种新的⽹络协议。它实现了浏览器与服务器全双⼯(full-duplex)通信——允许服务器主动发送信息给客户端。
2.实现原理
在实现websocket连线过程中,需要通过浏览器发出websocket连线请求,然后服务器发出回应,这个过程通常称为“握⼿” 。在WebSocket API,浏览器和服务器只需要做⼀个握⼿的动作,然后,浏览器和服务器之间就形成了⼀条快速通道。两者之间就直接可以数据互相传送。
3.优点
在以前的消息推送机制中,⽤的都是 Ajax 轮询(polling),在特定的时间间隔由浏览器⾃动发出请求,将服务器的消息主动的拉回来,这种⽅式是⾮常消耗资源的,因为它本质还是http请求,⽽且显得⾮常笨拙。⽽WebSocket 在浏览器和服务器完成⼀个握⼿的动作,在建⽴连接之后,服务器可以主动传送数据给客户端,客户端也可以随时向服务器发送数据。
4.WebSocket和Socket的区别
1.WebSocket:
1. websocket通讯的建⽴阶段是依赖于http协议的。最初的握⼿阶段是http协议,握⼿完成后就切换到websocket协议,并完全与http
协议脱离了。
2. 建⽴通讯时,也是由客户端主动发起连接请求,服务端被动监听。
3. 通讯⼀旦建⽴连接后,通讯就是“全双⼯”模式了。也就是说服务端和客户端都能在任何时间⾃由得发送数据,⾮常适合服务端要主
动推送实时数据的业务场景。
4. 交互模式不再是“请求-应答”模式,完全由开发者⾃⾏设计通讯协议。
5. 通信的数据是基于“帧(frame)”的,可以传输⽂本数据,也可以直接传输⼆进制数据,效率⾼。当然,开发者也就要考虑封包、拆
包、编号等技术细节。
2.Socket:
1. 服务端监听通讯,被动提供服务;客户端主动向服务端发起连接请求,建⽴起通讯。
2. 每⼀次交互都是:客户端主动发起请求(request),服务端被动应答(response)。
3. 服务端不能主动向客户端推送数据。
4. 通信的数据是基于⽂本格式的。⼆进制数据(⽐如图⽚等)要利⽤base64等⼿段转换为⽂本后才能传输。
5.WebSocket客户端:
var websocket = null;
var host = document.location.host;
var username = "${loginUsername}"; // 获得当前登录⼈员的userName
// alert(username)
//判断当前浏览器是否⽀持WebSocket
if ('WebSocket' in window) {
alert("浏览器⽀持Websocket")
websocket = new WebSocket('ws://'+host+'/mm-dorado/webSocket/'+username);
} else {
alert('当前浏览器 Not support websocket')
}
/
/连接发⽣错误的回调⽅法
alert("WebSocket连接发⽣错误")
setMessageInnerHTML("WebSocket连接发⽣错误");
};
//连接成功建⽴的回调⽅法
alert("WebSocket连接成功")
setMessageInnerHTML("WebSocket连接成功");
}
//接收到消息的回调⽅法
alert("接收到消息的回调⽅法")
alert("这是后台推送的消息:"+event.data);
websocket.close();
alert("webSocket已关闭!")
}
//连接关闭的回调⽅法
setMessageInnerHTML("WebSocket连接关闭");
}
//监听窗⼝关闭事件,当窗⼝关闭时,主动去关闭websocket连接,防⽌连接还没断开就关闭窗⼝,server端会抛异常。beforeunload = function() {
closeWebSocket();
}
//关闭WebSocket连接
function closeWebSocket() {
websocket.close();
}
//将消息显⽰在⽹页上
function setMessageInnerHTML(innerHTML) {
';
}
websocket和socket
6.WebSocket服务端(java后台):
1.核⼼类:
s.util;
import java.io.IOException;
import java.util.Map;
import urrent.ConcurrentHashMap;
import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
le.gson.JsonObject;
import net.sf.json.JSONObject;
@ServerEndpoint("/webSocket/{username}")
public class WebSocket {
private static int onlineCount = 0;
private static Map clients = new ConcurrentHashMap();
private Session session;
private String username;
@OnOpen
public void onOpen(@PathParam("username") String username, Session session) throws IOException {
this.username = username;
this.session = session;
addOnlineCount();
clients.put(username, this);
System.out.println("已连接");
}
@OnClose
public void onClose() throws IOException {
subOnlineCount();
}
@OnMessage
public void onMessage(String message) throws IOException {
JSONObject jsonTo = JSONObject.fromObject(message);
String mes = (String) ("message");
if (!("To").equals("All")){
sendMessageTo(mes, ("To").toString());
}else{
sendMessageAll("给所有⼈");
}
}
@OnError
public void onError(Session session, Throwable error) {
error.printStackTrace();
}
public void sendMessageTo(String message, String To) throws IOException { // BasicRemote().sendText(message);
//AsyncRemote().sendText(message);
for (WebSocket item : clients.values()) {
if (item.username.equals(To) )
AsyncRemote().sendText(message);
}
}
public void sendMessageAll(String message) throws IOException {
for (WebSocket item : clients.values()) {
AsyncRemote().sendText(message); }
}
public static synchronized int getOnlineCount() { return onlineCount;
}
public static synchronized void addOnlineCount() { lineCount++;
}
public static synchronized void subOnlineCount() { lineCount--;
}
public static synchronized Map getClients() {
return clients;
}
}
2.在⾃⼰代码中的调⽤:
WebSocket ws = new WebSocket();
JSONObject jo = new JSONObject();
jo.put("message

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。