什么是套接字socket
java udp socket、socket把傳輸層以下的協議都封裝成了簡單的接口,我編寫基于網絡通信的軟件只需要調用這些接口即可,寫出的程序自然是遵循tcp/udp協議的....
什么是互聯網
互聯網=物理連接介質+互聯網通信協議
ip+port就可以標識全世界范圍內獨一無二的一個基于網絡通信的軟件
為何要用socket
目標: 編寫一個C/S架構的軟件
server端必須具備:
1. 服務端需要穩定運行,一直對外提供服務
2. 服務端必須綁定一個固定的地址(這個固定地址就是ip+port(端口))
3. 服務端要支持并發
?
基于文件類型的套接字家族
套接字家族的名字:AF_UNIX
unix一切皆文件,基于文件的套接字調用的就是底層的文件系統來取數據,兩個套接字進程運行在同一機器,可以通過訪問同一個文件系統間接完成通信
基于網絡類型的套接字家族
套接字家族的名字:AF_INET
(還有AF_INET6被用于ipv6,還有一些其他的地址家族,不過,他們要么是只用于某個平臺,要么就是已經被廢棄,或者是很少被使用,或者是根本沒有實現,所有地址家族中,AF_INET是使用最廣泛的一個,python支持很多種地址家族,但是由于我們只關心網絡編程,所以大部分時候我么只使用AF_INET)
?
網絡基本知識看這個鏈接:http://www.cnblogs.com/linhaifeng/articles/5937962.html(一定要看而且要理解,是網絡編程的基礎)
?
為何學習socket一定要先學習互聯網協議:
C/S架構的軟件(軟件屬于應用層)是基于網絡進行通信的
網絡的核心即一堆協議,協議即標準,你想開發一款基于網絡通信的軟件,就必須遵循這些標準
?
?
到底什么是套接字socket,見圖示
PS:可以看到在應用層和傳輸層的中間加了一個抽象層,Socket把傳輸層以下的全部封裝好了,在寫程序的時候只要調用Socket的接口收發數據,寫出來的程序自然就是遵循互聯網協議的
?
套接字的工作流程
PS:先從服務器端說起。服務器端先初始化Socket,然后與端口綁定(bind),對端口進行監聽(listen),調用accept阻塞,等待客戶端連接。在這時如果有個客戶端初始化一個Socket,然后連接服務器(connect),如果連接成功,這時客戶端與服務器端的連接就建立了。客戶端發送數據請求,服務器端接收請求并處理請求,然后把回應數據發送給客戶端,客戶端讀取數據,最后關閉連接,一次交互結束
PS:什么是阻塞,就是服務端在監聽后沒有收到服務端發送的請求,這時候會一直停留在accpet這一段,所以就好比堵住了,知道請求進來會開始執行后續的代碼