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