5分鐘隨手寫個web伺服器和之後的思考

2021-07-04 14:23:58 字數 1553 閱讀 1941

在學習php的過程中看了篇bolg,寫個個簡易的web伺服器,先上**

<?php 

//確保在連線客戶端時不會超時

set_time_limit(0);

//設定ip和埠號

$address = "127.0.0.1";

$port = 2046; //除錯的時候,可以多換埠來測試程式!

/** * 建立乙個socket

* af_inet=是ipv4 如果用ipv6,則引數為 af_inet6

* sock_stream為socket的tcp型別,如果是udp則使用sock_dgram

*/ $sock = socket_create(af_inet, sock_stream, sol_tcp) or die("socket_create() 失敗的原因是:" . socket_strerror(socket_last_error()) . "/n");

//阻塞模式

socket_set_block($sock) or die("socket_set_block() 失敗的原因是:" . socket_strerror(socket_last_error()) . "/n");

//繫結到socket埠

$result = socket_bind($sock, $address, $port) or die("socket_bind() 失敗的原因是:" . socket_strerror(socket_last_error()) . "/n");

//開始監聽

$result = socket_listen($sock, 4) or die("socket_listen() 失敗的原因是:" . socket_strerror(socket_last_error()) . "/n");

echo "ok\nbinding the socket on $address:$port ... ";

echo "ok\nnow ready to accept connections.\nlistening on the socket ... \n";

do while (true);

socket_close($sock);

上面的**其實很簡單就是開了乙個socket監聽,然後返回乙個符合 http response格式的檔案,方便瀏覽器解讀。

這個**可以是瀏覽器直接訪問的應該就是 localhost:2046 

一開始我就產生了乙個疑問,通常我們在學習socket的時候,都會寫乙個伺服器端寫乙個客戶端,  服務端監聽,客戶端去鏈結,然後傳輸資料。但這裡沒有寫客戶端的socket也可以訪問。  其實查了下發現,其實瀏覽器在傳送htttp請求的是,自動就幫我們封裝了socket(tcp/ip).   簡單的示意圖如下:

可以看到,在伺服器端之走到了傳輸層(socket在tcp/ip層上),嚴格來說這個**根本不是web伺服器,來呢http協議都沒有涉及,怎麼能叫web伺服器呢?

10分鐘教會你Mac上搭建Web伺服器

因工作需要使用區域網搭建 web 伺服器測試環境,在mac上面的話會簡單方便很多,因為mac os x 自帶了 apache 和 php 環境,我們只需要簡單的啟動它就行了。開啟web伺服器的方法有兩種 啟動後,我們在瀏覽器輸入 http localhost 會發現 apache伺服器預設的web根...

五分鐘學微服務之 spring和springMVC

spring mvc框架提供了構建web應用程式的全功能mvc模組,使用了spring可插入架構,可以選擇是使用內建的spring web框架還是struts這樣的web框架,通過介面,spring 框架是高度可配置的,而且包含多種檢視技術,spring mvc 在實踐和面試中也會常遇到。sprin...

crontab及每15分鐘同步伺服器的時間

crontab 名稱 crontab 使用許可權 root使用者和crontab檔案的所有者 語法 crontab e username l username r username v username file 說明 crontab 是用來讓使用者在固定時間或固定間隔執行程式之用,換句話說,也就是...