成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

從零帶你入門Socket編程

glumes / 3210人閱讀

摘要:網(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

相關(guān)文章

  • 網(wǎng)絡(luò)編程 - 收藏集 - 掘金

    摘要:個高級多線程面試題及回答后端掘金在任何面試當中多線程和并發(fā)方面的問題都是必不可少的一部分。目前在生產(chǎn)環(huán)基于的技術(shù)問答網(wǎng)站系統(tǒng)實現(xiàn)后端掘金這一篇博客將詳細介紹一個基于的問答網(wǎng)站的實現(xiàn),有詳細的代碼。 15 個高級 Java 多線程面試題及回答 - 后端 - 掘金在任何Java面試當中多線程和并發(fā)方面的問題都是必不可少的一部分。如果你想獲得任何股票投資銀行的前臺資訊職位,那么你應(yīng)該準備很多...

    justCoding 評論0 收藏0
  • 網(wǎng)絡(luò)編程 - 收藏集 - 掘金

    摘要:個高級多線程面試題及回答后端掘金在任何面試當中多線程和并發(fā)方面的問題都是必不可少的一部分。目前在生產(chǎn)環(huán)基于的技術(shù)問答網(wǎng)站系統(tǒng)實現(xiàn)后端掘金這一篇博客將詳細介紹一個基于的問答網(wǎng)站的實現(xiàn),有詳細的代碼。 15 個高級 Java 多線程面試題及回答 - 后端 - 掘金在任何Java面試當中多線程和并發(fā)方面的問題都是必不可少的一部分。如果你想獲得任何股票投資銀行的前臺資訊職位,那么你應(yīng)該準備很多...

    selfimpr 評論0 收藏0

發(fā)表評論

0條評論

glumes

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<