摘要:上一篇文章是對編程的入門,這次我們基于實現(xiàn)一個簡單的收發(fā)消息的服務(wù)。通過上面一篇文章,我們已經(jīng)對于創(chuàng)建套接字的流程有了一定的了解,在這里就不多說這些了。第處將讀取到的輸入信息寫入緩沖區(qū),從而發(fā)送到服務(wù)端。
上一篇文章是對socket編程的入門,這次我們基于socket實現(xiàn)一個簡單的收發(fā)消息的服務(wù)。
實現(xiàn)思路:
先說服務(wù)端:
接受客戶端的連接
讀取客戶端發(fā)送過來的信息
將接受到信息發(fā)送給客戶端
客戶端:
首先連接到服務(wù)端
讀取用戶輸入
將用戶輸入的信息發(fā)送給服務(wù)端
發(fā)送之后將會接收到服務(wù)端返回來的信息
由于PHP沒有原生的從命令行接收用戶輸入的函數(shù),所以這里通過以下方式來實現(xiàn):
"/dev/stdin",這個是linux的標準輸入,其實這個函數(shù)就是把linux的標準輸入,重定向到我們的后端PHP程序了。然后我們的PHP程序就接收到了用戶的輸入,接著就可以把這個輸入發(fā)送到回聲服務(wù)程序的服務(wù)端了。
通過上面一篇文章,我們已經(jīng)對于創(chuàng)建套接字的流程有了一定的了解,在這里就不多說這些了。
接下來開始服務(wù)端的實現(xiàn):
echo_server.php:
代碼解讀:
第1處:這里直接使用了上一篇文章介紹的stream_socket_server函數(shù),可以一次性的完成socket的創(chuàng)建、綁定以及監(jiān)聽。
第2處:開始監(jiān)聽我們創(chuàng)建的套接字(至于這里為什么加上@,因為stream_socket_accept函數(shù)如果一定時間內(nèi)沒有收到客戶端的連接的話,會報一個warning)
第3處:通過fread函數(shù),讀取輸入緩沖區(qū),一次讀取1024個字節(jié)
第4處:將讀取到的字符寫入輸入緩沖,從而發(fā)送到客戶端。
通過上面的程序我們已經(jīng)實現(xiàn)了回聲服務(wù)程序的服務(wù)端。
接下來我們可以運行一下,會發(fā)現(xiàn)我們的echo_server.php已經(jīng)進入阻塞狀態(tài),等待客戶端連接。
接著實現(xiàn)客戶端:
echo_client.php
代碼解讀:
第1處:調(diào)用我們的重定向標準輸入函數(shù),調(diào)用此函數(shù)之后,如果不輸入任何字符,程序是不會執(zhí)行到下一行的,因為這里會被阻塞。
第2處:如果我們輸入了q這個字符,將跳出while循環(huán),緊接著會執(zhí)行fclose,關(guān)閉連接。這里要注意一下,客戶端關(guān)閉連接之后,會向服務(wù)端發(fā)送一個信號,告訴服務(wù)端我已經(jīng)斷開連接了,服務(wù)端接受到之后將關(guān)閉此客戶端的連接。
第3處:將讀取到的輸入信息寫入緩沖區(qū),從而發(fā)送到服務(wù)端。
第4處到第5處是要重點講解的內(nèi)容。
此處為什么不直接通過fread函數(shù)一次性讀取服務(wù)端返回的消息呢?
以下是對于這個問題的解答:
對于每一個socket,都有一個發(fā)送緩沖區(qū)和接收緩沖區(qū)。如果我們發(fā)送的數(shù)據(jù)足夠大,則可能分為兩次發(fā)送。也就是說fwrite之后,我們發(fā)送的字符有可能被分成兩部分發(fā)送了,而服務(wù)端的代碼是在不斷的接收數(shù)據(jù),然后返回數(shù)據(jù)。
所以客戶端可能出現(xiàn)如下情況:發(fā)送一次字符之后,客戶端尚未接收到全部的數(shù)據(jù)就調(diào)用了fread函數(shù),從而打印多次。
所以對于這個問題最好的解決方法就是,我們客戶端是能夠提前知道要接收的字符大小的,所以這里通過strlen函數(shù)獲取要接收的數(shù)據(jù)大小,如果不足這個大小則繼續(xù)讀取,直到滿足條件之后再輸出。
下面是程序運行的效果:
以上則是我們的回聲服務(wù)程序,記得自己動手練習(xí)哦,眼過千遍不如手過一遍!
本人會持續(xù)分享一些關(guān)于編程以及編程自學(xué)相關(guān)的文章,記錄自己的自學(xué)編程之路。同時希望自己的分享能夠幫助一些對編程感興趣以及正在編程道路上的朋友。歡迎大家關(guān)注我的公眾號「阿毛的Coding之路 」。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/30838.html
摘要:擁塞控制算法包含三種擁塞控制算法,和。在早期的實現(xiàn)當(dāng)中,這兩個擁塞控制算法分別是在發(fā)送端和接收端實現(xiàn)的。音頻算法音頻算法指的是在發(fā)送端對發(fā)送信號依次進行回聲消除降噪以及音量均衡操作,它包含三個算法回聲消除,噪聲抑制和自動增益控制。 1、背景 RTC(Real-time Communica...
摘要:文紅點聯(lián)合創(chuàng)始人王宇航我今天分享的主題,是以實時連接場景為目標的一些技術(shù)架構(gòu)探索。主要是關(guān)于紅點在產(chǎn)品研發(fā)過程中,我們的技術(shù)選擇,架構(gòu)變化,還有這個過程中,我們的一些考慮。紅點的第一個版本紅點的第一個版本功能比較簡單。 showImg(https://segmentfault.com/img/bVrBAw); 文 | 紅點聯(lián)合創(chuàng)始人 王宇航 我今天分享的主題,是以實時連接場景為目標的一...
摘要:所以這次采用多進程的方式來實現(xiàn)同時為多個客戶端提供服務(wù)。而多進程則是通過創(chuàng)建多個進程來共同完成一件事。如果是子進程的執(zhí)行環(huán)境,則返回。正常情況下,子進程是通過父進程創(chuàng)建的。以上則是我們的多進程回聲服務(wù)程序。 上次的回聲服務(wù)程序有個很大的缺點,就是只能同時連接一個客戶端,這明顯是不合理的。 所以這次采用多進程的方式來實現(xiàn)同時為多個客戶端提供服務(wù)。 以下是最終的效果:showImg(htt...
閱讀 3935·2021-11-24 09:39
閱讀 3838·2021-11-22 12:07
閱讀 1179·2021-11-04 16:10
閱讀 917·2021-09-07 09:59
閱讀 1963·2019-08-30 15:55
閱讀 1006·2019-08-30 15:54
閱讀 791·2019-08-29 14:06
閱讀 2536·2019-08-27 10:54