標籤:
/*------------------------------------ 網路基礎: 1.位元據流 --------------------------------*/
<1>用戶端(Client):行動裝置(手機/iPad等手持功能).
用戶端一般就是前端/前台等等.iOS,android開發都是前端開發.
<2>伺服器(Server):為用戶端提供服務(比如資料/資源等)的機器---本質也是一台電腦(+伺服器軟體).
伺服器開發就是後端/後台開發.java/php/.net等.
<3>請求(Request):用戶端向伺服器索取資料.
<4>響應(Response):伺服器對用戶端請求做出的反應,一般就是返回資料給用戶端.
伺服器:按開發階段來分,分為兩種:
遠程伺服器: 外網伺服器.應用上線之後供全體使用者使用的伺服器.速度取決於使用者的網速和伺服器的效能.
本機伺服器: 內網伺服器,測試伺服器.開發測試階段使用的伺服器.供內部開發測試人員使用.速度飛快.
2.網路中傳輸的都是位元據流. html/圖片/視頻資料...
位元據流是如何被分組並傳輸的呢?
}
/*------------------------------------- 網路基礎: 2.七層協議 ---------------------------------*/
1.理解網路 2.理解七層協議/五層模型 3.理解Socket.
{
應用程式層: 規定"應用程式"的資料格式. http / ftp /email 等. //紙條上寫的是啥?
傳輸層: 建立"連接埠"到"連接埠"之間的通訊. UDP/TCP 協議."連接埠". //我們幫你傳紙條
網路層: 確定每一台電腦的位置,建立"主機"到"主機"之間的通訊.IPv4協議,"IP地址". // 女孩的位置
資料連結層: 確定1和0的分組方式.乙太網路協議:一組電訊號就是一個資料包."MAC地址"/網卡/廣播. // 深情告白
物理層: 將電腦串連入網路,傳輸電訊號1和0. // 一張白紙
互連網分層結構的好處:
上層的變動完全不影響下層的結構.
Socket : "主機 + 連接埠"就是"Socket(通訊端/插座)" ----- TCP/IP協議
}
/*---------------------------------- 網路基礎: 3.資料包/流 ----------------------------------*/
1.理解資料包. 2.理解網路通訊實質.
{
網路通訊的基礎: 知道對方的MAC地址和IP地址.
網路通訊的實質: 互相交換資料包.
資料包:
每一個資料包都包含 "標題"和"資料"兩個部分."標題"包含本資料包的一些說明."資料"則是本資料包的內容.
乙太網路資料包: 最基礎的資料包.標題部分包含了通訊雙方的MAC地址,資料類型等. ‘標題‘長度:18位元組,‘資料‘部分長度:46~1500位元組.
IP資料包: 標題部分包含通訊雙方的IP地址,協議版本,長度等資訊. ‘標題‘長度:20~60位元組,"資料包"總長度最大為65535位元組.
TCP/UDP資料包:標題部分包含雙方的發出連接埠和接收埠. UDP資料包:‘標題‘長度:8個位元組,"資料包"總長度最大為65535位元組,正好放進一個IP資料包. TCP資料包:理論上沒有長度限制,但是,為了保證網路傳輸效率,通常不會超過IP資料長度,確保單個包不會被分割.
應用程式資料包: 標題部分規定應用程式的資料格式.資料部分傳輸具體的資料內容.
嵌套:
資料包層層嵌套,上一層資料包嵌套在下一層資料包的資料部分.最後通通由乙太網路資料包來進行資料傳遞.
分包/拆包:
一般傳遞的資料都比較大,會將資料包分割成很多個部分來傳遞.
拼包:
將接收到資料包按序號拼接起來,組成完整的資料包.
}
/*---------------------------------- 網路基礎: 4.IP地址 ----------------------------------*/
瞭解IP地址.
{
靜態IP地址:
固定不變的IP地址,需要使用者自己手動設定.
動態IP地址:
通過DHCP協議自動產生的IP地址.
DHCP協議:
通過DHCP協議,使用者獲得原生動態IP地址,子網路遮罩,網關,DNS伺服器等.
子網路遮罩:
與IP地址配合使用判斷兩台電腦是否位於同一個子網路.
DNS伺服器:
可以將網域名稱(網址)轉換成IP地址.
}
/*---------------------------------- 網路基礎: 4.一個HTTP請求 --------------------------------*/
瞭解一個HTTP請求的完整過程.
{
1. URL(Uniform Resource Locator):
統一資源定位器.URL就是資源的地址,位置.通過一個URL能夠找到互連網上唯一的一個資源.
URL的基本格式: 協議://主機地址/路徑
協議:不同的協議代表不同的資源尋找方式,資源傳輸方式.
{
URL中的常見協議:
<1>HTTP:超文字傳輸通訊協定 (HTTP),在網路開發中最常用的協議.訪問的是遠端網路資源.格式:http://...
<2>file:訪問的時本機電腦上的資源.格式:file://(不要再加主機地址了)
<3>FTP:訪問的是共用主機的檔案資源.格式:ftp://
<4>mailto:訪問的是電子郵件地址.格式:mailto:
}
主機地址:存放資源的主機IP地址(網域名稱).
路徑:資源在主機中得具體位置.
2. HTTP請求的完整過程:
<1> 請求: 用戶端發出請求.向伺服器索要資料(操作資料).
<2> 響應: 伺服器對用戶端的請求做出響應.返回用戶端所需要的資料.
3. 封裝一個HTTP請求
用 NSURLRequest 來封裝一個HTTP請求.可以指定緩衝策略和逾時時間.
1> 緩衝策略的選擇:NSURLRequestCachePolicy
{
NSURLRequestUseProtocolCachePolicy = 0,
// 預設的緩衝策略,使用協議定義.
NSURLRequestReloadIgnoringLocalCacheData = 1,
// 忽略本機快取,直接從原始伺服器位址下載.
NSURLRequestReturnCacheDataElseLoad = 2,
// 只有在緩衝中不存在資料時,才從原始地址下載
NSURLRequestReturnCacheDataDontLoad = 3,
// 只使用快取資料,如果不存在緩衝,則請求失敗. 用於沒有網路連接的離線模式
NSURLRequestReloadIgnoringLocalAndRemoteCacheData = 4,
// 忽略遠程和本地的資料緩衝,直接從原始地址下載
NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData = 1,
// 忽略緩衝,直接從原始伺服器位址下載.
NSURLRequestReloadRevalidatingCacheData = 5,
// 驗證本機資料和遠端資料是否相同,如果不同則下載遠端資料,否則使用本機資料.
}
/*----------------------------------- 網路基礎: 5.Socket演練 ---------------------------------*/
"理解"什麼是Socket.
{
0.
nc -lk 連接埠號碼 :始終監聽本機電腦此連接埠的資料.
1.匯入三個標頭檔
{
#import <sys/socket.h>
#import <netinet/in.h>
#import <arpa/inet.h>
}
2.Socket書寫步驟
{
1.建立用戶端Socket socket(<#int#>, <#int#>, <#int#>);
2.建立伺服器Socket struct sockaddr_in serverAddress;
3.串連到伺服器(Socket編程) connect(<#int#>, <#const struct sockaddr *#>, <#socklen_t#>);
4.發送資料給伺服器 send(<#int#>, <#const void *#>, <#size_t#>, <#int#>)
5.接收伺服器返回的資料 recv(<#int#>, <#void *#>, <#size_t#>, <#int#>)
6.關閉 Socket close(socketNumber)
}
/*
建立用戶端 Socket.
三個參數: domain:網路地址類型 type:連接埠類型 protocal:傳輸協議
domain:協議域 指定socket主機地址類型. 網路層協議 AF_INET/IPv4協議; AF_INET_6/IPv6協議
type:指定Socket連接埠類型. 指定傳輸層協議類型(TCP/UDP),SOCK_STREAM(TCP/流) ,SOCK_DGRAM(UDP/報文頭)
protocal:指定傳輸協議:常用協議:IPPROTO_TCP、IPPROTO_UDP等,分別對應TCP傳輸協議、UDP傳輸協議.
最後一個參數傳0,會根據第二個參數,自動選擇第二個參數對應的協議.
傳回值:如果 > 0 表示成功.
*/
// 0.建立用戶端 Socket.
int socketNumber = socket(AF_INET, SOCK_STREAM, 0);
if (socketNumber > 0) {
NSLog(@"Socket建立成功:%d",socketNumber);
}else{
NSLog(@"Socket建立失敗");
};
/*
串連到伺服器.
三個參數:
1.用戶端socket.
2.接收方的socket參數.
3.資料長度.
傳回值: 0 表示成功,其他: 錯誤代號.
*/
// 1.伺服器socket
struct sockaddr_in serverAddress;
// IPv4協議.
serverAddress.sin_family = AF_INET;
// 接收方(伺服器)IP地址.
serverAddress.sin_addr.s_addr = inet_addr("127.0.0.1");
// 連接埠號碼.
serverAddress.sin_port = htons(56789);
// 2.串連到伺服器
// serverAddress 的資料長度.
socklen_t length = sizeof(serverAddress);
// 串連伺服器.
// 在C語言中,傳遞結構體的時候,會指定結構體的長度
// &取的是資料的起始位置,只有傳遞一個資料的長度,才能夠保證拿到完整的結構體資料.
// 傳回值:0成功,其他都是失敗.
int connection = connect(socketNumber, (const struct sockaddr *)&serverAddress,length);
if (!connection) {
NSLog(@"串連成功%d",connection);
}else{
NSLog(@"串連失敗");
}
/*
發送訊息到伺服器
參數:
1> 用戶端Socket.
2> 發送內容地址.
3> 發送內容長度.
4> 發送方式標識,一般為0.
*/
// 3.發送訊息到伺服器
// 發送訊息內容
NSString *msg = @"hello socket!";
msg.length :表示的是OC字串的長度.
msg.UTF8String :將OC字串轉換成 UTF8 的 ASCII 碼,一個漢字需要佔用3個位元組的長度.
strlen :計算所有 ASCII 碼的長度.
// 發送訊息
ssize_t result = send(socketNumber, msg.UTF8String, strlen(msg.UTF8String), 0);
NSLog(@"result = %ld",result);
/*
接收伺服器接返回的訊息
參數:
1> 用戶端Socket.
2> 接收內容緩衝區.
3> 接收內容緩衝區長度.
4> 接收方式.0表示阻塞式.必須等待伺服器返回資料.
傳回值:
如果成功,則返回接收到的位元組數.失敗則返回SOCKET_ERROR
*/
// 4.伺服器接收訊息
// 建立接收內容緩衝區.
uint8_t buffer[1024];
// 接受訊息
ssize_t len = recv(socketNumber, buffer, sizeof(buffer), 0);
NSLog(@"len: %zd",len);
// 取出接受內容緩衝區中的資料.
NSData *data = [NSData dataWithBytes:buffer length:len];
// 將二進位流資料data轉換成字串類型.
NSString *receive = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"receive:%@",receive);
// 5.關閉Socket
close(socketNumber);
}
IOS 網路基礎