摘要:自己動手用編寫一個簡單的單進程版協議我的簡化版理解就是電腦上瀏覽器向服務器發送一個預先定義好的文本然后服務器端處理一下通常是從硬盤讀取一個后綴名為的文件,然后再把這個文件通過文本方式發回去就這么簡單。
自己動手用PHP編寫一個簡單的HTTP Server(單進程版)
HTTP協議我的簡化版理解就是電腦上瀏覽器向服務器發送一個預先定義好的文本(Http Request)
然后服務器端處理一下(通常是從硬盤讀取一個后綴名為html的文件),然后再把這個文件
通過文本方式發回去(Http Response),就這么簡單。唯一麻煩的是我得請操作系統給我建立Http層下面的TCP連接通道,因為所有的文本數據都得
通過TCP管道接收和發送,這個通道是用socket建立的。
偽代碼如下
socketMain= socket(...) bind(socketMain,主機的IP和端口號) listen(socketMain,...) 無限循環 while(true) { socketAccept = accept(socketMain,....) receive(socketAccept,....) send(socketAccept...) close(socketAccept...) }
偽代碼解釋
這些socket,bind,listen,accept都是操作系統提供的接口,我們要做的就是把這些進行
組裝;現在80或者其他端口監聽,然后進入無限循環,如果有請求進來,就接受(accept),創建新的socket,最后通過這個socket來接收和發送Http數據。
實現的php代碼如下
只實現了當前目錄下的html與jpg圖片的解析處理,原理都類似。
_socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); if ($this->_socket === false) { die(socket_strerror(socket_last_error($this->_socket))); } } public function run() { socket_bind($this->_socket, $this->ip, $this->port); socket_listen($this->_socket, 5); while(true) { $socketAccept = socket_accept($this->_socket); $request = socket_read($socketAccept, 1024); echo $request; socket_write($socketAccept, "HTTP/1.1 200 OK".PHP_EOL); socket_write($socketAccept, "Date:".date("Y-m-d H:i:s").PHP_EOL); $fileName = $this->getUri($request); $fileExt = preg_replace("/^.*.(w+)$/", "$1", $fileName); $fileName = __DIR__."/".$fileName; switch ($fileExt) { case "html": //set content type socket_write($socketAccept, "Content-Type: text/html".PHP_EOL); socket_write($socketAccept, "".PHP_EOL); $fileContent = file_get_contents($fileName); socket_write($socketAccept, $fileContent, strlen($fileContent)); break; case "jpg": socket_write($socketAccept, "Content-Type: image/jpeg".PHP_EOL); socket_write($socketAccept,"".PHP_EOL); $fileContent = file_get_contents($fileName); socket_write($socketAccept, $fileContent, strlen($fileContent)); break; } socket_write($socketAccept, "web serving", strlen("web serving")); socket_close($socketAccept); } } protected function getUri($request = "") { $arrayRequest = explode(PHP_EOL, $request); $line = $arrayRequest[0]; $file = trim(preg_replace("/(w+)s/(.*)sHTTP/1.1/i","$2", $line)); return $file; } public function close() { socket_close($this->_socket); } } $httpServer = new HttpServer(); $httpServer->run();
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/22232.html
摘要:強大且什么是是一種自由和開放源碼的類操作系統內核。是一個領先的操作系統內核,世界上運算最快的臺超級電腦運行的都是基于內核的操作系統。開機完成后,就接手初始化硬件設備創建存儲器空間的映射,以便為操作系統內核準備好正確的軟硬件環境。 GNU/Linux 強大且Free showImg(http://designiot.phodal.com/images/gnu_linux.png); ...
摘要:強大且什么是是一種自由和開放源碼的類操作系統內核。是一個領先的操作系統內核,世界上運算最快的臺超級電腦運行的都是基于內核的操作系統。開機完成后,就接手初始化硬件設備創建存儲器空間的映射,以便為操作系統內核準備好正確的軟硬件環境。 GNU/Linux 強大且Free showImg(http://designiot.phodal.com/images/gnu_linux.png); ...
摘要:官方對的解釋是進程管理器。對并發訪問的處理進程和線程從代碼級別來講不支持多線程操作,不能像等語言一樣可以編寫多線程代碼。 關于本篇文章的部分糾正,請參考這篇文章:http://www.cppblog.com/woaido... 首先搞清楚php-fpm與cgi的關系 CGI CGI是一個web server與cgi程序(這里可以理解為是php解釋器)之間進行數據傳輸的協議,保證了傳遞的...
摘要:是基于和的高性能服務框架核心特性基于提供分布式服務器通訊服務基于提供遠程調用服務基于提供在線網絡直播平臺服務基于提供同步異步數據庫連接池服務基于提供異步任務服務器投遞任務服務基于提供服務器硬件實時監控服務基于提供共享數據配置服務基于提供高并 zys是基于yaf和swoole的高性能服務框架核心特性 1.基于swoole提供分布式服務器通訊服務 2.基于thrift提供rpc遠程調用服務...
閱讀 986·2021-09-26 10:15
閱讀 2064·2021-09-24 10:37
閱讀 2580·2019-08-30 13:46
閱讀 2631·2019-08-30 11:16
閱讀 2421·2019-08-29 10:56
閱讀 2591·2019-08-26 12:24
閱讀 3473·2019-08-23 18:26
閱讀 2662·2019-08-23 15:43