標籤:bool bubble 技術分享 即時 通訊 長串連 origin ebs http
原文網址:http://www.jianshu.com/p/21d9b3b94cfc
WebSocket 的使得瀏覽器提供對 Socket 的支援成為可能,從而在瀏覽器和伺服器之間提供了一個基於 TCP 串連的雙向通道。Web 開發人員可以非常方便地使用 WebSocket 構建即時 web 應用。
1.WebSocket 機制
以下簡要介紹一下 WebSocket 的原理及運行機制。
WebSocket 是 HTML5 一種新的協議。它實現了瀏覽器與伺服器全雙工系統通訊,能更好的節省伺服器資源和頻寬並達到即時通訊,它建立在 TCP 之上,同 HTTP 一樣通過 TCP 來傳輸資料,但是它和 HTTP 最大不同是:
WebSocket 是一種雙向通訊協定,在建立串連後,WebSocket 伺服器和 Browser/Client Agent 都能主動的向對方發送或接收資料,就像 Socket 一樣;
WebSocket 需要類似 TCP 的用戶端和伺服器端通過握手串連,串連成功後才能相互連信。
使用 WebSocket 模式用戶端與伺服器的互動如:
WebSocket 是類似 Socket 的 TCP 長串連的通訊模式,一旦 WebSocket 串連建立後,後續資料都以幀序列的形式傳輸。在用戶端斷開 WebSocket 串連或 Server 端斷掉串連前,不需要用戶端和服務端重新發起串連請求。在海量並發及用戶端與伺服器互動負載流量大的情況下,極大的節省了網路頻寬資源的消耗,有明顯的效能優勢,且用戶端發送和接受訊息是在同一個持久串連上發起,即時性優勢明顯。
2.在iOS中WebSocket的具體實現
1>下載WebSocket的sdk,並匯入工程裡面
2>在聊天的控制器裡匯入標頭檔代理等
3>具體使用
//串連連接埠
_webSocket.delegate = nil;
[_webSocket close];
_webSocket = [[SRWebSocket alloc] initWithURLRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"ws://www.qsjia.com:7272"]]];
_webSocket.delegate = self;
[_webSocket open];
NSLog(@"open success!");
[self webSocketDidOpen:_webSocket];
//實現代理方法
#pragma SRWebSocketDelegate
//串連成功
- (void)webSocketDidOpen:(SRWebSocket *)webSocket;
{
NSLog(@"Websocket Connected");
}
//串連失敗
- (void)webSocket:(SRWebSocket *)webSocket didFailWithError:(NSError *)error;
{
NSLog(@":( Websocket Failed With Error %@", error);
_webSocket = nil;
}
//接收到新訊息的處理
- (void)webSocket:(SRWebSocket *)webSocket didReceiveMessage:(id)message;
{
NSLog(@"Received \"%@\"", message);
self.str = message;
self.myMessage = [ChatViewController dictionaryWithJsonString:self.str];
self.ping = [self.myMessage objectForKey:@"type"];
if ([self.ping isEqualToString:@"say"]) {
[self addMessage];
[self.arr enumerateObjectsUsingBlock:^(PersonDetail* _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
if ( [obj.myid integerValue] == [self.myMessage[@"roomid"] integerValue]) {
[self.arr exchangeObjectAtIndex:idx withObjectAtIndex:0];
}
}];
[self.tableView reloadData];
}
//[self.tableView reloadData];
}
//串連關閉
- (void)webSocket:(SRWebSocket *)webSocket didCloseWithCode:(NSInteger)code reason:(NSString *)reason wasClean:(BOOL)wasClean;
{
NSLog(@"WebSocket closed");
//self.title = @"Connection Closed! (see logs)";
_webSocket = nil;
}
//登入伺服器要發送的字串(根據具體後台設定)
//擷取UserDefault
NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];
NSString *uid = [userDefault objectForKey:@"uid"];
NSMutableDictionary *dic = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"login",@"type",@"1",@"room_id",uid,@"client_name", nil];
[dic enumerateKeysAndObjectsUsingBlock:^(NSString * key, id obj, BOOL *stop) {
if ([key isEqualToString:@"client_name"]) {
[dic setValue:@([uid intValue]) forKey:@"client_name"];
}else if ([key isEqualToString:@"room_id"]){
[dic setValue:@([@"1" intValue]) forKey:@"room_id"];
}
}];
NSData *data = [NSJSONSerialization dataWithJSONObject:dic options:NSJSONWritingPrettyPrinted error:NULL];
NSString *string = [[ NSString alloc ] initWithData :data encoding : NSUTF8StringEncoding];
//NSLog(@"%@",string);
[_webSocket send:string];
//退出伺服器要發送的字串
NSMutableDictionary *dic = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"loginout",@"type",nil];
NSData *data = [NSJSONSerialization dataWithJSONObject:dic options:NSJSONWritingPrettyPrinted error:NULL];
NSString *string = [[ NSString alloc ] initWithData :data encoding : NSUTF8StringEncoding];
[_webSocket send:string];
webSocket一般是配合資料庫一起使用的,實現的邏輯要根據具體情況來確定的.
文/1seven(簡書作者)
原文連結:http://www.jianshu.com/p/21d9b3b94cfc
著作權歸作者所有,轉載請聯絡作者獲得授權,並標註“簡書作者”。
【轉】iOS基於WebSocket的聊天機制