IP地址
凡是連接了互聯(lián)網的主機都有一個IP地址;
如果該主機借用了路由器的網絡,那么這個主機只有局域網內的IP晶密;
端口號
每個端口號一般對應一個APP
如果使用的是http協(xié)議,http服務的默認端口號是80;
端口號是16位的,最大值是65535邑时;
URL(統(tǒng)一資源定位符)
- 組成結構: 協(xié)議://主機地址:端口號/路徑
組成結構分析
-
協(xié)議:規(guī)定了網絡中兩個主機之間的
溝通流程
和相關語法
; -
主機地址:可以是
IP
地址特姐,也可以是域名
晶丘;(如果是域名需要通過DNS轉換為ip地址) - 1個主機對應1個IP地址
-
端口號:用來表示
進程
,一般的APP都是單進程的; - 1個進程對應1個APP
-
路徑:是你訪問的服務器中的
資源
或代碼源文件
的地址浅浮;
B/S和C/S
- B/S:瀏覽器/服務器
- C/S:客戶端/服務器
Unicode和UTF8編碼的關系
- Unicode:是一個字符集(說通俗點就是個表)
- UTF8:是對Unicode字符集的一種編碼方式沫浆。
字符集是一種與存儲無關的表,只有編碼才是真正可傳輸可存儲的格式滚秩。
GB2312和Unicode的優(yōu)缺點
- GB2312只對中英文編碼专执,所以單個字符的編碼長度更短,可以節(jié)約流量提高傳輸速率郁油;
- Unicode可以兼容更多種語言本股,兼容性更好,但單個字符的編碼長度稍長桐腌,需要的流量更多拄显;
TCP/IP網絡模型的四層
- 應用層——對應不同協(xié)議的不同端口號
- 傳輸層——對應TCP或UDP協(xié)議
- 網絡層——對應IP
- 網絡接口層(數據鏈路層)——對應物理幀
UDP與TCP的優(yōu)缺點
TCP:
- 面向鏈接
- 速度較慢! 因為在交換數據前,必須先在雙方之間建立一個TCP連接案站;
- 可靠! 提供
數據校驗
躬审,超時重發(fā)
,丟棄重復數據
,流量控制
等;
UDP:
- 不可靠! 只是把應用層(APP)傳給網絡層(封裝IP報頭)的數據報發(fā)送出去;
- 速度較快! 沒有數據校驗嚼吞,沒有超時重發(fā)機制盒件,協(xié)議規(guī)定的報頭格式簡單,不面向連接舱禽;
WebView的使用方法
加載HTML格式的字符串
- (void)loadHTMLString:(NSString*****)stringbaseURL: (nullableNSURL *****)baseURL;
Socket通信過程
1. 創(chuàng)建socket
參數說明:
- 常用
AF_INET
(ipv4+端口號)(將來蘋果要強烈要求使用ipv6
) - TCP用
SOCK_STREAM
(流式)炒刁,UDP用SOCK_DGRAM
(數據報式) - TCP用
IPPROTO_TCP
,UDP用IPPROTO_UDP
誊稚∠枋迹可以直接寫0
,這樣會根據前兩個形參自動選擇
返回值:
是socket描述符
里伯。每個進程(一般的程序只有一個進程)中都有一個 socket描述符表城瞎,通過socket描述符就可以在操作系統(tǒng)的內核緩存中找到相應的socket。
返回-1為失敗
方法名:
socket(int, int, int)
2. 發(fā)起connect
參數:
socket描述符
-
struct sockaddr_in
結構體疾瓮,里面保存了五個變量脖镀,其中最重要的有3個
- (互聯(lián)網協(xié)議) 協(xié)議族:sin_family 常用 AF_INET 以后蘋果要求是用IPV6;
- IP地址:sin_addr.s_addr 賦值為 inet_addr("XXX.XXX.XXX.XXX")狼电;
- 端口號:sin_port 賦值為 htons(XXXXX)蜒灰,htons()的作用是把任意數改成大尾順序;
- 結構體的大小肩碟,
sizeof()
;
返回值:
返回0為成功强窖,其它為失敗
方法名:
connect(int, const struct sockaddr *, socklen_t)
3. send數據:
參數:
socket描述符
-
char *
要發(fā)送的字符串 - 字符串長度,
strlen()
- 與阻塞有關削祈,可選項非常的多翅溺,一般置
0
返回值:
-1
失敗脑漫,大于0是發(fā)送的字節(jié)數
。
函數:
send(int, const void *, size_t, int)
4. recv數據
參數:
socket描述符
uint8_t類型的數組
- 字符串長度咙崎,
strlen()
- 與阻塞有關优幸,可選項非常的多,一般填寫
0
返回值:
-1
失敗褪猛,大于0則是接收的字節(jié)數
劈伴。
方法名:
recv(int, void *, size_t, int)
5. close連接:
參數:
socket描述符
方法名:
close(int)
請求的格式:(一行二頭三體)
請求行:請求方法``空格``路徑``協(xié)議和版本號``\r\n
請求頭:頭字段名``:``空格``頭字段值``\r\n
結束符:\r\n
請求體:默認的GET請求沒有請求頭
比較常用幾個請求頭
- Host:主機地址;
- Connection:長連接或短連接握爷。工作中遇到的部分長連接需要使用定時器發(fā)送規(guī)定內容的字符串,以這種方式發(fā)送的請求叫做
心跳包
严里;
數據解析
序列化和反序列化
- 序列化
在向服務器發(fā)送數據之前新啼,將 NSArray / NSDictionary 轉換成二進制的過程
- 反序列化
從服務器獲取數據之后,將二進制數據轉化為NSArray / NSDictionary的過程