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