關(guān)于socket

1、什么是Socket?

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

Socket是面向C/S(客戶端/服務(wù)端)模型而設(shè)計的,針對客戶端和服務(wù)端提供不同的Socket??蛻舳擞锌蛻舳说腟ocket,服務(wù)端有服務(wù)端的Socket;

Socket的常用類型有:流式Socket(基于TCP協(xié)議)和 數(shù)據(jù)報式Socket(基于UDP協(xié)議)

2、Socket 和 HTTP的區(qū)別?

HTTP:超文本傳輸協(xié)議,首先它是一個協(xié)議,并且是基于TCP/IP協(xié)議基礎(chǔ)之上的應(yīng)用層協(xié)議。HTTP是短連接,并且是無狀態(tài)的協(xié)議。針對其無狀態(tài)特性,在實際應(yīng)用中又需要有狀態(tài)的形式,因此一般會通過session/cookie技術(shù)來解決此問題。

Socket:Socket不屬于協(xié)議范疇,Socket連接是長連接,理論上客戶端和服務(wù)器端一旦建立連接將不會主動斷開此連接。

3、TCP 和 UDP

TCP(Transmission Control Protocol,傳輸控制協(xié)議)是基于連接的協(xié)議,正式收發(fā)數(shù)據(jù)前必須和對方建立可靠的連接(“三次握手”),傳輸速度相對UDP較慢。

UDP(User Data Protocol,用戶數(shù)據(jù)報協(xié)議)是與TCP相對應(yīng)的協(xié)議。它是面向非連接的協(xié)議,UDP適用于一次只傳送少量數(shù)據(jù)、對可靠性要求不高的應(yīng)用環(huán)境,但是傳輸速度快

4、TCP通訊(AsyncSocket)

服務(wù)端:

1、創(chuàng)建服務(wù)端Socket對象

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

2、開始監(jiān)聽端口,等待客戶端連接

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

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

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

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

{

//保存客戶端的Socket對象

clientSocket = newSocket;

//發(fā)送數(shù)據(jù)給客戶端

NSString *message = @" 你好啊 ! ";

NSData *data = [message dataUsingEncoding:NSUTF8StringEncoding];

[newSocket writeData:data withTimeout:-1 tag:100]; //發(fā)送數(shù)據(jù)

//監(jiān)聽接收數(shù)據(jù)

[newSocket readDataWithTimeout:-1 tag:100];

}

//數(shù)據(jù)發(fā)送成功

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

{

NSLog(@"發(fā)送數(shù)據(jù)成功! ");

}

//接收數(shù)據(jù)

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

{

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

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

//繼續(xù)監(jiān)聽數(shù)據(jù)

[clientSocket readDataWithTimeout:-1 tag:100];

}

客戶端:

1、創(chuàng)建客戶端Socket對象

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

2、連接服務(wù)端

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

3、監(jiān)聽數(shù)據(jù)

[clientSocket readDataWithTimeout:-1 tag:100];

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

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

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

{

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

//發(fā)送數(shù)據(jù)給服務(wù)端

NSString *message = @" 服務(wù)器,你好 ! ";

NSData *data = [message dataUsingEncoding:NSUTF8StringEncoding];

[sock writeData:data withTimeout:-1 tag:100]; //發(fā)送數(shù)據(jù)

}

//數(shù)據(jù)發(fā)送成功

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

{

NSLog(@"發(fā)送數(shù)據(jù)成功! ");

}

//接收數(shù)據(jù)

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

{

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

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

//繼續(xù)監(jiān)聽數(shù)據(jù)

[clientSocket readDataWithTimeout:-1 tag:100];

}

5、UDP通訊(AsyncSocket)

接收端:

1、創(chuàng)建接收端Socket對象

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

2、綁定端口

[receiveSocket bindToPort:RECEIVEPORT error:nil];

3、開始監(jiān)聽

[receiveSocket receiveWithTimeout:-1 tag:100];

//接收到數(shù)據(jù)

-(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(@"接收到數(shù)據(jù):%@", str);

//繼續(xù)監(jiān)聽

[receiveSocket receiveWithTimeout:-1 tag:100];

return? YES;

}

發(fā)送端:

1、創(chuàng)建發(fā)送端Socket對象

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

2、發(fā)送數(shù)據(jù)

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

//發(fā)送數(shù)據(jù)成功

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

{

NSLog(@"發(fā)送數(shù)據(jù)成功!");

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • iPhone的標準推薦是CFNetwork 庫編程,其封裝好的開源庫是 cocoa AsyncSocket庫,用它...
    Ethan_Struggle閱讀 2,357評論 2 12
  • 轉(zhuǎn)載:http://www.cocoachina.com/ios/20170615/19529.html 參考:h...
    F麥子閱讀 4,136評論 3 2
  • 對TCP/IP、UDP、Socket編程這些詞你不會很陌生吧?隨著網(wǎng)絡(luò)技術(shù)的發(fā)展,這些詞充斥著我們的耳朵。那么我想...
    yuantao123434閱讀 5,522評論 1 97
  • CocoaAsyncSocket支持tcp和udp。其中: AsyncSocket類是支持TCP的 AsyncUd...
    鄭軍紅閱讀 1,767評論 0 2
  • 一、網(wǎng)絡(luò)各個協(xié)議:TCP/IP、SOCKET、HTTP等## 網(wǎng)絡(luò)七層由下往上分別為物理層、數(shù)據(jù)鏈路層、網(wǎng)絡(luò)層、傳...
    Mighty_man閱讀 484評論 0 2

友情鏈接更多精彩內(nèi)容