SpringBoot整合WebSocket實現多個服務通訊
import com.test.www.socket.WebSocketServer; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.annotation.ComponentScan; import org.springframework.scheduling.annotation.EnableScheduling; @SpringBootApplication @EnableScheduling @ComponentScan("com.test.www") @MapperScan(value = {"com.test.www.mapper"}) public class Application { public static void main(String[] args) { SpringApplication springApplication = new SpringApplication(Application.class); ConfigurableApplicationContext configurableApplicationContext = springApplication.run(args); WebSocketServer.setApplicationContext(configurableApplicationContext); } }
三、WebSocketConfig配置類
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.socket.server.standard.ServerEndpointExporter; @Configuration public class WebSocketConfig { @Bean public ServerEndpointExporter serverEndpointExporter() { return new ServerEndpointExporter(); } }
四、WebSocketServer服務端
import org.springframework.context.ApplicationContext; import org.springframework.stereotype.Component; import javax.websocket.*; import javax.websocket.server.PathParam; import javax.websocket.server.ServerEndpoint; import java.io.IOException; import java.util.HashMap; import java.util.Map; @Component @ServerEndpoint(value = "/{ip}") public class WebSocketServer { private static Map<String, Session> connections = new HashMap<>(); private static ApplicationContext applicationContext; public static void setApplicationContext(ApplicationContext applicationContext) { WebSocketServer.applicationContext = applicationContext; } /** * 開啟連線 * @param session * @param ip */ @OnOpen public void onOpen(Session session, @PathParam("ip") String ip) { connections.put(ip, session); } /** * 接收訊息 * @param text */ @OnMessage public void onMessage(String text) { } /** * 異常處理 * @param throwable */ @OnError public void onError(Throwable throwable) { throwable.printStackTrace(); } /** * 關閉連線 * @param ip */ @OnClose public void onClosing(@PathParam("ip") String ip) throws IOException { connections.remove(ip); } /** * 根據IP傳送訊息 * @param ip * @param text */ public void send(String ip, String text) { try { Session session = connections.get(ip); if (session != null && session.isOpen()) { session.getAsyncRemote().sendText(text); } } catch (Exception e) { e.printStackTrace(); } } /** * 遍歷群發訊息 * @param text */ public void send(String text) { for (Map.Entry<String, Session> entry : connections.entrySet()) { send(entry.getKey(), text); } } }
五、SocketClient客戶端類
session.getBasicRemote().sendText()為同步傳送
session.getAsyncRemote().sendText()為非同步傳送
當併發傳送資料的時候避免阻塞,一般都使用非同步
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import javax.websocket.*;
import java.io.IOException;
import java.net.InetAddress;
import java.net.URI;
@Component
@ClientEndpoint
public class SocketClient {
// 服務端的IP和埠號
private static final String URL = "192.168.1.1:8080";
private Session session;
@PostConstruct
void init() {
try {
// 本機地址
String hostAddress = InetAddress.getLocalHost().getHostAddress();
WebSocketContainer container = ContainerProvider.getWebSocketContainer();
String wsUrl = "ws://" + URL + "/" + hostAddress;
URI uri = URI.create(wsUrl);
session = container.connectToServer(SocketClient.class, uri);
} catch (DeploymentException | IOException e) {
e.printStackTrace();
}
}
/**
* 開啟連線
* @param session
*/
@OnOpen
public void onOpen(Session session) {
this.session = session;
}
/**
* 接收訊息
* @param text
*/
@OnMessage
public void onMessage(String text) {
}
/**
* 異常處理
* @param throwable
*/
@OnError
public void onError(Throwable throwable) {
throwable.printStackTrace();
}
/**
* 關閉連線
*/
@OnClose
public void onClosing() throws IOException {
session.close();
}
/**
* 主動傳送訊息
*/
public void send(JSONObject json) {
try {
session.getAsyncRemote().sendText(json.toJSONString());
} catch (IOException e) {
e.printStackTrace();
}
}
}
相關推薦
SpringBoot整合WebSocket實現多個服務通訊
import com.test.www.socket.WebSocketServer; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.
Spring Boot學習分享(七)——整合WebSocket開發多個聊天室多人線上實時通訊
(一)使用原生WebSocket的註解編寫服務端 由於想要實現可以統計具體線上人數,而因為想要設計成多個房間同時進行,如果使用Spring自帶的以Stomp為協議的WebSocket實現則比較繁瑣,必須配置攔截器,由於攔截器可以得到的引數比較少,必須注入其
SpringBoot整合ElasticSearch實現多版本的兼容
all function 成功 get upd lin gen stc linu 前言 在上一篇學習SpringBoot中,整合了Mybatis、Druid和PageHelper並實現了多數據源的操作。本篇主要是介紹和使用目前最火的搜索引擎ElastiSearch,並和Sp
Springboot整合mybatis實現多資料來源
1:SpringBoot整合mybatis實現多資料來源有兩種方法 1:靜態方式 將每個資料來源都實現一個mybatis的sqlSessionFactory中,但是這種方法,缺點在於:你有幾個資料來源都會有幾個mybatis的配置類;對於資料來源的事務也不是很
SpringBoot整合netty實現客戶端服務端互動
看了好幾天的netty實戰,慢慢摸索,雖然還沒有摸著很多門道,但今天還是把之前想加入到專案裡的 一些想法實現了,算是有點信心了吧(講真netty對初學者還真的不是很友好......) 首先,當然是在SpringBoot專案裡新增netty的依賴了,注意不要用netty5的依賴,因為已經廢棄
springboot整合shiro實現多realm不同資料表登陸
shrio是一個很好的登陸以及許可權管理框架,但是mo預設是單realm單資料表,如果業務中使用者分佈在不同的資料表,單realm就很難實現登陸以及許可權管理的功能,這篇部落格就簡單的介紹一個家長 學生 老師的shiro的多realm登陸驗證,使用springboot,mybatis mysql等相
springboot整合websocket實現頁面線上客服聊天,並且解決無法注入例項的問題
本文采用現在流行的springboot框架整合websocket實現線上客服的聊天功能,程式碼實現如下:pom.xml:<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.
springboot整合websocket實現訊息推送.
springboot整合websocket實現訊息推送 1.maven配置 2.書寫後端程式碼 3.書寫前端程式碼 4.測試 1.maven依賴 <dependency> <groupId>org
springboot 整合quartz 建立多個定時任務
1.pom.xml <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId>
Spring整合MongoDB實現多個or的範圍查詢
Criteria c1= Criteria.where("year").gte(startYear).lte(endYear).and("month").is(endMonth).and("day")
單體物聯平臺系統(Springboot整合shiro實現多realm多用戶表多權限表登陸)
管理 tps 包括 映射 記住我 整合 ref 基於 平臺 單體物聯平臺系統(Springboot整合shiro實現多realm多用戶表多權限表登陸) 參考實現:http://www.qchcloud.cn/tn/article/30 一、技術框架 本項目基於Spring,
springboot整合websocket實現一對一訊息推送和廣播訊息推送
springboot基礎環境 請參考springboot文件 maven依賴
使用多線程實現多個客戶端與服務端通信1
runnable system 處理異常 封裝 端口被占用 直接 客戶端連接 i++ 應用程序 Server.java package socket; import java.io.BufferedReader;import java.io.IOException;impo
apache實現一個域名訪問多個服務器問題與解決
csdn 文件中 2.4 apache2.2 kill 如果 進行 域名 命令行啟動 1. apache安裝後no service install解決辦法 在在運行中鍵入:cmd ,出來DOS窗口 切換到apache所在目錄的bin文件夾, cd\apache\bin 運
SpringBoot使用WebSocket實現服務端推送--叢集實現(2)
書接上文,本文介紹了一種實現叢集管理和訊息傳送方式。 在叢集模式情況下,一般是Nginx反向代理到多臺Tomcat或者SLB代理到多臺Tomcat的方式,怎麼實現給某個人推送訊息?比如WebSocket1連線到Tomcat1,但是在Tomcat2需要給WebSocket1傳送訊息,怎麼辦?一
SpringBoot使用WebSocket實現服務端推送---單機實現(1)
最近開發中需要實現服務端的推送,經過一段時間的資料查詢最終鎖定使用websocket來實現。JavaEE本身就支援WebSocket。我們只需要開發一個EndPoint來處理連線、訊息等即可。但是WebSocket的session管理是開發中的重中之重和難點,因為你需要知道推送給誰,就需要儲存代
ython實現程序間的通訊有Queue,Pipe,Value+Array等,其中Queue實現多個程序間的通訊,而Pipe實現兩個程序間通訊,而Value+Array使用得是共享記憶體對映檔案的方式,所以速度比較快
1.Queue的使用 from multiprocessing import Queue,Process import os,time,random #新增資料函式 def proc_write(queue,urls): print("程序(%s)正在寫入..."%(os.getpid()))
SpringBoot學習筆記(12)----SpringBoot實現多個 賬號輪詢傳送郵件
首先,引入傳送郵件的依賴,由於freemarker自定義模板,所以也需要把freemarker的依賴引入 pom.xml檔案 <dependency> <groupId>org.springframework.boot</groupId
Java POI元件實現多個Excel檔案整合成一個多Sheet的Excel檔案
程式碼: package com.weichai; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStre
通過Easy-UI 樹外掛實現ArcGIS多個服務圖層的圖層控制
專案上要一個圖層控制功能,當時也找到一些別人分享的,但是隻能實現對一個動態服務圖層的控制,然而專案上疊加了好幾個圖層,需要實現對多個服務圖層的控制。一開始想簡單了,覺得有幾個圖層構建幾次樹不就完事了,這肯定是不行的,你會發現最後構建完成之後只有一個圖層(最後構建