SpringBoot統合websocket
WebSocketとは?
WebSocketは、HTML 5が提供し始めた単一のTCP接続上でフルデュプレクス通信を行うプロトコルである.
WebSocketは、クライアントとサーバ間のデータ交換をより簡単にし、サービス側がクライアントにデータを積極的にプッシュできるようにします.WebSocket APIでは、ブラウザとサーバが握手を1回完了するだけで、両者の間に永続的な接続を直接作成し、双方向のデータ転送を行うことができます.
WebSocket APIでは、ブラウザとサーバが握手をするだけで、ブラウザとサーバの間に高速チャネルが形成されます.両者の間で直接データを互いに転送することができる.
あまり話さないで、すぐに乾物の時間に入ります.
maven依存
SpringBoot2.0対WebSocketのサポートは素晴らしいので、直接パッケージを導入できます.
WebSocketConfig
WebSocketのサポートを有効にするのも簡単で、いくつかのコードができます.
WebSocketServer
WebSocketはクライアント・サービス・エンドのような形式(wsプロトコルを採用)なので、ここのWebSocketServerは実は1つのwsプロトコルのController直接@Server Endpoint("/websocket"),@Componentが有効になればいいのですが、そこで@OnOpen,@onClose,@onMessageなどの方法を実現します
メッセージ送信
新しい情報をプッシュするには、自分のControllerでWebSocketServerを調整する方法を書くことができます.sendInfo();すぐ
フロントエンドページ
ページでjsコードでsocketを呼び出すのは、もちろん、古いブラウザではだめですが、普通は新しいブラウザやグーグルブラウザで大丈夫です.
うんてん
1、springbootプロジェクトを起動する.
2、直接ページを開く.html、リンクをクリック
3、サービス側はメッセージを送信する:
WebSocketは、HTML 5が提供し始めた単一のTCP接続上でフルデュプレクス通信を行うプロトコルである.
WebSocketは、クライアントとサーバ間のデータ交換をより簡単にし、サービス側がクライアントにデータを積極的にプッシュできるようにします.WebSocket APIでは、ブラウザとサーバが握手を1回完了するだけで、両者の間に永続的な接続を直接作成し、双方向のデータ転送を行うことができます.
WebSocket APIでは、ブラウザとサーバが握手をするだけで、ブラウザとサーバの間に高速チャネルが形成されます.両者の間で直接データを互いに転送することができる.
あまり話さないで、すぐに乾物の時間に入ります.
maven依存
SpringBoot2.0対WebSocketのサポートは素晴らしいので、直接パッケージを導入できます.
org.springframework.boot
spring-boot-starter-websocket
WebSocketConfig
WebSocketのサポートを有効にするのも簡単で、いくつかのコードができます.
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;
/**
* WebSocket
* @author zhengkai
*/
@Configuration
public class WebSocketConfig {
@Bean
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
}
}
WebSocketServer
WebSocketはクライアント・サービス・エンドのような形式(wsプロトコルを採用)なので、ここのWebSocketServerは実は1つのwsプロトコルのController直接@Server Endpoint("/websocket"),@Componentが有効になればいいのですが、そこで@OnOpen,@onClose,@onMessageなどの方法を実現します
import java.io.IOException;
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.springframework.stereotype.Component;
import cn.hutool.log.Log;
import cn.hutool.log.LogFactory;
import lombok.extern.slf4j.Slf4j;
@ServerEndpoint("/websocket/{sid}")
@Component
public class WebSocketServer {
static Log log=LogFactory.get(WebSocketServer.class);
// , 。 。
private static int onlineCount = 0;
//concurrent Set, MyWebSocket 。
private static CopyOnWriteArraySet webSocketSet = new CopyOnWriteArraySet();
// ,
private Session session;
// sid
private String sid="";
/**
* */
@OnOpen
public void onOpen(Session session,@PathParam("sid") String sid) {
this.session = session;
webSocketSet.add(this); // set
addOnlineCount(); // 1
log.info(" :"+sid+", " + getOnlineCount());
this.sid=sid;
try {
sendMessage(" ");
} catch (IOException e) {
log.error("websocket IO ");
}
}
/**
*
*/
@OnClose
public void onClose() {
webSocketSet.remove(this); // set
subOnlineCount(); // 1
log.info(" ! " + getOnlineCount());
}
/**
*
*
* @param message */
@OnMessage
public void onMessage(String message, Session session) {
log.info(" "+sid+" :"+message);
//
for (WebSocketServer item : webSocketSet) {
try {
item.sendMessage(message);
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
*
* @param session
* @param error
*/
@OnError
public void onError(Session session, Throwable error) {
log.error(" ");
error.printStackTrace();
}
/**
*
*/
public void sendMessage(String message) throws IOException {
this.session.getBasicRemote().sendText(message);
}
/**
*
* */
public static void sendInfo(String message,@PathParam("sid") String sid) throws IOException {
log.info(" "+sid+", :"+message);
for (WebSocketServer item : webSocketSet) {
try {
// sid , null
if(sid==null) {
item.sendMessage(message);
}else if(item.sid.equals(sid)){
item.sendMessage(message);
}
} catch (IOException e) {
continue;
}
}
}
public static synchronized int getOnlineCount() {
return onlineCount;
}
public static synchronized void addOnlineCount() {
WebSocketServer.onlineCount++;
}
public static synchronized void subOnlineCount() {
WebSocketServer.onlineCount--;
}
}
メッセージ送信
新しい情報をプッシュするには、自分のControllerでWebSocketServerを調整する方法を書くことができます.sendInfo();すぐ
@Controller
@RequestMapping("/checkcenter")
public class CheckCenterController {
//
@GetMapping("/socket/{cid}")
public ModelAndView socket(@PathVariable String cid) {
ModelAndView mav=new ModelAndView("/socket");
mav.addObject("cid", cid);
return mav;
}
//
@ResponseBody
@RequestMapping("/socket/push/{cid}")
public ApiReturnObject pushToWeb(@PathVariable String cid,String message) {
try {
WebSocketServer.sendInfo(message,cid);
} catch (IOException e) {
e.printStackTrace();
return ApiReturnUtil.error(cid+"#"+e.getMessage());
}
return ApiReturnUtil.success(cid);
}
}
フロントエンドページ
ページでjsコードでsocketを呼び出すのは、もちろん、古いブラウザではだめですが、普通は新しいブラウザやグーグルブラウザで大丈夫です.
(runoob.com)
function WebSocketTest()
{
if ("WebSocket" in window)
{
alert(" WebSocket!");
// web socket
var ws = new WebSocket("ws://127.0.0.1:8080/websocket/1212");
ws.onopen = function()
{
// Web Socket , send()
ws.send(" ");
alert(" ...");
};
ws.onmessage = function (evt)
{
var received_msg = evt.data;
alert(received_msg)
alert(" ...");
};
ws.onclose = function()
{
// websocket
alert(" ...");
};
}
else
{
// WebSocket
alert(" WebSocket!");
}
}
うんてん
1、springbootプロジェクトを起動する.
2、直接ページを開く.html、リンクをクリック
3、サービス側はメッセージを送信する:
http://localhost:8080/checkcenter/socket/push/1212?message=xxxx