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