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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

Java Websocket实例【服务端与客户端实现全双工通讯】

發布時間:2023/11/27 生活经验 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java Websocket实例【服务端与客户端实现全双工通讯】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Java Websocket實例【服務端與客戶端實現全雙工通訊】


現很多網站為了實現即時通訊,所用的技術都是輪詢(polling)。輪詢是在特定的的時間間隔(如每1秒),由瀏覽器對服務器發

HTTP?request,然后由服務器返回最新的數據給客服端的瀏覽器。這種傳統的HTTP?request?的模式帶來很明顯的缺點?–?瀏

覽器需要不斷的向服務器發出請求,然而HTTP?request?header是非常長的,里面包含的數據可能只是一個很小的值,這樣會占

用很多的帶寬。WebSocket提供了一個受歡迎的技術,以替代我們過去幾年一直在用的Ajax技術。

一、什么是WebSocket?API?

WebSocket?API是下一代客戶端-服務器的異步通信方法。該通信取代了單個的TCP套接字,使用wswss協議,可用于任意的

客戶端和服務器程序。WebSocket目前由W3C進行標準化。WebSocket已經受到Firefox?4Chrome?4Opera?10.70以及Safari?5

瀏覽器的支持。

WebSocket?API最偉大之處在于服務器和客戶端可以在給定的時間范圍內的任意時刻,相互推送信息。WebSocket并不限于以

Ajax(XHR)方式通信,因為Ajax技術需要客戶端發起請求,而WebSocket服務器和客戶端可以彼此相互推送信息;XHR受到域

的限制,而WebSocket允許跨域通信。

Ajax技術很聰明的一點是沒有設計要使用的方式。WebSocket為指定目標創建,用于雙向推送消息。

那么我就開始我在項目中對websocket的使用,首先使用的是J2EE7的架包。

?

架包加完之后,只需要再添加2個類就可以實現使用的功能了。

首先添加一個Java類,WebsocketController.java

[java]?view plaincopy
  1. package?com.lwl.activemq.controller.websocket;??
  2. ??
  3. import?java.util.Map;??
  4. import?java.util.concurrent.ConcurrentHashMap;??
  5. ??
  6. import?javax.websocket.*;??
  7. import?javax.websocket.server.PathParam;??
  8. import?javax.websocket.server.ServerEndpoint;??
  9. ??
  10. ??
  11. import?org.slf4j.Logger;??
  12. import?org.slf4j.LoggerFactory;??
  13. /**?
  14. ?*?功能說明:websocket處理類,?使用J2EE7的標準?
  15. ?*?@author?Administrator?
  16. ?*?@create?2016-8-11?下午4:08:35?
  17. ?*?@version?1.0?
  18. ?*/??
  19. @ServerEndpoint("/websocket/{myWebsocket}")??
  20. public?class?WebsocketController?{??
  21. ????private?static?final?Logger?logger?=?LoggerFactory.getLogger(WebsocketController.class);??
  22. ??
  23. ????public?static?Map<String,?Session>?clients?=?new?ConcurrentHashMap<String,?Session>();??
  24. ??
  25. ????/**?
  26. ?????*?打開連接時觸發?
  27. ?????*?@param?myWebsocket?
  28. ?????*?@param?session?
  29. ?????*/??
  30. ????@OnOpen??
  31. ????public?void?onOpen(@PathParam("myWebsocket")?String?myWebsocket,?Session?session){??
  32. ????????logger.info("Websocket?Start?Connecting:"?+?myWebsocket);??
  33. ????????System.out.println("進入:"+myWebsocket);??
  34. ????????clients.put(myWebsocket,?session);??
  35. ????}??
  36. ??
  37. ????/**?
  38. ?????*?收到客戶端消息時觸發?
  39. ?????*?@param?myWebsocket?
  40. ?????*?@param?message?
  41. ?????*?@return?
  42. ?????*/??
  43. ????@OnMessage??
  44. ????public?String?onMessage(@PathParam("myWebsocket")?String?myWebsocket,?String?message)?{??
  45. ????????return?"Got?your?message?("+?message?+").Thanks?!";??
  46. ????}??
  47. ??
  48. ????/**?
  49. ?????*?異常時觸發?
  50. ?????*?@param?myWebsocket?
  51. ?????*?@param?throwable?
  52. ?????*/??
  53. ????@OnError??
  54. ????public?void?onError(@PathParam("myWebsocket")?String?myWebsocket,?Throwable?throwable)?{??
  55. ????????logger.info("Websocket?Connection?Exception:"?+?myWebsocket);??
  56. ????????logger.info(throwable.getMessage(),?throwable);??
  57. ????????clients.remove(myWebsocket);??
  58. ????}??
  59. ??
  60. ????/**?
  61. ?????*?關閉連接時觸發?
  62. ?????*?@param?myWebsocket?
  63. ?????*/??
  64. ????@OnClose??
  65. ????public?void?onClose(@PathParam("myWebsocket")?String?myWebsocket)?{??
  66. ????????logger.info("Websocket?Close?Connection:"?+?myWebsocket);??
  67. ????????clients.remove(myWebsocket);??
  68. ????}??
  69. ??
  70. ??
  71. ????/**?
  72. ?????*?將數據傳回客戶端?
  73. ?????*?異步的方式?
  74. ?????*?@param?myWebsocket?
  75. ?????*?@param?message?
  76. ?????*/??
  77. ????public?static?void?broadcast(String?myWebsocket,?String?message)?{??
  78. ????????if?(clients.containsKey(myWebsocket))?{??
  79. ????????????clients.get(myWebsocket).getAsyncRemote().sendText(message);??
  80. ????????}?else?{??
  81. ????????????throw?new?NullPointerException("["?+?myWebsocket?+"]Connection?does?not?exist");??
  82. ????????}??
  83. ????}??
  84. ??
  85. }??

