日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

WebSocket和Java

發布時間:2023/12/3 java 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 WebSocket和Java 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

WebSocket是一項很酷的新技術,它允許瀏覽器與服務器之間進行實時雙向通信,而幾乎沒有開銷。 我在這里想要做的是,提供一個非常簡潔但足夠全面的概述,以介紹如何開始使用該技術。 因此,從以下幾件事開始:

  • 在瀏覽器和服務器之間打開了一個tcp套接字連接,并且各方可以向另一方發送消息(即,只要有可用,服務器就可以推送數據-無需輪詢,長時間輪詢,iframe等)。
  • 并非所有瀏覽器都支持它-IE 10是第一個支持它的IE版本,Android仍然存在問題。 幸運的是,如果不支持WebSocket,則可以使用SockJS ,它可以回溯到其他推式仿真。
  • 并非所有代理服務器都支持/允許它,因此可能需要再次進行回退
  • 適用于游戲,交易應用程序,以及實際上任何需要服務器將數據推送到瀏覽器的事物
  • Java具有標準的API(JSR-356) ,您可以在服務器上使用它來處理WebSocket連接。
  • Spring在Java API之上提供了一個 API。 spring支持的好處是它具有對SockJS的服務器端支持,您可以輕松使用依賴注入。 Spring還為消息驅動的體系結構提供了STOMP支持 。 這兩篇Spring文章都包含指向我推薦的GitHub示例項目的鏈接。

在繼續一些示例代碼之前,這里是套接字的生命周期,包括客戶端和服務器(假設上述API之一):

  • 瀏覽器發送帶有特殊升級頭的HTTP請求,其值是“ websocket”。
  • 如果服務器“說” webocket,它將以狀態101(交換協議)答復。 從現在開始,我們不再使用HTTP
  • 當服務器接受tcp套接字連接時,將調用初始化方法,并在其中傳遞當前的websocket會話。 每個套接字都有一個唯一的會話ID。
  • 每當瀏覽器向服務器發送消息時,就會在獲取會話和消息有效負載的地方調用另一種方法。
  • 基于某些有效負載參數,應用程序代碼執行幾種操作之一。 有效負載格式完全取決于開發人員。 但是,通常,它是一個JSON序列化的對象。
  • 每當服務器需要發送消息時,它都需要獲取會話對象,并使用它來發送消息。
  • 當瀏覽器關閉連接時,會通知服務器,以便它可以清除與特定會話相關的任何資源。
  • 當前,沒有API或框架支持基于注釋的路由。 Java API支持基于注釋的終結點處理程序,但是它為每個連接URL提供一個類,并且通常您希望在單個連接上執行多個操作。 即,您連接到ws://yourserver.com/game/,然后要傳遞“ joinGame”,“ leaveGame”消息。 同樣,服務器需要發回不止一種消息。 我的實現方式是通過一個枚舉,包含所有可能的動作/事件類型,并使用switch構造確定要調用的內容。

    因此,我決定為我的算法音樂作曲家制作一個簡單的游戲 。 它使用的是Spring API。 這是我在我所工作的公司中所做的相關演示的幻燈片 。 下面是一些示例代碼:

    @Component public class GameHandler extends WebSocketHandlerAdapter {private Map players = new ConcurrentHashMap<>();private Map playerGames = new ConcurrentHashMap<>();@Overridepublic void afterConnectionEstablished(WebSocketSession session) throws Exception {Player player = new Player(session);players.put(session.getId(), player);}@Override public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {leaveGame(session.getId()); }@Override protected void handleTextMessage(WebSocketSession session, TextMessage textMessage) throws Exception {try {GameMessage message = getMessage(textMessage); //deserializes the JSON payloadswitch(message.getAction()) { case INITIALIZE: initialize(message, session); break;case JOIN: join(message.getGameId(), message.getPlayerName(), session); break;case LEAVE: leave(session.getId()); break;case START: startGame(message); break;case ANSWER: answer(message, session.getId()); break;}} catch (Exception ex) {logger.error("Exception occurred while handling message", ex);} }

    讓我們看一個示例服務,服務器需要在其中向客戶端發送消息。 讓我們以一個玩家加入游戲為例,而所有其他玩家都需要收到新的通知。 系統中的核心類是Game,其中包含玩家列表,并且如您所見,Player包含對WebSocket會話的引用。 因此,當玩家加入游戲時,將調用以下Game方法:

    public boolean playerJoined(Player player) {for (Player otherPlayer : players.values()) {otherPlayer.playerJoined(player);}players.put(player.getSession().getId(), player);return true; }

    然后player.playerJoined(..)通過基礎連接發送一條消息,通知瀏覽器新玩家加入:

    public void playerJoined(Player player) {GameEvent event = new GameEvent(GameEventType.PLAYER_JOINED);event.setPlayerId(player.getSession().getId()); event.setPlayerName(player.getName());try {session.sendMessage(new TextMessage(event.toJson()));} catch (IOException e) {new IllegalStateException(e);}}

    從服務器向瀏覽器發送消息也可能由計劃的作業觸發。

    關鍵是要保留所有已連接瀏覽器的列表,以便可以將信息發送回去。 該列表可以是一個靜態字段,但是對于單例spring bean,則不需要。

    現在,兩個重要方面–安全性和身份驗證。 這是Heroku的一篇不錯的文章 ,同時討論了兩者。 如果有任何敏感內容,您應該首選wss(相對于TLS,它是websocket)。 您還應該在兩端驗證您的輸入,并且不應該依賴Origin標頭,因為攻擊者可能很容易欺騙瀏覽器。

    身份驗證可以依賴于HTTP會話cookie,但是顯然,有些人更喜歡實現自己的類似于cookie的工作流,以獲取短暫的令牌,該令牌可用于執行經過身份驗證的操作。

    WebSocket使DDD變得自然。 您不再需要使用貧血對象-您的對象具有各自的狀態,并且在該狀態下執行操作。 與此相關的是,websocket應用程序更易于測試。

    這是開發WebSocket應用程序時要記住的一般事項。 請注意,您不必在所有地方都使用WebSocket –我將其僅限于需要“推送”的功能。

    總體而言,WebSocket是一項很好的有趣技術,有望淘汰所有hacky推送仿真。

    參考:來自Java出現日歷博客的JCG合作伙伴 Glamdring的WebSocket和Java 。

    翻譯自: https://www.javacodegeeks.com/2013/12/websocket-and-java.html

    總結

    以上是生活随笔為你收集整理的WebSocket和Java的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。