快樂並且痛苦的Study日子過完了,是時候開始寫點code了-_-. . .
隨者時間壓力的緊張,開始要從Study的天堂離開。
經過這兩個禮拜的折磨,終於弄懂了基本語法 & 一些基本的運用,其實也算是受益良多,雖然還未全部學完,不過倒是可以開始寫寫code了 。
為了專案需求,一樣先把功能拆開,今天,我們就從最基本的功能開始吧…阿嗚
整體架構如下 :
簡單來說就是在C code那邊寫點東西,然後透過php server 丟到browser去,看起來很簡單,但是做起來真的挺蛋疼的,尤其是眼前一片黑,對於PHP還不熟的情況下去搞這玩意… 根本就是想逼死人啊啊啊啊啊……..
好了,抱怨到此結束 =_=.. 正文開始。
因為要做出這樣的功能,所以我必須要先把這玩意拆成三等份
Client 和 php Server 可以互通資料
- Php Server 和 Code 可以互通資料
- 能夠從 code丟資料給php Server 並且丟過去給 browser 。
首先我們先進行第一步,也是最簡單的部分
Client & Server
在開始前,我們來了解,什麼是Socket,有了基本的基礎後,其他的其實並不難懂。
Socket 基礎
PHP 使用Berkley的socket庫來創建它的連接,你可以知道socket只不過是一個數據結構,你使用這個socket去開始一個Client & Server 之間的會話,這個Server是一直在監聽準倍產生一個新的會話,當一個Client端連接Server的時候,Server端接受Client的連線請求,那麼就進行一次循環。然後,這個Client就能發Message給Server,Server也可以發訊息給Client。
產生一個Socket,你需要三個值
- 1個協議
- 1個類型
- 1個公共協議類型
表一:協議
名字 |
常量 描述 |
AF_INET |
這是大多數用來產生socket的協議,使用TCP或UDP來傳輸,用在IPv4的地址 |
AF_INET6 |
與上面類似,不過是來用在IPv6的地址 |
AF_UNIX |
本地協議,使用在Unix和Linux系統上,它很少使用,一般都是當客戶端和服務器在同一台及其上的時候使用 |
表二:Socket類型
名字 |
常量 描述 |
SOCK_STREAM |
這個協議是按照順序的、可靠的、數據完整的基於字節流的連接。這是一個使用最多的socket類型,這個socket是使用TCP來進行傳輸。 |
SOCK_DGRAM |
這個協議是無連接的、固定長度的傳輸調用。該協議是不可靠的,使用UDP來進行它的連接。 |
SOCK_SEQPACKET |
這個協議是雙線路的、可靠的連接,發送固定長度的數據包進行傳輸。必須把這個包完整的接受才能進行讀取。 |
SOCK_RAW |
這個socket類型提供單一的網絡訪問,這個socket類型使用ICMP公共協議。(ping、traceroute使用該協議) |
SOCK_RDM |
這個類型是很少使用的,在大部分的操作系統上沒有實現,它是提供給數據鏈路層使用,不保證數據包的順序 |
表三:公共協議
名字 |
常量 描述 |
ICMP |
互聯網控制消息協議,主要使用在網關和主機上,用來檢查網絡狀況和報告錯誤信息 |
UDP |
用戶數據報文協議,它是一個無連接,不可靠的傳輸協議 |
TCP 包。 |
傳輸控制協議,這是一個使用最多的可靠的公共協議,它能保證數據包能夠到達接受者那兒,如果在傳輸過程中發生錯誤,那麼它將重新發送出錯數據 |
Sample Code (Server) :
<?php
/*
設定網路模式、socket類型和通訊協定
網路模式分為三種:
AF_INET:一般IPv4網路
AF_INET6:IPv6網路
AF_UNIX:需要Server及Client端都在同一台主機互連才需要
socket類型常用的四種:
SOCK_STREAM:最常使用的類型,使用TCP傳輸
SOCK_DGRAM:UDP傳輸
SOCK_SEQPACKET:該類型必需完整的把封包接收完畢才可以讀取
SOCK_RAW:ICMP傳輸
通訊協定則分為:SOL_ICMP、SOL_UDP、SOL_TCP
*/
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
//設定Server IP及16888 port
socket_bind($socket, '127.0.0.1', 16888);
//啟動socket
socket_listen($socket);
//接收Client連線
$connection = socket_accept($socket);
if($connection)
{
//將資料寫入到socket暫存
socket_write($connection,"Hello World");
}
?>
Sample code (Client)
<?php
//設定網路模式、socket類型和通訊協定
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
//連接Server端
$connection = socket_connect($socket,'127.0.0.1', 16888);
//取得socket暫存資料,socket_read()可用來取得特定長度的資料
while($buffer = socket_read($socket,1024))
{
echo $buffer;
}
?>
(未完貸續)
留言列表