摘要:網絡編程就是如何在程序中實現兩臺計算機的通信。而網絡編程最終要開發出來的應用大多數為支持各種協議的服務器,比如服務器服務器或者是基于自定義的協議實現的服務。在開始編碼之前,首先介紹一下協議棧上圖是我從網絡編程這本書拍下來的。
相信大部分的初中級PHP程序員平時寫的業務代碼占絕大多數,寫厭了平時的增刪改查,何不體驗體驗網絡編程的魅力呢。
學習網絡編程能夠很好的理解一些底層的網絡通信,比如Apache、Nginx如何接受HTTP請求的,然后又是如何和PHP來進行交互的。Nginx為什么能處理高并發的請求?常聽別人說的同步IO、異步IO、阻塞IO、非阻塞IO…等等到底是什么意思?相信你學習了網絡編程之后就會對其有深刻的理解。當然本文只是一個socket編程的入門,暫時是不包括以上內容的。
應該有一部分同學是沒有接觸過網絡編程的,在這里首先介紹一下網絡編程是什么意思。
網絡編程就是如何在程序中實現兩臺計算機的通信。而網絡編程最終要開發出來的應用大多數為支持各種協議的服務器,比如:http服務器、websocket服務器、或者是基于自定義的協議實現的服務。其本質上是基于socket套接字,套接字把TCP的通信機制在內部已經實現了,開發人員只注重編碼就行了。至于為什么叫套接字,這里我就不講述了。
在開始編碼之前,首先介紹一下TCP協議棧:
上圖是我從《TCP/IP網絡編程》這本書拍下來的。
TCP/IP協議棧的誕生起源于一個問題:如何通過因特網完成數據的有效傳輸?
所以基于這個問題,硬件、系統、路由等各個領域的專家聚集在一起,最終定義出了多套大大小小的協議。而我們要講解的TCP/IP協議,則是處于傳輸層的。
下面是TCP協議在數據傳輸方面的簡單圖示:
上面的圖中,主機A向主機B發送數據時,主機A必須在接收到主機B返回的確認消息后,才發送下一個數據包。通過上圖我們不難看出TCP協議的最終目的就是:保證數據傳輸的有效性。對于初學者,我們暫時只需記住以上結論即可。
下面主要介紹PHPsocket開發所要使用的一些標準函數和其用法,最終編寫出一個可以向客戶端發送“hello,socket”的程序。
創建一個在本機端口監聽的套接字需要四個步驟:
1.創建套接字
2.為這個套接字分配IP和端口號
3.使此套接字轉換為可接受請求狀態
4.開始受理請求
接下來介紹PHP完成這些步驟所需要的函數:
socket_create 創建套接字
socket_bind 分配IP和端口
socket_listen 監聽連接
socket_accept 受理連接
socket_connect 連接一個套接字
socket_write 寫入數據到套接字
socket_read 從套接字讀取最大長度字節數
我們暫時只需知道這個函數是做什么的就行了,至于詳細的參數含義可以等做完下面的例子之后在去PHP官網查看。
接下將是最重要的編碼環節:
以下server.php為服務端的代碼:
代碼解讀:
第一處:創建一個套接字并且使用IPV4協議,至于參數什么意思相信各位具有查閱文檔的能力
第二處:將該套接字綁定到本機的8899端口
第三處:調用 socket_listen 開始監聽此端口的請求
第四處:開始受理連接請求,這里要注意一下,如果沒有接收到請求的話,此函數會一直阻塞
第五到第七處:向發送請求的客戶端發送“hello,socket”字符串,最后一定注意關閉socket資源
我們運行一下這個文件:
輸入:php server.php
按下回車之后我們會看到此腳本已經進入阻塞狀態:
到這里我們最基本的一個服務端程序已經完成了,這里可能會有小伙伴有疑問了,以上第四處到底是受理的什么請求呢?
那么接下來所要編寫的客戶端程序則是這個問題的最好解答。
客戶端程序相對來說比較簡單一點:
分為兩步:
1.創建用于向服務端指定端口發送請求的套接字
2.通過調用連接函數向服務端發送連接請求
下面開始客戶端client.php的編寫:
代碼解讀:
第一處:連接到以上服務端程序所監聽的8899端口
第二處:接收服務端發來的“hello,socket”消息
第三處:輸出接收到的字符
接下來我們先運行服務端:
php server.php
然后再運行客戶端:
php client.php
將看到如下結果:
成功的輸出了“hello,socket”字符串!
相信大家看到這里已經對socket編程有一個初步的認識。
接下來介紹幾個函數可以很方便的完成以上操作:
對于以上的服務端程序我們可以使用stream_socket_server 函數來改寫的更為簡潔,使用stream_socket_server函數我們可以一次性的創建、綁定、監聽三個步驟。
以下是修改過的server_v2.php
代碼解答:
第一處:使用stream_socket_server 一次性創建套接字,綁定到8899端口,開始監聽 三個步驟。
第二處:由于是用stream_socket_server函數創建的資源,與socket_create創建的資源不同,所以這里全部使用操作stream資源的函數。
關于phpSocket編程的入門,就先介紹到這里,如有錯誤的地方歡迎后臺回復指出哦。
如果覺得本文不錯的話,可以關注我的公眾號: 阿毛的Coding之路
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/30846.html
摘要:個高級多線程面試題及回答后端掘金在任何面試當中多線程和并發方面的問題都是必不可少的一部分。目前在生產環基于的技術問答網站系統實現后端掘金這一篇博客將詳細介紹一個基于的問答網站的實現,有詳細的代碼。 15 個高級 Java 多線程面試題及回答 - 后端 - 掘金在任何Java面試當中多線程和并發方面的問題都是必不可少的一部分。如果你想獲得任何股票投資銀行的前臺資訊職位,那么你應該準備很多...
摘要:個高級多線程面試題及回答后端掘金在任何面試當中多線程和并發方面的問題都是必不可少的一部分。目前在生產環基于的技術問答網站系統實現后端掘金這一篇博客將詳細介紹一個基于的問答網站的實現,有詳細的代碼。 15 個高級 Java 多線程面試題及回答 - 后端 - 掘金在任何Java面試當中多線程和并發方面的問題都是必不可少的一部分。如果你想獲得任何股票投資銀行的前臺資訊職位,那么你應該準備很多...
閱讀 1334·2021-09-01 11:40
閱讀 3941·2021-08-05 10:03
閱讀 974·2019-08-30 15:54
閱讀 2816·2019-08-29 12:53
閱讀 3179·2019-08-29 12:23
閱讀 940·2019-08-26 13:45
閱讀 2277·2019-08-26 10:41
閱讀 2535·2019-08-23 16:44