http Socket長連線

有稜角的圓發表於2017-06-26

文件:http://www.cocoachina.com/ios/20160602/16572.html

 


 

 

socket(套接字)是通訊的基石,是支援TCP/IP協議的網路通訊的基本操作單元,包含進行網路通訊必須的五種資訊:連線使用的協議,本地主機的IP地址,本地程式的協議埠,遠地主機的IP地址,遠地程式的協議埠。

多個TCP連線或多個應用程式程式可能需要通過同一個TCP協議埠傳輸資料。為了區別不同的應用程式程式和連線,計算機作業系統為應用程式與TCP/IP協議互動提供了套接字(Socket)介面。應用層可以和傳輸層通過Socket介面,區分來自不同應用程式程式或網路連線的通訊,實現資料傳輸的併發服務。

建立Socket連線至少需要一對套接字,其中一個執行於客戶端,稱為ClientSocket,另一個執行於伺服器端,稱為ServerSocket。套接字之間的連線過程分為三個步驟:伺服器監聽,客戶端請求,連線確認。

Socket可以支援不同的傳輸層協議(TCP或UDP),當使用TCP協議進行連線時,該Socket連線就是一個TCP連線,UDP連線同理。

使用第三方框架:CocoaAsyncSocket

不會寫伺服器,用Tomcat進行測試,只能測試到連線成功以及斷開連線,而且真機環境下,可能因為網路環境原因也同樣訪問不了:

注意:讀寫資料時需要手動進行。

//-1表示沒有time限制
    [self.socket writeData:[NSData data] withTimeout:-1 tag:0];
    [self.socket readDataWithTimeout:-1 tag:0];

- (IBAction)SocketConnection:(UIButton *)sender {
    //http://localhost:8080/
    NSString *host = @"10.1.1.33";
    int port = 8080;
    
    _socket = [[GCDAsyncSocket alloc]initWithDelegate:self delegateQueue:dispatch_get_main_queue()];
    NSError *error = nil;
    //[_socket connectToHost:host onPort:port error:&error ];
    [_socket connectToHost:host onPort:port withTimeout:15000000 error:&error];
    if (error) {
        NSLog(@"%@",error);
    }
}
-(void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(uint16_t)port{
    NSLog(@"%s,%@",__func__,@"連線成功");
}

-(void)socketDidDisconnect:(GCDAsyncSocket *)sock withError:(NSError *)err{
    if (err) {
        NSLog(@"異常斷開-%@",err);
    }else{
        NSLog(@"正常斷開");
    }
}

-(void)socket:(GCDAsyncSocket *)sock didWriteDataWithTag:(long)tag{
    NSLog(@"寫資料");
}

-(void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag{
    NSLog(@"讀資料");
}

 

相關文章