Explorar o código

socket连接优化

zwp hai 4 meses
pai
achega
9c5cac5389

+ 0 - 1
AIIM/AppDelegate.h

@@ -19,7 +19,6 @@ static AppDelegate * _Nullable app = nil;
 @property (nonatomic) BOOL isLogin;
 @property (nonatomic, assign) BOOL shouldShowLock; // 是否需要显示锁屏
 @property (nonatomic, assign) BOOL isLock; // 标记是否为应用启动
-@property (nonatomic, assign, readonly) BOOL isReachable;
 
 @property (nonatomic) BOOL isJitsiMeet;
 

+ 1 - 28
AIIM/AppDelegate.m

@@ -10,7 +10,6 @@
 #import <UserNotifications/UserNotifications.h>
 #import <PushKit/PushKit.h>
 #import "CallKit/CallKit.h"
-#import <AFNetworking/AFNetworkReachabilityManager.h>
 #import "UserNetApi.h"
 #import "CryptoAES.h"
 #import "GWebSocket.h"
@@ -37,9 +36,7 @@
 @import JitsiMeetSDK;
 
 @interface AppDelegate ()<UNUserNotificationCenterDelegate,PKPushRegistryDelegate,CXProviderDelegate>
-{
-    BOOL _isReachable;
-}
+
 @property (nonatomic, strong) CXProvider *callProvider;
 @property (nonatomic) NSUUID *uuid;
 @property (nonatomic) NSDictionary *msg;
@@ -88,7 +85,6 @@
     [self setupListener];
     [self registerPushright];
     [self setupCallProvider];
-    [self startNetworkReachability];
     
     _floatWindow = [[FloatingWindow alloc] initWithFrame:self.window.bounds];
     [_floatWindow hide];
@@ -119,7 +115,6 @@
     NSLog(@"applicationDidBecomeActive");
    
     if(self.isLogin){
-        [self sartWebsocket];
         if(self.isJitsiMeet){
             [_floatWindow viewInFload:0];
         }
@@ -900,7 +895,6 @@
 #pragma mark openSocket
 
 -(void)sartWebsocket{
-    NSLog(@"----------------sartWebsocket");
     [[GWebSocket shareInstance] connectWebSocket];
 }
 
@@ -973,27 +967,6 @@
     }
 }
 
