1. 程式人生 > >SpringBoot整合WebSocket實現多個服務通訊

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服務圖層的圖層控制

       專案上要一個圖層控制功能,當時也找到一些別人分享的,但是隻能實現對一個動態服務圖層的控制,然而專案上疊加了好幾個圖層,需要實現對多個服務圖層的控制。一開始想簡單了,覺得有幾個圖層構建幾次樹不就完事了,這肯定是不行的,你會發現最後構建完成之後只有一個圖層(最後構建