成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

基于WebSocket構(gòu)建移動(dòng)端實(shí)時(shí)應(yīng)用

移動(dòng)開(kāi)發(fā)
對(duì)于傳統(tǒng)的網(wǎng)絡(luò)應(yīng)用,大部分情況下使用的是Http短連接,這意味著你發(fā)送一次請(qǐng)求,服務(wù)器給你返回響應(yīng)信息,然后連接就被斷掉了。然而現(xiàn)實(shí)生活 中,很多應(yīng)用實(shí)際上是需要一種實(shí)時(shí)機(jī)制的支持,比如微信,你就需要實(shí)時(shí)收到對(duì)方發(fā)送的回復(fù)信息。

前言

對(duì)于傳統(tǒng)的網(wǎng)絡(luò)應(yīng)用,大部分情況下使用的是Http短連接,這意味著你發(fā)送一次請(qǐng)求,服務(wù)器給你返回響應(yīng)信息,然后連接就被斷掉了。然而現(xiàn)實(shí)生活 中,很多應(yīng)用實(shí)際上是需要一種實(shí)時(shí)機(jī)制的支持,比如微信,你就需要實(shí)時(shí)收到對(duì)方發(fā)送的回復(fù)信息。對(duì)于應(yīng)用處于后臺(tái)的情況下,你可以使用系統(tǒng)級(jí)別的推送服 務(wù),比如iOS下的APNS和Android下的GCM。應(yīng)用處于前臺(tái)時(shí)呢,則需要自己去和服務(wù)端建立一個(gè)Http長(zhǎng)連接或者輪詢,這種方式對(duì)于服務(wù)器的性能要求還是比較高的。HTML5中提出了一種新的雙向通信協(xié)議--WebSocket,本文嘗試采用這種技術(shù)來(lái)實(shí)現(xiàn)以上的實(shí)時(shí)推送功能。

WebSocket

WebSocket是HTML5開(kāi)始提供的一種在客戶端和服務(wù)器間持久連接的雙向通信網(wǎng)絡(luò)技術(shù)。 WebSocket通信協(xié)議于2011年被IETF定為標(biāo)準(zhǔn) RFC 6455,WebSocketAPI被W3C定為標(biāo)準(zhǔn)。協(xié)議本身使用新的ws://URL格式,但它是在標(biāo)準(zhǔn)HTTP上實(shí)現(xiàn)的。通過(guò)使用HTTP和 HTTPS端口,它避免了從Web代理后的網(wǎng)絡(luò)連接站點(diǎn)時(shí)引入的各種問(wèn)題。HTML5規(guī)范不只描述了協(xié)議本身,還描述了使用WebSocket編寫客戶端 代碼所需要的瀏覽器API。在WebSocket API中,瀏覽器和服務(wù)器只需要做一個(gè)握手的動(dòng)作,然后,瀏覽器和服務(wù)器之間就形成了一條快速通道。兩者之間就直接可以數(shù)據(jù)互相傳送。

服務(wù)端實(shí)現(xiàn)

服務(wù)端采用了Facebook開(kāi)源的Tornado框架,由于Tornado原生支持WebSocket協(xié)議,用它來(lái)實(shí)現(xiàn)服務(wù)端非常方便。

Tornado在WebSocket模塊中提供了一個(gè)WebSocketHandler類。這個(gè)類提供了和已連接的客戶端通信的WebSocket 事件和方法的鉤子。當(dāng)一個(gè)新的WebSocket連接打開(kāi)時(shí),open方法被調(diào)用,而on_message和on_close方法分別在連接接收到新的消 息和客戶端關(guān)閉時(shí)被調(diào)用。

此外,WebSocketHandler類還提供了write_message方法用于向客戶端發(fā)送消息,close方法用于關(guān)閉連接。

以開(kāi)關(guān)狀態(tài)改變檢測(cè)為例,服務(wù)端部署的代碼如下:

  1. class Switch(BaseModel): 
  2.     __tablename__ = 'switch'       
  3.  
  4.     id = Column(Integer, primary_key = True) 
  5.     name = Column(String(30)) 
  6.     status = Column(Boolean, server_default = text('False')) #開(kāi)關(guān)當(dāng)前狀態(tài) 
  7.     level = Column(Integer)                                  #最小可操作等級(jí) 
  8.  
  9.     callbacks = [] 
  10.     @classmethod 
  11.     def register(cls, callback): 
  12.         cls.callbacks.append(callback) 
  13.  
  14.     @classmethod 
  15.     def unregister(cls, callback): 
  16.         cls.callbacks.remove(callback) 
  17.  
  18.     def notifyCallbacks(self): 
  19.         for callback in self.callbacks: 
  20.             callback(self.id,self.status) 

以上是封裝的開(kāi)關(guān)對(duì)象,使用了SQLAlchemy作為ORM,其中BaseModel是繼承自declarative_base。 定義了兩個(gè)類方法,分別是注冊(cè)和移除回調(diào),另外一個(gè)實(shí)例方法來(lái)通知回調(diào)。

對(duì)外處理請(qǐng)求的handler:

  1. class GetSwitchStatusHandler(BaseWebsockHandler): 
  2.  
  3.     def open(self): 
  4.         Switch.register(self.callback) 
  5.  
  6.     def on_close(self): 
  7.         Switch.unregister(self.callback) 
  8.              
  9.     def on_message(self,msg): 
  10.         pass 
  11.  
  12.     def callback(self,switch_id,status): 
  13.         self.write_message('{"switch_id":"%s","status":"%d"}'%(switch_id,status)) 