-#pragma mark 检测网络状态
--(void)startNetworkReachability {
-    AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];
-    __weak typeof(manager) weakManager = manager;
-    [manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
-        BOOL isReachable = weakManager.isReachable;
-        self->_isReachable = isReachable;
-        NSLog(@"startNetworkReachability: %d", isReachable);
-        if (isReachable) {
-            
-        } else {
-            
-        }
-    }];
-    
-    [manager startMonitoring];
-}
-
-- (BOOL)isReachable {
-    return _isReachable;
-}
 
 #pragma mark applock
 - (void)showLockScreen {

+ 6 - 6
AIIM/Base.lproj/Main.storyboard

@@ -518,7 +518,7 @@
                                 </connections>
                             </button>
                             <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="Label" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="PuO-hM-rvB">
-                                <rect key="frame" x="77" y="71" width="220" height="21"/>
+                                <rect key="frame" x="77" y="71" width="219" height="21"/>
                                 <autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMaxY="YES"/>
                                 <fontDescription key="fontDescription" type="system" pointSize="17"/>
                                 <color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
@@ -654,7 +654,7 @@
                                 <buttonConfiguration key="configuration" style="filled" title="yanzhengm"/>
                             </button>
                             <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="Label" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="dif-fg-naJ">
-                                <rect key="frame" x="48" y="546" width="282" height="21"/>
+                                <rect key="frame" x="47" y="546" width="283" height="21"/>
                                 <autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxY="YES"/>
                                 <fontDescription key="fontDescription" type="system" pointSize="17"/>
                                 <color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
@@ -876,7 +876,7 @@
                                 </connections>
                             </button>
                             <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="好友信息" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="36H-i5-l2s">
-                                <rect key="frame" x="89" y="50" width="198" height="21"/>
+                                <rect key="frame" x="88" y="50" width="198" height="21"/>
                                 <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMaxY="YES"/>
                                 <fontDescription key="fontDescription" type="system" pointSize="17"/>
                                 <color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
@@ -983,7 +983,7 @@
                                 </connections>
                             </button>
                             <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="Label" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="QrT-jx-Otq">
-                                <rect key="frame" x="77" y="37" width="220" height="36"/>
+                                <rect key="frame" x="77" y="37" width="219" height="36"/>
                                 <autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMaxY="YES"/>
                                 <fontDescription key="fontDescription" type="system" pointSize="17"/>
                                 <color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
@@ -1446,8 +1446,8 @@
                                     <constraint firstItem="fqm-Wo-Kyd" firstAttribute="leading" secondItem="CBU-HY-KvD" secondAttribute="trailing" constant="5" id="ybr-K1-Ee3"/>
                                 </constraints>
                             </view>
-                            <label opaque="NO" userInteractionEnabled="NO" tag="999" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="9dU-L3-mrV">
-                                <rect key="frame" x="166.5" y="20" width="42" height="44"/>
+                            <label opaque="NO" userInteractionEnabled="NO" tag="999" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="9dU-L3-mrV">
+                                <rect key="frame" x="187.5" y="20" width="0.0" height="44"/>
                                 <constraints>
                                     <constraint firstAttribute="height" constant="44" id="Ac6-DC-aG5"/>
                                 </constraints>

+ 7 - 5
AIIM/Common/Network/GWebSocket.h

@@ -11,23 +11,25 @@
 
 #endif /* GWebSocket_h */
 #import "config.h"
+#import "SocketRocket/SRWebSocket.h"
 
 @protocol GWebSocketDelegate <NSObject>
-@optional
-- (void)GWebSocketAction:(NSString *_Nullable)message;
+
+- (void)onSocketConnectionStateChanged:(SRReadyState)state;
+
 @end
 
 static NSString * _Nullable Friendchat=@"0";
 static NSString * _Nullable Groupchat=@"1";
 
 @interface GWebSocket : NSObject
-+ (GWebSocket *_Nonnull)shareInstance;
 @property (nonatomic,weak) id <GWebSocketDelegate> delegate;
+@property (nonatomic, assign, readonly) BOOL isReachable;
+
++ (GWebSocket *_Nonnull)shareInstance;
 - (void)connectWebSocket;
 - (void)closeWebSocket;
 
-- (void)chekWebSocket;
-
 - (void)sendMsg:(NSString *_Nonnull)msg;
 -(void)sendRecNote:(NSDictionary *_Nullable)msg;
 

+ 126 - 115
AIIM/Common/Network/GWebSocket.m

@@ -7,17 +7,15 @@
 
 #import <Foundation/Foundation.h>
 #import "GWebSocket.h"
-#import "SocketRocket/SRWebSocket.h"
-//#import "AFNetworking/AFNetworkReachabilityManager.h"
+#import <AFNetworking/AFNetworkReachabilityManager.h>
 #import "GDBManager.h"
-//#import "AFNetworkReachabilityManager.h"
 #import "ChatListStore.h"
 #import "ChatsStore.h"
 #import "WebRTCStore.h"
 #import "UserNetApi.h"
 #import "LoginStateManager.h"
 
-static int const kHeartbeatDuration = 1;
+static int const kHeartbeatDuration = 10;
 static int const timeoutError = 5;
 
 static NSString *ping = @"{\"code\":0}";
@@ -30,17 +28,14 @@ static NSString *redeady = @"{\"code\":1}";
 
 @property (nonatomic,strong) NSString *serverIpString;
 @property (nonatomic,strong) NSString *userid;
-
-@property (nonatomic,assign) BOOL autoReconnect;
-@property (nonatomic,assign) NSInteger pingCount;
-@property (nonatomic,assign) NSInteger reconnetCount;
-@property (nonatomic,assign) BOOL isFirstload;
 @property (nonatomic,strong) NSString *UUID;
 @end
 
 
 @implementation GWebSocket
-
+{
+    BOOL _isReachable;
+}
 + (GWebSocket *_Nonnull)shareInstance{
     static id gShareInstance = nil;
     static dispatch_once_t onceToken;
@@ -52,32 +47,25 @@ static NSString *redeady = @"{\"code\":1}";
 
 - (instancetype)init {
     if (self = [super init]) {
-        self.pingCount = 0;
-        self.reconnetCount = 0;
         NSUUID *uid = [NSUUID UUID];
         _UUID=uid.UUIDString;
         NSLog(@"_UUID:%@",_UUID);
+        [self startNetworkReachability];
+        [self startHeartbeat];
+        [self addObserver];
     }
     return self;
 }
 
 #pragma mark - Public -
 - (void)connectWebSocket {
-    self.autoReconnect = YES;
     [self initWebSocket];
-    [self startHeartbeat];
 }
 - (void)closeWebSocket {
-    self.autoReconnect = NO;
 //    _UUID=nil;
     [self close];
 }
 
-#pragma mark 探测socket 状态
-- (void)chekWebSocket{
-    
-}
-
 - (void)sendMsg:(NSString *)msg {
     if (self.socket && self.socket.readyState == SR_OPEN) {
         // 只有在socket状态为SR_OPEN 时,才可以发送消息
@@ -87,7 +75,7 @@ static NSString *redeady = @"{\"code\":1}";
     }
     else{
         NSLog(@"socket--------不可用");
-        [self reConnect];
+        [self reConnectSocket];
     }
 //    NSLog(@"_UUID:%@",_UUID);
 }
@@ -97,11 +85,6 @@ static NSString *redeady = @"{\"code\":1}";
 #pragma mark -- WebSocket
 //初始化 WebSocket
 - (void)initWebSocket{
-    if (_socket) {
-        return;
-    }
-    self.isFirstload =YES;
-//    [self destoryHeartbeat];
     NSDictionary *userinfo =[UDManager.shareInstance getDDManager:dkuserinfo];
     self.userid =userinfo[@"id"];
     
@@ -132,81 +115,76 @@ static NSString *redeady = @"{\"code\":1}";
 }
 
 #pragma mark - Heart Timer -
+
+- (void)addObserver {
+    // 进入后台
+    [[NSNotificationCenter defaultCenter] addObserver:self
+                                             selector:@selector(appDidEnterBackground)
+                                                 name:UIApplicationDidEnterBackgroundNotification
+                                               object:nil];
+    
+    // 回到前台
+    [[NSNotificationCenter defaultCenter] addObserver:self
+                                             selector:@selector(appWillEnterForeground)
+                                                 name:UIApplicationWillEnterForegroundNotification
+                                               object:nil];
+}
+
+- (void)appDidEnterBackground {
+    [self destoryHeartbeat];
+}
+
+- (void)appWillEnterForeground {
+    [self startHeartbeat];
+    [self checkReconnectIfNeed];
+}
+
+
 //保活机制 探测包
 - (void)startHeartbeat {
-    if(self.heatBeat){
-        return;
-    }
-    self.heatBeat = [NSTimer scheduledTimerWithTimeInterval:kHeartbeatDuration target:self selector:@selector(heartbeatAction) userInfo:nil repeats:YES];
-    [self.heatBeat setFireDate:[NSDate distantPast]];
-    [[NSRunLoop currentRunLoop] addTimer:_heatBeat forMode:NSRunLoopCommonModes];
+    self.heatBeat = [NSTimer scheduledTimerWithTimeInterval:kHeartbeatDuration
+                                                     target:self
+                                                   selector:@selector(heartbeatAction)
+                                                   userInfo:nil
+                                                    repeats:YES];
+    [[NSRunLoop currentRunLoop] addTimer:self.heatBeat forMode:NSRunLoopCommonModes];
 }
 
 
 //断开连接时销毁心跳
 - (void)destoryHeartbeat{
-    if(self.heatBeat){
-        [self.heatBeat invalidate];
-        self.heatBeat = nil;
-    }
+    [_heatBeat invalidate];
+    _heatBeat = nil;
 }
 
 // 发送心跳
 - (void)heartbeatAction {
+    NSLog(@"XTWebSocket heartbeatAction readyState: %ld", self.socket.readyState);
 
-    if (self.socket.readyState == SR_OPEN) {
-//        NSLog(@"heartbeatAction1111");
-        self.pingCount = self.pingCount+1;
-        self.reconnetCount = self.reconnetCount+1;
-        if(self.pingCount>5){//连续多次发送ping 没有收到回复,发起重连;
-            [self.socket close];
-            self.socket = nil;
-            self.pingCount=0;
-            [self reConnect];
-        }
-        if(self.pingCount>=3&&self.socket){
-            [self sendPing];
-        }
+    BOOL isLoggedIn = [LoginStateManager sharedManager].isLoggedIn;
+    if (!isLoggedIn) {
+        NSLog(@"XTWebSocket heartbeatAction not login!");
+        return;
     }
-    else{
-//        NSLog(@"heartbeatAction222");
-        self.pingCount = self.pingCount+1;
-        self.reconnetCount = self.reconnetCount+1;
-        if(self.pingCount>5){//连续多次发送ping 没有收到回复,发起重连;
-            [self.socket close];
-            self.socket = nil;
-            self.pingCount=0;
-            [self reConnect];
-        }
+    switch (self.socket.readyState) {
+        case SR_CONNECTING:
+            break;
+        case SR_OPEN:
+            [self sendPing];
+            break;
+        case SR_CLOSING:
+            break;
+        case SR_CLOSED:
+            [self reConnectSocket];
+            break;
     }
 }
 
 
 //重连机制
-- (void)reConnect{
-    if (!self.autoReconnect) {
-        return;
-    }
-    
-    self.socket = nil;
+- (void)reConnectSocket{
+    [self closeWebSocket];
     [self initWebSocket];
-    
-//    NSLog(@"reConnect1111---------:%ld",(long)self.reconnetCount);
-    if(self.reconnetCount>15){
-        NSString *token = [UDManager.shareInstance getSDManager:gkeytoken];
-        if([token isKindOfClass:[NSString class]]&&token.length>10){
-            [UserNetApi getUserinfo:^(int code, NSDictionary * res) {
-                NSNumber *gcode=res[@"code"];
-                NSLog(@"gcode11");
-                if([gcode intValue]==401){//token有效
-                    [self logoutAct];
-                }
-            } fail:^(NSError * _Nonnull error) {
-                NSLog(@"11%@", error);
-            }];
-        }
-    }
-    
 }
 
 
@@ -220,16 +198,11 @@ static NSString *redeady = @"{\"code\":1}";
 #pragma mark -- SRWebSocketDelegate
 //收到服务器消息是回调
 - (void)webSocket:(SRWebSocket *)webSocket didReceiveMessage:(id)message{
-    //NSLog(@"----XTWebSocket didReceiveMessage:%@",message);
+    NSLog(@"----XTWebSocket didReceiveMessage:%@",message);
     if ([message isKindOfClass:[NSString class]]) {
         NSString *msg = (NSString *)message;
         NSError *error;
-        self.pingCount = 0;
-        self.reconnetCount = 0;
         if([msg isEqual:ping]){
-            if(self.isFirstload){//第一次打开socket数据加载完成需要执行的
-                
-            }
             return;
         }
 //        NSLog(@"didReceiveMessage:%@",msg);
@@ -302,35 +275,29 @@ static NSString *redeady = @"{\"code\":1}";
                 return;
             }
         }
-        if(self.delegate){
-            [self.delegate GWebSocketAction:message];
-        }
     }
 }
 
 //连接成功
 - (void)webSocketDidOpen:(SRWebSocket *)webSocket{
-    NSLog(@"-----XTWebSocket DidOpen");
-    
-    // 下面逻辑,根据业务情况处理
-    if (self.socket != nil) {
-        // 只有 SR_OPEN 开启状态才能调 send 方法啊,不然要崩
-        if (_socket.readyState == SR_OPEN) {
-            //NSString *jsonString = @"{\"sid\": \"13b313a3-fea9-4e28-9e56-352458f7007f\"}";
-            //[_socket sendString:jsonString error:nil];  //发送数据包
+    NSLog(@"-----XTWebSocket DidOpen: %ld", webSocket.readyState);
+    switch (webSocket.readyState) {
+        case SR_CONNECTING:
+            break;
+        case SR_OPEN:{
             [self sendReady];
-        } else if (_socket.readyState == SR_CONNECTING) {
-            NSLog(@"正在连接中,重连后其他方法会去自动同步数据");
-            // 每隔2秒检测一次 socket.readyState 状态,检测 10 次左右
-            // 只要有一次状态是 SR_OPEN 的就调用 [ws.socket send:data] 发送数据
-            // 如果 10 次都还是没连上的,那这个发送请求就丢失了,这种情况是服务器的问题了,小概率的
-            // 代码有点长,我就写个逻辑在这里好了
-            
-        } else if (_socket.readyState == SR_CLOSING || _socket.readyState == SR_CLOSED) {
-            // websocket 断开了,调用 reConnect 方法重连
-            NSLog(@"websocket 断开了,调用 reConnect 方法重连");
-            [self reConnect];
-        }
+            if (![_heatBeat isValid]) {
+                [self destoryHeartbeat];
+                [self startHeartbeat];
+            }
+        }break;
+        case SR_CLOSING:
+            break;
+        case SR_CLOSED:
+            break;
+    }
+    if (self.delegate && [self.delegate respondsToSelector:@selector(onSocketConnectionStateChanged:)]) {
+        [self.delegate onSocketConnectionStateChanged:webSocket.readyState];
     }
 }
 
@@ -340,23 +307,31 @@ static NSString *redeady = @"{\"code\":1}";
     NSLog(@"XTWebSocket didFailWithError %@",error);
     // 1.判断当前网络环境,如果断网了就不要连了,等待网络到来,在发起重连
     // 2.判断调用层是否需要连接,例如用户都没在聊天界面,连接上去浪费流量
-    
-//    [self reConnect];
+    if (self.isReachable) {
+        [self reConnectSocket];
+    }
+    if (self.delegate && [self.delegate respondsToSelector:@selector(onSocketConnectionStateChanged:)]) {
+        [self.delegate onSocketConnectionStateChanged:webSocket.readyState];
+    }
 }
 
 //连接断开的回调
 - (void)webSocket:(SRWebSocket *)webSocket didCloseWithCode:(NSInteger)code reason:(NSString *)reason wasClean:(BOOL)wasClean{
     NSLog(@"XTWebSocket Close code %ld reason %@",(long)code,reason);
+    if (self.delegate && [self.delegate respondsToSelector:@selector(onSocketConnectionStateChanged:)]) {
+        [self.delegate onSocketConnectionStateChanged:webSocket.readyState];
+    }
 }
 
 - (void)webSocket:(SRWebSocket *)webSocket didReceivePong:(NSData *)pongPayload {
-    NSLog(@"XTWebSocket Pong");
+    NSString *string = [[NSString alloc] initWithData:pongPayload encoding:NSUTF8StringEncoding];
+    NSLog(@"XTWebSocket Pong:%@", string);
 }
 
 #pragma mark - 其他 -
 - (void)dealloc {
     NSLog(@"LFC: dealloc: %@", self);
-    [[NSNotificationCenter defaultCenter] removeObserver:self];
+    [self close];
 }
 
 
@@ -421,5 +396,41 @@ static NSString *redeady = @"{\"code\":1}";
 }
 
 
+#pragma mark 检测网络状态
+-(void)startNetworkReachability {
+    AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];
+    __weak typeof(manager) weakManager = manager;
+    [manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
+        BOOL isReachable = weakManager.isReachable;
+        self->_isReachable = isReachable;
+        NSLog(@"XTWebSocket ReachabilityStatusChange: %d", isReachable);
+        if (isReachable) {
+            [self checkReconnectIfNeed];
+        }
+    }];
+    
+    [manager startMonitoring];
+}
+
+- (BOOL)isReachable {
+    return _isReachable;
+}
+
+- (void)checkReconnectIfNeed {
+    NSLog(@"XTWebSocket checkReconnectIfNeed readyState: %ld", self.socket.readyState);
+    switch (self.socket.readyState) {
+        case SR_CONNECTING:
+            break;
+        case SR_OPEN:
+            break;
+        case SR_CLOSING:
+            break;
+        case SR_CLOSED:{
+            if (self.isReachable) {
+                [self reConnectSocket];
+            }
+        }break;
+    }
+}
 
 @end

