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ù)成功!");
}