當前位置:編程學習大全網 - 編程語言 - Wesocket編程

Wesocket編程

最近因為需要,不得不玩壹個網頁遊戲。需要在某個時間實時刷新頁面。目前做網站的普遍思路是js民調。因為是創新的小項目,所以同組的朋友提出了html5中提到的WebSocket,先進行了技術研究。目前java支持的WebSocket並不多。網上關於websocket實現框架的資料很少。我沒見過java EE7加了WebSocket。所以所有的包都來自於tomcat的支持。至少需要三個包,tomcat-coyote,tomcat-catalina和tomcat-annotations-api,因為tomcat從7.027版本開始就支持websocket,7.027版本之前壹直使用websocket,但是會出現各種問題。例如,websocket在連接幾秒鐘後就斷開了。所以更好的選擇是使用7.027以上的版本。這三個jar包都在對應的tomcat的lib文件夾中。自從我在研究生期間接觸到maven之後,我逐漸了解到了maven的強大,在這裏不得不感嘆。因為是小型敏捷團隊,所以版本控制是必須的。我還是想通過maven來控制jar包。所以我直接去了maven中央圖書館搜索了壹下。真的有。經過小組討論,我們決定使用tomcat7.039(好像40已經發布了),解決了版本控制和jar包配置的問題。Pom關於tomcat3的三個jar包如下:

1 & lt;依賴性& gt2 & ltgroupId & gtorg . Apache . Tomcat & lt;/groupId & gt;3 & ltartifactId & gt雄貓-郊狼& lt/artifact id & gt;4 & lt版本& gt7.0.39</version & gt;5 & lt/dependency & gt;6 & lt依賴性& gt7 & ltgroupId & gtorg . Apache . Tomcat & lt;/groupId & gt;8 & ltartifactId & gtTomcat-catalina & lt;/artifact id & gt;9 & lt版本& gt7.0.39</version & gt;10 & lt;/dependency & gt;11 & lt;依賴性& gt12 & lt;groupId & gtorg . Apache . Tomcat & lt;/groupId & gt;13 & lt;artifactId & gtTomcat-註解-API & lt;/artifact id & gt;14 & lt;版本& gt7.0.39</version & gt;15 & lt;/dependency & gt;

下壹步是解決架構問題。目前網上找到的關於websocket的實踐很少,基本都是websocket架構和非常簡單的例子(tomcat自帶websocket例子)。websocket機制怎麽用?首先基本框架是打算用hibernate+spring mvc結合websocket,但是實際實驗中spring mvc和websocket會有壹些沖突。因為直到前段時間,Spring Framework 4.0發布的版本才支持JDK 8和WebSocket編程。所以現階段我們需要其他方式來實現spring mvc+websocket。簡單的解決方案是編寫壹個工具類來手動獲取bean。解決spring和websocket支持後需要解決的websocket交互方式。websocket最直接的兩種方法是onTextMessage和onBinaryMessage,分別是字節流傳輸和字符流傳輸。最好的辦法是設計壹套自己的傳輸協議。字節流傳輸。前臺和後臺分別解析協議,獲得交互操作。其次,可以在onTextMessage,也就是字符流上做文章。json的引入可以得到很好的支持。

要配置websocket:

1實現繼承ContextLoaderListener的類,並在web.xml中配置

1導入javax . servlet . servlet context;2導入javax . servlet . servletcontextevent;3 4導入org . spring framework . context . application context;5導入org . spring framework . web . context . context loader listener;6導入org . spring framework . web . context . support . webapplicationcontextutils;7 8公共類SpringLoaderListener擴展ContextLoaderListener { 9 10 @ override 11公共void context initialized(Se rvletContextEvent事件){ 12 super . context initialized(event);13 servlet context context = event . getservlet context();14 application context CTX = webapplicationcontextutils . getrequiredwebapplicationcontext(context);15 springcontextutil . set context(CTX);16 17 }18 19 }

web.xml

1 & lt;聽眾& gt2 & lt偵聽器類& gt3 XXXXXX . utils . spring loader listener 4 & lt;/listener-class & gt;5 & lt/listener & gt;

獲取spring bean工具類:

1導入org . spring framework . beans . beans exception;2導入org . spring framework . beans . factory . nosuchbean definitionexception;3導入org . spring framework . context . application context;4 5公共類SpringContextUtil { 6私有靜態ApplicationContext上下文;7 8公共靜態application context get context(){ 9返回上下文;10 } 11 12公共靜態void set context(application context context){ 13 spring context util . context = context;14 }15 16公共靜態對象getBean(String name)拋出BeansException{17返回context . get bean(name);18 } 19 20 @ suppress warnings(" unchecked ")21公共靜態對象getBean(String name,Class requiredType)拋出beans exception { 22 return context . get bean(name,required type);23 } 24 25 public static boolean contains bean(字符串名稱){ 26 return context.containsBean(名稱);27 } 28 29 public static boolean is singleton(String name)拋出nosuchbeandidefinitionexception { 30 return context . is singleton(name);31 } 32 33 @ suppress warnings(" unchecked ")34公共靜態類getType(String name)拋出nosuchbeandidefinitionexception { 35 return context . getType(name);36 } 37 38 public static String[]getaliasses(String name)拋出nosuchbeandetificationexception { 39 return context . getaliasses(name);40 } 41 42 43 }

介紹json需要的jar包:

1 & lt;依賴性& gt2 & ltgroupId & gtcom . Google . code . gson & lt;/groupId & gt;3 & ltartifactId & gtgson & lt/artifact id & gt;4 & lt版本& gt2 . 2 . 3 & lt;/version & gt;5 & lt/dependency & gt;6 & lt依賴性& gt7 & ltgroupId & gtnet . SF . JSON-lib & lt;/groupId & gt;8 & ltartifactId & gtJSON-lib & lt;/artifact id & gt;9 & lt版本& gt2.4 & lt/version & gt;10 & lt;/dependency & gt;11 & lt;依賴性& gt12 & lt;groupId & gtnet . SF . ez morph & lt;/groupId & gt;13 & lt;artifactId & gtezmorph & lt/artifact id & gt;14 & lt;版本& gt1 . 0 . 6 & lt;/version & gt;15 & lt;/dependency & gt;

後臺需要添加兩個文件,壹個繼承WebSocketServlet:

1導入javax . servlet . annotation . web servlet;2導入javax . servlet . mand dispatcher;5 6 public roomsessageinbound(){ 7 if(command dispatcher = = null){ 8 command dispatcher =(CommandDispatcherUtils)spring context util . get bean(" command dispatcher ");9 room = roomlistmodel . getinstance()。getRoom(0);10 } 11 } 12 13 14 @ override 15 protected void on open(ws outbound outbound)16 room . adduser(outbound . hashcode());17 super.onOpen(出站);18 } 19 20 @ override 21 protected void on close(int status){ 22 room . remove(getWsOutbound()。hashCode());23 super.onClose(狀態);24 }25 26 @Override27受保護的void on binary message(byte buffer buffer)拋出io exception { 28 29 } 30 31 @ override 32受保護的void on text message(char buffer buffer)拋出io exception { 33 String msg = buffer . tostring();34 JSON object report = JSON object . from object(msg);35 template command command = command dispatcher . getcommandbykey(report . getstring(" command "));36 command.execute(消息、用戶、房間);37 }38 39 }

可以通過json Object Report = JSON Object將字符串轉換成JSON對象。來自對象(消息)。相當於通過websocket實現了實時對象信息的傳輸。

在首頁,妳只需要在頁面加載的時候把它添加到js就可以了。

1 $(function(){ 2 room socket = new web socket(' ws://127 . 0 . 0 . 1:8080/XXXX/房間);3 }

前端發送到後臺時,數據json.stringify(data)可以是json。

上面的代碼被刪除了很多。所以代碼不需要復制就能工作。只是提供壹個解決方案。而且新版java或者Spring Framework 4.0會很容易支持websocket的實現。主要是總結我這段時間的websocket研究。隨著各種新技術的誕生,實時web技術變得越來越成熟。Websocket是html5的壹個重要特性,值得壹看,值得研究。

  • 上一篇:水電站綜合自動化系統分析與設計?
  • 下一篇:極客是什麽意思?
  • copyright 2024編程學習大全網