前言
我們每天打開瀏覽器瀏覽網頁是,瀏覽器的進程怎麼與web服務器通信的?當你用微信聊天時,微信進程怎麼與服務器或者微信好友所在的微信進程通信?這些都得靠Socket,那什麼是Socket?今天就來小談Socket。
1、什麼是Socket?
Socket的英文原義是“孔”或“插座”。作爲BSD UNIX的進程通信機制。通常也稱作“套接字”,用於描述IP地址和端口,是一個通信鏈的句柄。
Socket是面向C/S(客戶端/服務端)模型而設計的,針對客戶端和服務端提供不同的Socket。客戶端有客戶端的Socket,服務端有服務端的Socket;
Socket的常用類型有:流式Socket(基於TCP協議)和 數據報式Socket(基於UDP協議)
2、Socket 和 HTTP的區別?
HTTP:超文本傳輸協議,首先它是一個協議,並且是基於TCP/IP協議基礎之上的應用層協議。HTTP是短連接,並且是無狀態的協議。針對其無狀態特性,在實際應用中又需要有狀態的形式,因此一般會通過session/cookie技術來解決此問題。
Socket:Socket不屬於協議範疇,Socket連接是長連接,理論上客戶端和服務器端一旦建立連接將不會主動斷開此連接。
3、TCP 和 UDP
TCP(Transmission Control Protocol,傳輸控制協議)是基於連接的協議,正式收發數據前必須和對方建立可靠的連接(“三次握手”),傳輸速度相對UDP較慢。
UDP(User Data Protocol,用戶數據報協議)是與TCP相對應的協議。它是面向非連接的協議,UDP適用於一次只傳送少量數據、對可靠性要求不高的應用環境,但是傳輸速度快。
4、TCP通訊(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];
}
5、UDP通訊(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(@"發送數據成功!");
}