然后添加相應的接受頁面index.html:

[html]?view plaincopy
  1. <!DOCTYPE?HTML?PUBLIC?"-//W3C//DTD?HTML?4.01?Transitional//EN"?"http://www.w3.org/TR/html4/loose.dtd">??
  2. <html>??
  3. ????<head>??
  4. ????????<meta?http-equiv="Content-Type"?content="text/html;?charset=UTF-8">??
  5. ????????<meta?http-equiv="X-UA-Compatible"?content="IE=edge">??
  6. ????????<meta?name="viewport"?content="width=device-width,?initial-scale=1">??
  7. ??????????<script?type="text/javascript"?src="resources/jquery-1.8.3.min.js"></script>??
  8. ?????</head>?????
  9. <body>??
  10. ??
  11. ???
  12. <script?type="text/javascript">??
  13. ?//測試controller是否可以進入??
  14. //?ajaxDo("/activemq-client/index",null);??
  15. ???
  16. //?function?ajaxDo(url,data){??
  17. //???$.ajax({??
  18. //??????????url:url?,??
  19. //??????????type:?"post",??
  20. //??????????dataType:?"json",??
  21. //??????????data:?data,??
  22. //??????????success:function(result){??
  23. //?????????????if(result.success){??
  24. //?????????????????alert(result.data);??
  25. //?????????????}else{??
  26. //?????????????????alert(result.msg);??
  27. //?????????????}??
  28. //??????????}??
  29. //??????});??
  30. //?}??????
  31. ??
  32. ??
  33. //---------------------------------?webSocket?----------------------------------------------??
  34. ??initSocket("user");??
  35. ??initSocket("news");??
  36. ??initSocket("client");??
  37. ????
  38. ??
  39. function?initSocket(myWebsocket)?{??
  40. ??????
  41. ????var?webSocket?=?null;??
  42. ??????
  43. ????window.onbeforeunload?=?function?()?{??
  44. ????????//離開頁面時的其他操作??
  45. ????};??
  46. ??
  47. ????if?(!window.WebSocket)?{??
  48. ????????console("您的瀏覽器不支持websocket!");??
  49. ????????return?false;??
  50. ????}??
  51. ??
  52. ????var?target?=?'ws://'?+?window.location.host?+?"/activemq-client/websocket/"+myWebsocket;????
  53. ????????????
  54. ????????if?('WebSocket'?in?window)?{????
  55. ????????????webSocket?=?new?WebSocket(target);????
  56. ????????}?else?if?('MozWebSocket'?in?window)?{????
  57. ????????????webSocket?=?new?MozWebSocket(target);????
  58. ????????}?else?{????
  59. ????????????alert('WebSocket?is?not?supported?by?this?browser.');????
  60. ????????????return;????
  61. ????????}????
  62. ??????
  63. ??????
  64. ????//?收到服務端消息??
  65. ????webSocket.onmessage?=?function?(msg)?{??
  66. ????????????alert(msg.data);??
  67. ????????//?關閉連接??
  68. ????????webSocket.onclose();??
  69. ????????console.log(msg);??
  70. ????};??
  71. ??
  72. ????//?異常??
  73. ????webSocket.onerror?=?function?(event)?{??
  74. ????????console.log(event);??
  75. ????};??
  76. ??
  77. ????//?建立連接??
  78. ????webSocket.onopen?=?function?(event)?{??
  79. ????????console.log(event);??
  80. ????};??
  81. ??
  82. ????//?斷線??
  83. ????webSocket.onclose?=?function?()?{??
  84. ??????????
  85. ????????console.log("websocket斷開連接");??
  86. ????};??
  87. }??
  88. ??
  89. ??
  90. </script>??
  91. ??
  92. </body>??
  93. </html>??

