在iOS開發(fā)中 一般不用底層socket
而用第三方框架:AsyncSocket 框架(GCDSocket)
本文主要介紹一下底層Socket的簡單使用
-()demo{
NSLog(@"touchesBegan");
//Socket 代碼
//步驟:
//1.創(chuàng)建客戶端 Socket
//2.創(chuàng)建服務(wù)器 Socket
//3.連接兩個 Socket
//4.客戶端 Socket 發(fā)送信息給服務(wù)器(發(fā)送請求的過程)
//5.服務(wù)器響應(yīng)客戶端的請求,返回給客戶端數(shù)據(jù)。
//6.接受服務(wù)器返回的數(shù)據(jù)
//7.關(guān)閉Socket
//1.創(chuàng)建客戶端 Socket
//參數(shù)1:協(xié)議域:遵守的IP協(xié)議類型! AF_INET:IPv4 AF_INET6:IPv6
//參數(shù)2:端口類型:TCP:SOCK_STREAM / UDP:SOCK_DGRAM
//參數(shù)3:選擇的協(xié)議類型:一般傳 0 會根據(jù)第二個參數(shù)自動選擇協(xié)議類型
//返回值:如果返回值>0,表示 Socket創(chuàng)建成功
int SocketNumber = socket(AF_INET, SOCK_STREAM, 0);
NSLog(@"SocketNumber: %d",SocketNumber);
//2.創(chuàng)建服務(wù)器 Socket
struct sockaddr_in serverAddress;
//主機(jī) /端口
//設(shè)置 服務(wù)器Socket 遵循的 IP 協(xié)議類型為 IPv4
serverAddress.sin_family = AF_INET;
//服務(wù)器 Socket 的 IP 地址
serverAddress.sin_addr.s_addr = inet_addr("127.0.0.1");
//設(shè)置服務(wù)器Socket 的端口號;目前端口號設(shè)置的為12345
//端口號的最大值 65535;09~1024 是系統(tǒng)默認(rèn)占用的端口號 不要設(shè)置
//如果需要手動設(shè)置端口號:一般設(shè)置1024~65535之間的值
serverAddress.sin_port = htons(12345);
//3.連接兩個 Socket
//參數(shù)1:客戶端的 Socket
//參數(shù)2:服務(wù)器端 Socket/結(jié)構(gòu)體 (const struct sockaddr *)&serverAddress 強(qiáng)制類型轉(zhuǎn)換
//參數(shù)3:第二個參數(shù)的長度, sizeof(serverAddress)計算長度
//返回值: 等于0 代表成功 不等于0失敗
//如果想要連接成功,必須實時監(jiān)測服務(wù)端端的端口
//監(jiān)測服務(wù)器端口:nc -lk 12345
int conn = connect(SocketNumber, (const struct sockaddr *)&serverAddress, sizeof(serverAddress));
NSLog(@"conn:%d",conn);
//4.客戶端 Socket 發(fā)送信息給服務(wù)器(發(fā)送請求的過程)
//參數(shù)1:客戶端 Socket
//參數(shù)2:void * 傳遞給服務(wù)器的數(shù)據(jù) msg.UTF8String 就是直接將 OC 數(shù)據(jù)轉(zhuǎn)換成 C 語言的數(shù)據(jù)類型
//參數(shù)3:size_t 鎖傳遞給服務(wù)器數(shù)據(jù)的長度
//參數(shù)4:傳0 等待服務(wù)器響應(yīng)數(shù)據(jù)
NSString *msg = @"hello socket";
send(SocketNumber,msg.UTF8String,strlen(msg.UTF8String), 0);
//5.服務(wù)器響應(yīng)客戶端的請求,返回給客戶端數(shù)據(jù)。
//6.接受服務(wù)器返回的數(shù)據(jù)
//參數(shù)1:客戶端Socket:服務(wù)器確定返回給哪一個客戶端數(shù)據(jù)
//參數(shù)2:void *:接受服務(wù)器返回數(shù)據(jù)的地址
//參數(shù)3:size_t:接受地址的長度
//參數(shù)4:傳0 等待服務(wù)器返回數(shù)據(jù)
//返回值:就是服務(wù)器返回的數(shù)據(jù)長度
ssize_t buffer[1024];
ssize_t length = recv(SocketNumber,buffer,sizeof(buffer),0);
//獲得服務(wù)器返回的數(shù)據(jù)(從 buffer 中取出需要的數(shù)據(jù))
//根據(jù)二進(jìn)制數(shù)據(jù),拼接字符串
//Bytes:網(wǎng)絡(luò)的傳遞的數(shù)據(jù)流(比特流/字節(jié))
NSString *returnMsg = [[NSString alloc]initWithBytes:buffer length:length encoding:NSUTF8StringEncoding];
NSLog(@"returnMsg:%@",returnMsg);
//7.關(guān)閉Socket
close(SocketNumber);
}