c# socket接收字符串_socket通信很难?这一文让你轻松搞定!
目錄
- 概述
- TCP/IP協議、UDP協議
- Socket是什么
- socket通信流程
- socket編程php代碼實戰
- php7進階到架構師相關閱讀
概述
這是關于php進階到架構之php7核心技術與最佳實戰學習的第六篇文章:socket通信很難?這一文讓你輕松搞定!
- 第一篇:用房子的思維秒懂php7傳值與傳引用的區別
- 第二篇: php7語法糖好甜,讓你迷上php魔術方法
- 第三篇:php7魔術方法__call的最佳實戰之數據庫PDO類的驅動設計實戰
- 第四篇:精通PHP正則表達式,看這一篇就夠啦!
- 第五篇:不懂對象設計原則,都不好意思自稱php大師
- 第六篇:socket通信很難?這一文讓你輕松搞定!
對TCP/IP、UDP、Socket編程這些詞你不會很陌生吧?隨著網絡技術的發展,這些詞充斥著我們的耳朵。大家能回答下面幾個問題嗎?
1.什么是TCP/IP、UDP?
2. Socket在哪里呢?
3. Socket是什么呢?
4. 怎么使用socket編程?
TCP/IP協議、UDP協議
TCP/IP(Transmission Control Protocol/Internet Protocol)即傳輸控制協議/網間協議,
是一個工業標準的協議集,它是為廣域網(WANs)設計的。
UDP(User Data Protocol,用戶數據報協議)是與TCP相對應的協議。
它是屬于TCP/IP協議族中的一種。
這里有一張圖,表明了這些協議的關系。
TCP-IP,UDP協議關系
TCP/IP協議族包括運輸層、網絡層、鏈路層。現在你知道TCP/IP與UDP的關系了吧。
UDP是屬于TCP/IP協議族中的一種
Socket在哪里?
在上圖中,我們沒有看到Socket的影子,那么它到底在哪里呢?請看下圖,一目了然。
socket所在位置
原來Socket在這里
Socket是什么?
Socket是應用層與TCP/IP協議族通信的中間軟件抽象層。
它是一組接口。
在設計模式中,Socket其實就是一個門面模式,它把復雜的TCP /IP協議族隱藏在Socket接口后面。
對用戶來說,一組簡單的接口就是全部,讓Socket去組織數據,以符合指定的協議。
socket通信流程
聽到Socket編程,是不覺得它是比較高深的編程知識呢?但是只要弄清Socket編程的工作原理,神秘的面紗也就揭開了。 請看下圖:
socket編程流程圖
先從服務器端說起。
服務器端先初始化Socket,
然后與端口綁定(bind),
對端口進行監聽(listen),
調用accept阻塞,
等待 客戶端連接。
在這時如果有個客戶端初始化一個Socket,
然后連接服務器(connect),如果連接成功,這時客戶端與服務器端的連接就建立了。
客戶端發送數據請求(write),
服務器端接收請求(read)并處理請求,
然后把回應數據發送給客戶端(write),
客戶端讀取數據(read),
最后關閉連接,一次交互結束。
搞懂socket通信流程了吧?來,對照scoket通信流程圖,代碼擼起!
socket編程php代碼實戰
首先,服務端代碼Server.php如下:
//確保在連接客戶端時不會超時set_time_limit(0);$ip = '127.0.0.1';$port = 8888;/* +------------------------------- * @socket通信整個過程+------------------------------- * @socket_create 1.初始化Socket * @socket_bind 2.端口綁定(bind) * @socket_listen 3.對端口進行監聽(listen) * @socket_accept 4.調用accept阻塞,等待 客戶端連接 * @socket_read 5.接收客戶端請求數據 * @socket_write 6.回應數據發送給客戶端 * @socket_close 7.關閉連接 +-------------------------------- *//*---------------- 1.初始化Socket -------------------*///創建服務端的socket套接流,net協議為IPv4,protocol協議為TCP$socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP);/*---------------- 2.端口綁定(bind) -------------------*//*綁定接收的套接流主機和端口,與客戶端相對應*/if(socket_bind($socket,$ip,$port) == false){ echo 'server bind fail:'.socket_strerror(socket_last_error()); /*這里的127.0.0.1是在本地主機測試,你如果有多臺電腦,可以寫IP地址*/}/*---------------- 3.對端口進行監聽(listen) -------------------*///監聽套接流if(socket_listen($socket,4)==false){ echo 'server listen fail:'.socket_strerror(socket_last_error());}/*---------------- 4.調用accept阻塞,等待 客戶端連接 -------------------*///讓服務器無限獲取客戶端傳過來的信息do{ /*接收客戶端傳過來的信息*/ $accept_resource = socket_accept($socket); /*socket_accept的作用就是接受socket_bind()所綁定的主機發過來的套接流*/ if($accept_resource !== false){ /*讀取客戶端傳過來的資源,并轉化為字符串*/ /*----------5.接收客戶端請求數據-----------*/ $string = socket_read($accept_resource,1024); /*socket_read的作用就是讀出socket_accept()的資源并把它轉化為字符串*/ echo 'server receive is :'.$string.PHP_EOL;//PHP_EOL為php的換行預定義常量 if($string != false){ $return_client = 'server receive is : '.$string.PHP_EOL; /*向socket_accept的套接流寫入信息,也就是回饋信息給socket_bind()所綁定的主機客戶端*/ /*------6.回應數據發送給客戶端-----------*/ socket_write($accept_resource,$return_client,strlen($return_client)); /*socket_write的作用是向socket_create的套接流寫入信息,或者向socket_accept的套接流寫入信息*/ }else{ echo 'socket_read is fail'; } /*socket_close的作用是關閉socket_create()或者socket_accept()所建立的套接流*/ socket_close($accept_resource); }}while(true);socket_close($socket);運行server.php,啟動socket服務端
php server.php現在服務端的程序已經開始運行,端口已經開始監聽了
客戶端client.php代碼如下:
//初始化一個Socket 創建一個socket套接流$socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP);/****************設置socket連接選項,這兩個步驟你可以省略*************///接收套接流的最大超時時間1秒,后面是微秒單位超時時間,設置為零,表示不管它socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array("sec" => 1, "usec" => 0));//發送套接流的最大超時時間為6秒socket_set_option($socket, SOL_SOCKET, SO_SNDTIMEO, array("sec" => 6, "usec" => 0));/****************設置socket連接選項,這兩個步驟你可以省略*************///連接服務端的套接流,這一步就是使客戶端與服務器端的套接流建立聯系if(socket_connect($socket,'127.0.0.1',8888) == false){ echo 'connect fail massege:'.socket_strerror(socket_last_error());}else{ $message = 'l love you 我愛你 socket'; //轉為GBK編碼,處理亂碼問題,這要看你的編碼情況而定,每個人的編碼都不同 $message = mb_convert_encoding($message,'GBK','UTF-8'); //向服務端寫入字符串信息 if(socket_write($socket,$message,strlen($message)) == false){ echo 'fail to write'.socket_strerror(socket_last_error()); }else{ echo 'client write success'.PHP_EOL; //讀取服務端返回來的套接流信息 while($callback = socket_read($socket,1024)){ echo 'server return message is:'.PHP_EOL.$callback; } }}socket_close($socket);//工作完畢,關閉套接流運行client.php代碼:
php client.php至此客戶端已經連接上服務端了,并和服務端通信了。趕快本地代碼擼起來,記得查看結果哦
php7進階到架構師相關閱讀
https://www.kancloud.cn/gofor/gofor
最后,歡迎大家留言補充,討論~~~
總結
以上是生活随笔為你收集整理的c# socket接收字符串_socket通信很难?这一文让你轻松搞定!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python绘制表格界面_python
- 下一篇: python 变量转字符串_[Pytho