小談Socket通訊

前言  

    我們每天打開瀏覽器瀏覽網頁是,瀏覽器的進程怎麼與web服務器通信的?當你用微信聊天時,微信進程怎麼與服務器或者微信好友所在的微信進程通信?這些都得靠Socket,那什麼是Socket?今天就來小談Socket。


1、什麼是Socket

    Socket的英文原義是插座。作爲BSD UNIX的進程通信機制。通常也稱作套接字,用於描述IP地址和端口,是一個通信鏈的句柄。

    Socket是面向C/S(客戶端/服務端)模型而設計的,針對客戶端和服務端提供不同的Socket。客戶端有客戶端的Socket,服務端有服務端的Socket

    Socket的常用類型有:流式Socket(基於TCP協議)和 數據報式Socket(基於UDP協議)


2Socket HTTP的區別?

HTTP:超文本傳輸協議,首先它是一個協議,並且是基於TCP/IP協議基礎之上的應用層協議。HTTP是短連接,並且是無狀態的協議。針對其無狀態特性,在實際應用中又需要有狀態的形式,因此一般會通過session/cookie技術來解決此問題。


SocketSocket不屬於協議範疇,Socket連接是長連接,理論上客戶端和服務器端一旦建立連接將不會主動斷開此連接。


3TCP UDP

TCPTransmission Control Protocol,傳輸控制協議)是基於連接的協議,正式收發數據前必須和對方建立可靠的連接(三次握手),傳輸速度相對UDP較慢。


UDPUser Data Protocol,用戶數據報協議)是與TCP相對應的協議。它是面向非連接的協議,UDP適用於一次只傳送少量數據、對可靠性要求不高的應用環境,但是傳輸速度快。


4TCP通訊(AsyncSocket

服務端:


1、創建服務端Socket對象

    serverSocket = [[AsyncSocket alloc] initWithDelegate:self];


2、開始監聽端口,等待客戶端連接

    BOOL ret = [serverSocket acceptOnPort:PORT error:nil];


3、通過AsyncSocket代理方法進行TCP通訊

//接收到新的客戶端Socket的連接

-(void)onSocket:(AsyncSocket *)sock didAcceptNewSocket:(AsyncSocket *)newSocket

{

        

    //保存客戶端的Socket對象

    clientSocket = newSocket;

    

    //發送數據給客戶端

    NSString *message = @" 你好啊 ";

    NSData *data = [message dataUsingEncoding:NSUTF8StringEncoding];

    

    [newSocket writeData:data withTimeout:-1 tag:100]; //發送數據

    //監聽接收數據

    [newSocket readDataWithTimeout:-1 tag:100];

}


//數據發送成功

-(void)onSocket:(AsyncSocket *)sock didWriteDataWithTag:(long)tag

{

    NSLog(@"發送數據成功! ");

}


//接收數據

-(void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag

{

    NSString *message = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

    NSLog(@"接收到客戶端的數據:%@", message);


    //繼續監聽數據

    [clientSocket readDataWithTimeout:-1 tag:100];

}

客戶端:

1、創建客戶端Socket對象

    clientSocket = [[AsyncSocket alloc] initWithDelegate:self];


2、連接服務端

    [clientSocket connectToHost:@“10.3.143.9” onPort:PORT error:nil];

3、監聽數據

    [clientSocket readDataWithTimeout:-1 tag:100];

4、通過AsyncSocket代理方法進行TCP通訊

//接收到新的客戶端Socket的連接

-(void)onSocket:(AsyncSocket *)sock didConnectToHost:(NSString *)host port:(UInt16)port

{

    NSLog(@"成功連接服務端:%@", host);

    

    //發送數據給服務端

    NSString *message = @" 服務器,你好 ";

    NSData *data = [message dataUsingEncoding:NSUTF8StringEncoding];

    

    [sock writeData:data withTimeout:-1 tag:100]; //發送數據

}

//數據發送成功

-(void)onSocket:(AsyncSocket *)sock didWriteDataWithTag:(long)tag

{

    NSLog(@"發送數據成功! ");

}

//接收數據

-(void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag

{

    NSString *message = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

    NSLog(@"接收到客戶端的數據:%@", message);


    //繼續監聽數據

    [clientSocket readDataWithTimeout:-1 tag:100];

}

5UDP通訊(AsyncSocket

接收端:

1、創建接收端Socket對象

    receiveSocket = [[AsyncUdpSocket alloc] initWithDelegate:self];


2、綁定端口

    [receiveSocket bindToPort:RECEIVEPORT error:nil];


3、開始監聽

    [receiveSocket receiveWithTimeout:-1 tag:100];


//接收到數據

-(BOOL)onUdpSocket:(AsyncUdpSocket *)sock didReceiveData:(NSData *)data withTag:(long)tag fromHost:(NSString *)host port:(UInt16)port

{

    NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

    NSLog(@"接收到數據:%@", str);


    //繼續監聽

    [receiveSocket receiveWithTimeout:-1 tag:100];

    

    return  YES;

}



發送端:

1、創建發送端Socket對象

    sendSocket = [[AsyncUdpSocket alloc] initWithDelegate:self];

2、發送數據

    [sendSocket sendData:data toHost:_ipTextField.text port:SENDPORT withTimeout:-1 tag:100];

//發送數據成功

-(void)onUdpSocket:(AsyncUdpSocket *)sock didSendDataWithTag:(long)tag

{

    NSLog(@"發送數據成功!");

}


發佈了59 篇原創文章 · 獲贊 17 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章