ruby
提供了兩個級別訪問網路的服務,在底層你可以訪問作業系統,它可以讓你實現客戶端和伺服器為面向連線和無連線協議的基本套接字支援。
ruby 統一支援應用程式的網路協議,如ftp
、http
等。
不管是高層的還是底層的。ruby
提供了一些基本類,讓你可以使用tcp
,udp
,socks
等很多協議互動,而不必拘泥在網路層。
這些類也提供了輔助類,讓你可以輕鬆的對伺服器進行讀寫。
接下來就讓我們來學習如何進行ruby socket
程式設計:
什麼是sockets
應用層通過傳輸層進行資料通訊時,tcp
和udp
會遇到同時為多個應用程式程序提供併發服務的問題。多個tcp
連線或多個應用程式程序可能需要 通過同乙個tcp
協議埠傳輸資料。為了區別不同的應用程式程序和連線,許多計算機作業系統為應用程式與tcp/ip
協議互動提供了稱為套接字 (socket
)的介面,區分不同應用程式程序間的網路通訊和連線。
生成套接字,主要有3
個引數:通訊的目的ip
位址、使用的傳輸層協議(tcp
或udp
)和使用的埠號。socket原意是"插座"。通過將這3個引數結合起來,與乙個"插座"socket繫結,應用層就可以和傳輸層通過套接字介面,區分來自不同應用程式程序或網路連線的通訊,實現資料傳輸的併發服務。
sockets
詞彙解析:
選項描述
domain
指明所使用的協議族,通常為 pf_inet, pf_unix, pf_x25, 等等。
type
指定socket的型別:sock_stream 或sock_dgram,socket介面還定義了原始socket(sock_raw),允許程式使用低層協議
protocol
通常賦值0。
hostname
網路介面的識別符號:字串, 可以是主機名或ip位址;字串 「」, 指定 inaddr_broadcast 位址。;0 長度的字串, 指定inaddr_any乙個整數,解釋為主機位元組順序的二進位制位址。
port
port是埠的編號,每個伺服器都會監聽客戶端連線的乙個或多個埠號,乙個埠號可以是 fixnum 的埠號, 包含了伺服器名和埠。
以下我們通過給定的主機和埠編寫了乙個簡單的客戶端例項,ruby tcpsocket
類提供了open
方法來開啟乙個socket
。
tcpsocket.open(hosname, port )
開啟乙個tcp
連線。
一旦你開啟乙個socket
連線,你可以像io
物件一樣讀取它,完成後,你需要像關閉檔案一樣關閉該連線。
以下例項演示了如何連線到乙個指定的主機,並從socket
中讀取資料,最後關閉socket
:
例項
require
'socket'
# sockets 是標準庫
hostname =
'localhost'
port =
2000
s =tcpsocket
.open
(hostname, port)
while line = s.gets # 從 socket 中讀取每行資料
puts line.chop # 列印到終端
ends.close # 關閉 socket
ruby
中可以使用tcpserver
類來寫個簡單的服務。tcpserver
物件是tcpsocket
的工廠物件。
現在我們使用tcpserver.open(hostname, port)
來建立乙個tcpserver
物件。
接下來呼叫tcpserver
的accept
方法,該方法會等到乙個客戶端連線到指定的埠,然後返回乙個的tcpsocket
物件,表示連線到該客戶端。
例項
require
'socket'
# 獲取socket標準庫
server =
tcpserver
.open
(2000
)# socket 監聽埠為 2000
loop
現在,在伺服器上執行以上**,檢視效果。
網際網路上,大多服務都有大量的客戶端連線。
ruby
的thread
類可以很容易地建立多執行緒服務,乙個執行緒執行客戶端的連線,而主線程在等待更多的連線。
例項
require
'socket'
# 獲取socket標準庫
server =
tcpserver
.open
(2000
)# socket 監聽埠為 2000
loop
在這個例子中,socket
永久執行,而當server.accept
接收到客戶端的連線時,乙個新的執行緒被建立並立即開始處理請求。而主程式立即迴圈回,並等待新的連線。
我們可以使用socket
庫來實現任何的internet
協議。以下**展示了如何獲取網頁的內容:
例項
require
'socket'
host =
'www.w3cschool.cc'
# web伺服器
port =
80# 預設 http 埠
path =
"/index.htm"
# 想要獲取的檔案位址
# 這是個 http 請求
# 連線伺服器
socket.
print
(request)
# 傳送請求
response = socket.read # 讀取完整的響應
# split response at first blank line into headers and body
headers,body = response.
split
("\r\n\r\n",2
) print body # 輸出結果
要實現乙個類似web
的客戶端,你可以使用為http
預先構建的庫如net::http
。
以下**與先前**是等效的:
例項
# 我們需要的庫
host =
'www.w3cschool.cc'
# web 伺服器
path =
'/index.htm'
# 我們想要的檔案
# 建立連線
# 請求檔案
if headers.code ==
"200"
# 檢測狀態碼
print body
else
puts "# #"
end
程式設計,還是程式設計
喜歡程式設計,雖然水平一般,但還是執著地學習與程式設計有關的知識。中間因為工作關係與程式設計遠離了一段時間,現在又重拾起來,細想起來還是因為喜歡吧。喜歡程式軟體的思想和原理,喜歡程式 的魅力和成就感。程式設計軟體的思想是最值得學習的,一直認為思想決定行動,思想改變世界。每種軟體的流行和受人追捧,無不...
少兒程式設計程式設計
機械人比賽,聽上去讓人有一種高大上的科技感,沒錯,在大多數人眼裡,玩機械人那是科學家做的事情,不過隨著機械人教育的普及,越來越多的孩子也能夠駕馭這高大上的機械人。格物斯坦小坦克告訴你原因,這是歸結於孩子對於程式設計課程的學習,學會對機械人進行程式設計了,自然就能玩轉機械人啦。參加機械人比賽的意義遠遠...
LINUX程式設計 socket程式設計
什麼是套接字 套接字是一種通訊過程,它使客戶 伺服器系統的開發工作既可以在本地單機上進行,也可以跨網路進行。套接字建立過程 1,建立乙個套接字,這是分配給該伺服器程序的乙個作業系統資源,套接字由伺服器通過系統呼叫socket建立出來的,所以其它程序將不能對它進行訪問。2,給套接字起個名字,用系統呼叫...