close

快樂並且痛苦的Study日子過完了,是時候開始寫點code-_-. . .

隨者時間壓力的緊張,開始要從Study的天堂離開。

 

經過這兩個禮拜的折磨,終於弄懂了基本語法 & 一些基本的運用,其實也算是受益良多,雖然還未全部學完,不過倒是可以開始寫寫code

 

為了專案需求,一樣先把功能拆開,今天,我們就從最基本的功能開始吧阿嗚

 

 

 

 

整體架構如下 :

簡單來說就是在C code那邊寫點東西,然後透過php server 丟到browser去,看起來很簡單,但是做起來真的挺蛋疼的,尤其是眼前一片黑,對於PHP還不熟的情況下去搞這玩意根本就是想逼死人啊啊啊啊啊……..

 

 

好了,抱怨到此結束 =_=.. 正文開始。

 

 

 

 

 

因為要做出這樣的功能,所以我必須要先把這玩意拆成三等份

 

Client php Server 可以互通資料

  1. Php Server Code 可以互通資料
  2. 能夠從 code丟資料給php Server 並且丟過去給 browser

 

 

 

 

首先我們先進行第一步,也是最簡單的部分

Client & Server

 

 

在開始前,我們來了解,什麼是Socket,有了基本的基礎後,其他的其實並不難懂。

 

Socket 基礎

 

PHP 使用Berkleysocket庫來創建它的連接,你可以知道socket只不過是一個數據結構,你使用這個socket去開始一個Client & Server 之間的會話,這個Server是一直在監聽準倍產生一個新的會話,當一個Client端連接Server的時候,Server端接受Client的連線請求,那麼就進行一次循環。然後,這個Client就能發MessageServerServer也可以發訊息給Client

 

產生一個Socket,你需要三個值

  1. 1個協議
  2. 1個類型
  3. 1個公共協議類型

 

表一:協議

名字

常量     描述

AF_INET  

這是大多數用來產生socket的協議,使用TCPUDP來傳輸,用在IPv4的地址

AF_INET6     

與上面類似,不過是來用在IPv6的地址

AF_UNIX  

本地協議,使用在UnixLinux系統上,它很少使用,一般都是當客戶端和服務器在同一台及其上的時候使用

 

表二:Socket類型

名字

常量     描述

SOCK_STREAM  

這個協議是按照順序的、可靠的、數據完整的基於字節流的連接。這是一個使用最多的socket類型,這個socket是使用TCP來進行傳輸。

SOCK_DGRAM  

這個協議是無連接的、固定長度的傳輸調用。該協議是不可靠的,使用UDP來進行它的連接。

SOCK_SEQPACKET

  這個協議是雙線路的、可靠的連接,發送固定長度的數據包進行傳輸。必須把這個包完整的接受才能進行讀取。

SOCK_RAW  

這個socket類型提供單一的網絡訪問,這個socket類型使用ICMP公共協議。(pingtraceroute使用該協議)

SOCK_RDM  

這個類型是很少使用的,在大部分的操作系統上沒有實現,它是提供給數據鏈路層使用,不保證數據包的順序

 

表三:公共協議

名字

常量     描述

ICMP  

互聯網控制消息協議,主要使用在網關和主機上,用來檢查網絡狀況和報告錯誤信息

UDP      

用戶數據報文協議,它是一個無連接,不可靠的傳輸協議

TCP 包。

傳輸控制協議,這是一個使用最多的可靠的公共協議,它能保證數據包能夠到達接受者那兒,如果在傳輸過程中發生錯誤,那麼它將重新發送出錯數據

 

 

 

 

 

 

 

 

 

 

 

Sample Code (Server) :

 

<?php

/*

設定網路模式、socket類型和通訊協定

 

網路模式分為三種:

AF_INET:一般IPv4網路

AF_INET6IPv6網路

AF_UNIX:需要ServerClient端都在同一台主機互連才需要

 

socket類型常用的四種:

SOCK_STREAM:最常使用的類型,使用TCP傳輸

SOCK_DGRAMUDP傳輸

SOCK_SEQPACKET:該類型必需完整的把封包接收完畢才可以讀取

SOCK_RAWICMP傳輸

 

通訊協定則分為:SOL_ICMPSOL_UDPSOL_TCP

 

*/

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

 

//設定Server IP16888 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;

}

?>

 

 

 

(未完貸續)

arrow
arrow
    文章標籤
    php server client
    全站熱搜
    創作者介紹
    創作者 Eric 的頭像
    Eric

    一個小小工程師的心情抒發天地

    Eric 發表在 痞客邦 留言(2) 人氣()