+ 43 - 3
AIIM/Controller/chat/ChatController.m

@@ -46,7 +46,7 @@
 #import "OSSManager.h"
 
 static const CGFloat kQuoteViewHeight = 46.0f;
-@interface ChatController()<UITextViewDelegate,ChatsStoreDelegate,UITableViewDelegate,UITableViewDataSource,chatpopViewDelegate,PHPickerViewControllerDelegate,UINavigationControllerDelegate,UIDocumentPickerDelegate,UIScrollViewDelegate,OSSManagerDelegate>
+@interface ChatController()<UITextViewDelegate,ChatsStoreDelegate,UITableViewDelegate,UITableViewDataSource,chatpopViewDelegate,PHPickerViewControllerDelegate,UINavigationControllerDelegate,UIDocumentPickerDelegate,UIScrollViewDelegate,OSSManagerDelegate, GWebSocketDelegate>
 
 @property (weak, nonatomic) IBOutlet UILabel *titlelb;
 @property (weak, nonatomic) IBOutlet UITableView *_tableView;
@@ -215,6 +215,8 @@ static const CGFloat kQuoteViewHeight = 46.0f;
     [ChatsStore.shareInstance getchatReadTime:self.chatId];
     [OSSManager sharedManager].delegate = self;
     
+    [GWebSocket shareInstance].delegate = self;
+    
     _showLoading = YES;
     NSString *type=@"";
     if(self.type==0){
@@ -238,7 +240,6 @@ static const CGFloat kQuoteViewHeight = 46.0f;
 //    NSLog(@"self.chatId:%@",self.chatId);
     [ChatListStore.shareInstance chatDidOpen:chatMsg];
     
-    [GWebSocket.shareInstance chekWebSocket];
 }
 
 -(void)reloadAllData{
@@ -275,7 +276,6 @@ static const CGFloat kQuoteViewHeight = 46.0f;
     };
 //    NSLog(@"self.chatId:%@",self.chatId);
     [ChatListStore.shareInstance chatDidOpen:chatMsg];