BaseWebsockHandler繼承自tornado.websocket.WebSocketHandler,在initialize中對(duì)于SQLAlchemy的session進(jìn)行了初始化

由于在本例中不需要取客戶端的上行消息,故直接pass調(diào)了on_message方法。callback方法則用來(lái)處理回調(diào),將改變后的開(kāi)關(guān)信息返回給客戶端。

客戶端實(shí)現(xiàn)

客戶端使用了Square開(kāi)源的SocketRocket

在iOS工程中安裝可以直接使用源碼,也可以用CocoaPods安裝,將以下依賴加入到PodFile中,再執(zhí)行install命令即可

pod 'SocketRocket', '~> 0.3.1-beta2'

SocketRocket的核心是SRWebSocket這個(gè)類,需要在使用WebSocket連接的ViewController中實(shí)現(xiàn)SRWebSocketDelegate。

  1. - (void)connect{ 
  2.      
  3.     webSocket.delegate = nil; 
  4.     [webSocket close];  
  5.     webSocket = [[SRWebSocket alloc] initWithURLRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:SWITCH_STATUS_URL]]]; 
  6.     webSocket.delegate = self; 
  7.     NSLog(@"Opening Connection..."); 
  8.     [webSocket open]; 
  9.  
  10. ··· 
  11.  
  12. pragma mark - SRWebSocketDelegate 
  13.  
  14. - (void)webSocketDidOpen:(SRWebSocket *)webSocket;{ 
  15.     NSLog(@"Websocket Connected"); 
  16.  
  17. - (void)webSocket:(SRWebSocket *)webSocket didFailWithError:(NSError *)error;{ 
  18.     NSLog(@":( Websocket Failed With Error %@", error); 
  19.     webSocket = nil; 
  20.  
  21. - (void)webSocket:(SRWebSocket *)webSocket didReceiveMessage:(id)message;{ 
  22.     NSLog(@"Received \"%@\"", message); 
  23.  
  24. - (void)webSocket:(SRWebSocket *)webSocket didCloseWithCode:(NSInteger)code reason:(NSString *)reason wasClean:(BOOL)wasClean;{ 
  25.     NSLog(@"WebSocket closed"); 
  26.     webSocket = nil; 

把delegate指向自身,然后調(diào)用SRWebSocket中的方法發(fā)送請(qǐng)求即可。 收到下行消息會(huì)調(diào)用didReceiveMessage這個(gè)方法,如果需要在請(qǐng)求時(shí)攜帶參數(shù),可以用類似get請(qǐng)求的方法,將請(qǐng)求放在url字符串中。

到此為止WebSocket的基本功能就實(shí)現(xiàn)完畢了,完整demo可以參考我的Github

原文地址

責(zé)任編輯:徐川 來(lái)源: blog
相關(guān)推薦

2016-07-29 13:47:05

RethinkDBWeb

2017-11-03 15:05:56

Storm數(shù)據(jù)處理服務(wù)器

2024-03-19 08:45:45

WebSocketSpring應(yīng)用開(kāi)發(fā)

2021-07-13 07:04:19

Flink數(shù)倉(cāng)數(shù)據(jù)

2014-06-10 13:54:05

Node.jsSocket.IOWebSocket

2024-09-30 11:45:10

2014-07-18 09:59:17

移動(dòng)webJavascript移動(dòng)Web

2017-09-26 09:35:22

2013-04-01 09:35:30

移動(dòng)云應(yīng)用BYOD云模型

2014-12-04 14:10:22

移動(dòng)應(yīng)用云

2014-07-07 11:33:50

SaaSNew Relic移動(dòng)開(kāi)發(fā)

2021-08-31 10:18:34

Flink 數(shù)倉(cāng)一體快手

2024-06-12 08:46:19

2013-03-28 14:54:36

2017-01-19 17:37:00

iOS移動(dòng)端架構(gòu)設(shè)計(jì)

2023-08-16 14:39:20

微服務(wù)Java

2022-07-27 17:40:47

技術(shù)人臉識(shí)別移動(dòng)

2023-06-09 13:07:56

Web機(jī)器學(xué)習(xí)瀏覽器

2014-07-21 10:56:16

web CMSJavascriptjQuery插件

2015-02-05 09:56:53

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 亚洲成人一级片 | 超碰97人人人人人蜜桃 | 你懂的免费在线 | 91传媒在线观看 | 国产精品a级 | 玖玖在线精品 | 中文字幕亚洲无线 | 人人射人人插 | 国产精品免费看 | 久久九九影视 | 日韩中文字幕一区 | 国产精品免费一区二区 | 一级毛片在线播放 | 视频在线一区 | 精品一区二区在线观看 | 亚洲国产偷 | 91久久国产综合久久 | 午夜爽爽男女免费观看hd | 欧美激情综合 | 成人依人| 国产亚洲网站 | 欧美一区二区 | 欧美综合一区 | 91精品国产91久久久久久最新 | 激情福利视频 | 日韩电影在线一区 | 国产精品福利在线观看 | 久久伊人精品一区二区三区 | 精品在线免费观看视频 | 欧美日韩国产精品 | 午夜精品一区二区三区在线 | 天天爽天天操 | 久久麻豆精品 | 亚州无限乱码 | 国产精品视频中文字幕 | 色综久久| 中文字幕影院 | 久久精品成人一区 | 免费在线观看91 | 日韩在线欧美 | 精品欧美一区二区三区免费观看 |