好了,websocket已經實現了,現在最重要的是我們要在哪兒監聽哪些變動,在推送給前端的問題了,這里我監聽了MQ消息隊

列中的某個Queen,如果獲取到消息就推送給前端展示,稍后我會把MQ的消息隊列也寫給大家看,做個參考。(當然你也可以

監聽屬于你自己的對象,主要是調用?WebsocketController.broadcast("client", jsonStr);第一個參數和前端的參數一

致,第二個參數是你想推送給前端的內容)。

[java]?view plaincopy
  1. <span?style="font-size:14px;"><span?style="font-family:宋體;">package?com.lwl.activemq.listener;??
  2. ??
  3. import?javax.jms.JMSException;??
  4. import?javax.jms.Message;??
  5. import?javax.jms.MessageListener;??
  6. import?javax.jms.TextMessage;??
  7. ??
  8. import?org.apache.log4j.Logger;??
  9. import?org.springframework.stereotype.Component;??
  10. ??
  11. import?com.alibaba.fastjson.JSON;??
  12. import?com.lwl.activemq.domain.Client;??
  13. import?com.lwl.activemq.controller.websocket.WebsocketController;??
  14. ??
  15. @Component("clientPushListener")??
  16. public?class?ClientPushListener?implements?MessageListener?{??
  17. ?????protected?static?final?Logger?logger?=?Logger.getLogger(ClientPushListener.class);??
  18. ????@Override??
  19. ????public?void?onMessage(Message?message)?{??
  20. ?????????logger.info("[ClientPushListener.onMessage]:begin?onMessage.");??
  21. ????????????TextMessage?textMessage?=?(TextMessage)?message;??
  22. ????????????try?{??
  23. ????????????????String?jsonStr?=?textMessage.getText();??
  24. ????????????????logger.info("[ClientPushListener.onMessage]:receive?message?is,"+?jsonStr);??
  25. ????????????????if?(jsonStr?!=?null)?{??
  26. ????????????????????Client?info?=?JSON.parseObject(jsonStr,?Client.class);??
  27. ????????????????????System.out.println("==============================接受到的客戶信息?開始====================================");??
  28. ????????????????????System.out.println(info.toString());??
  29. ????????????????????System.out.println("==============================接受到的客戶信息?結束====================================");??
  30. ????????????????????WebsocketController.broadcast("client",?jsonStr);??
  31. ????????????????}??
  32. ????????????}?catch?(JMSException?e)?{??
  33. ????????????????logger.error("[ClientPushListener.onMessage]:receive?message?occured?an?exception",e);??
  34. ????????????}??
  35. ????????????logger.info("[ClientPushListener.onMessage]:end?onMessage.");??
  36. ????????}??
  37. }</span></span>??
轉自: http://blog.csdn.net/LOVELONG8808/article/details/52277029

總結

以上是生活随笔為你收集整理的Java Websocket实例【服务端与客户端实现全双工通讯】的全部內容,希望文章能夠幫你解決所遇到的問題。

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