jason860421 在
VC# 網路(遊戲)程式設計 由淺入深 (1) – Socket
一文中,開始介紹有關MS環境的socket程式建置,
很期待可以有怎樣的實作範例來介紹。
前幾個月為了任務上的需要,
為了解決一個問題,
而需要做出一個「虛擬」的POP3 伺服器,
在標準方面,
是要符合POP3 的RFC 的規格,
在「虛擬」上,
在這虛POP3上面沒有任何真實的帳號存在,
而client端不管送出什麼user, pass,
都可抓取我們所製作的虛擬POP3的信件,
當然這郵件是要符合MIME的郵件格式,
才能讓POP3 client端順利下載郵件。
在還沒有對socket的規格還沒那麼清楚的情況下,
利用ruby 的 socket 程式界面,
邊試邊改的情況下,
也做出了可用的虛擬 POP3 Server,
當然,可改進之處很多,
而在這實作過程中,
初步體驗怎麼去依著RFC的規格來實作,
當然,其實是先有那已合乎RFC規格的POP3 client存在著,
來存取這初生的POP3 server,
看到client 送出不同的query,
以至server要有相對應的回應,
而慢慢地補齊成符合RFC的規格。
在此也簡單介紹ruby的socket的應用。
先以最簡單的 socket client 端開始,
最簡易的 web client:
require 'socket'
host = 'checkrealip.com'
port = 80
request = "GET http://checkrealip.com/ HTTP/1.0\r\n\r\n"
socket = TCPSocket.open(host,port)
socket.print(request)
response = socket.read
此時response所獲得的是:
"HTTP/1.1 200 OK\r\nConnection: close\r\nDate: Mon, 04 Oct 2010 12:42:15 GMT\r\nServer: Microsoft-IIS/6.0\r\nX-Powered-By: ASP.NET\r\nX-AspNet-Version: 1.1.4322\r\nCache-Control: private\r\nContent-Type: text/html; charset=utf-8\r\nContent-Length: 336\r\n\r\n\r\n<HTML>\r\n <HEAD>\r\n <title>Check Real IP</title>\r\n </HEAD>\r\n \r\nCurrent IP Address: 1.2.3.4\r\n<BR>\r\n<BR>\r\n<BR>\r\n<A href="http://checkrealip.com/reverseip.aspx" target="_blank">Get Reverse DNS</A>\r\n<P>\r\nSponsored by : <A href="http://www.i-Freelancer.Net" target="_blank">i-Freelancer.Net, Inc.</A>\r\n \r\n</HTML>\r\n"
利用:
response.split("\r\n\r\n")[0] 獲得webserver 回應的header
response.split("\r\n\r\n")[1] 就獲得了所回應的body,也就是瀏覽器所見的網頁原始碼。
簡單地解釋,
就是response是個字串,剛好是由\r\n\r\n來分隔出header、body,
利用split成為有兩個字串項目的陣列。
最簡單的ruby 之 socket 的client的實作如此實現,
只是在request裡,http 的要求的方式,
是類似像 GET http://checkrealip.com/ HTTP/1.0\r\n\r\n 這樣的樣式,
若非http,則是所指定的指令,
server 才會依指令回應出資料。
後續再介紹怎麼實作簡單的socket server