-    [GWebSocket.shareInstance chekWebSocket];
     [self movetoBotton];
 }
 
@@ -420,6 +420,9 @@ static const CGFloat kQuoteViewHeight = 46.0f;
 
 
 - (IBAction)fasongBt:(id)sender {
+    if ([self checkIsNetworkUnavailable]) {
+        return;
+    }
     NSLog(@"fasongBt:1");
     if(_isfriend){
         NSLog(@"fasongBt:2");
@@ -678,6 +681,9 @@ static const CGFloat kQuoteViewHeight = 46.0f;
 #pragma mark  chatpopViewDelegate
 
 -(void)actionNote:(NSString *)note{
+    if ([self checkIsNetworkUnavailable]) {
+        return;
+    }
     [self hidBottonView];
     if([note isEqualToString:@"1"]){//发送图片
         [self showImagePicker:1];
@@ -844,6 +850,9 @@ static const CGFloat kQuoteViewHeight = 46.0f;
     };
     
     [cell setResendMessageBlock:^(ChatMessageModel *message) {
+        if ([weakself checkIsNetworkUnavailable]) {
+            return;
+        }
         if (message.isUploadFile) {
             [weakself resendFile:message];
         } else {
@@ -1904,6 +1913,9 @@ static const CGFloat kQuoteViewHeight = 46.0f;
 }
 
 -(void)UpInside{
+    if ([self checkIsNetworkUnavailable]) {
+        return;
+    }
     _AVRecordBt.layer.backgroundColor = globalColor(GCTypeDark2).CGColor;
     [_AVRecordBt setTitle:@" 按住 说话" forState:UIControlStateNormal];
     NSLog(@"UpInside----------");
@@ -2446,5 +2458,33 @@ static const CGFloat kQuoteViewHeight = 46.0f;
     }
 }
 
+- (BOOL)checkIsNetworkUnavailable {
+    BOOL isReachable = [GWebSocket shareInstance].isReachable;
+    if (!isReachable) {
+        [MBProgressHUD showWithText:@"网络连接已断开"];
+    }
+    return !isReachable;
+}
+
+#pragma mark - GWebSocketDelegate
+- (void)onSocketConnectionStateChanged:(SRReadyState)state {
+    switch (state) {
+        case SR_CONNECTING:
+            _titlelb.text = @"连接中...";
+            break;
+        case SR_OPEN:{
+            _titlelb.text = self.titlename;
+            [self reloadAllData];
+            dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
+                [self movetoBotton];
+            });
+        }break;
+        case SR_CLOSING:
+            break;
+        case SR_CLOSED:
+            _titlelb.text = @"连接已断开";
+            break;
+    }
+}
 
 @end