ruby提供了兩個級別訪問網路的服務,在底層你可以訪問作業系統,它可以讓你實現客戶端和伺服器為面向連線和無連線協議的基本套接字支援。
ruby 統一支援應用程的網路協議,如ftp、http等。
不管是高層的還是底層的。ruby提供了一些基本類,讓你可以使用tcp,udp,socks等很多協議互動,而不必拘泥在網路層。這些類也提供了輔助類,讓你可以輕鬆的對伺服器進行讀寫。
接下來就讓我們來學習如何進行 ruby socket 程式設計
什麼是 sockets
應用層通過傳輸層進行資料通訊時,tcp和udp會遇到同時為多個應用程式程序提供併發服務的問題。多個tcp連線或多個應用程式程序可能需要 通過同乙個tcp協議埠傳輸資料。為了區別不同的應用程式程序和連線,許多計算機作業系統為應用程式與tcp/協議互動提供了稱為套接字 (socket)的介面程式設計客棧,區分不同應用程式程序間的網路通訊和連線。
生成套接字,主要有3個引數:通訊的目的ip位址、使用的傳輸 層協議(tcp或udp)和使用的埠號。socket原意是"插座"。通過將這3個引數結合起來,與乙個"插座"socket繫結,應用層就可以和傳輸 層通過套接字介面,區分來自不同應用程式程序或網路連線的通訊,實現資料傳輸的併發服務。
sockets 詞彙解析:
簡單的客戶端
以下我們通過給定的主機和埠編寫了乙個簡單的客戶端例項,ruby tcpsocket 類提供了 open 方法來開啟乙個 socke。
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
現在,在伺服器上執行以上**,檢視效果。
多客戶端tcp服務
網際網路上,大多服務都有大量的客戶端連線。
ruby的thread類可以很容易地建立多執行緒服務,乙個執行緒執行客戶端的連線,而主線程在等待更多的連線。
require 'socket' # 獲取socket標準庫
server = tcpserver.open(2000) # socket 監聽埠為 2000
loop
在這個例子中,socket永久執行,而當server.accept接收到客戶端的連線時,乙個新的執行緒被建立並立即開始處理請求。而主程式立即迴圈回,並等待新的連線。
微小的web瀏覽器
我們可以使用socket庫來實現任何的 internet 協議。以下**展示了如何獲取網頁的內容:
require 'socket'
host = 'www.ziqiangxuetang.com' # web伺服器
port = 80 #程式設計客棧 預設 http 埠
path = "/index.htm" # 想要獲取的檔案位址
# 這是個 http 請求
socket = tcpsocket.open(host,port) # 連線伺服器
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 的客戶端,你可以使用為 httpwww.cppcns.com 預先構建的庫如net::http。
以下**與先前**是等效的:
require 'net/http' # 我們需要的庫
host = 'www.ziqiangxuetang.com' # web 伺服器
path = '/index.htm' # 我們想要的檔案
http = net::http.new(host) # 建立連線
headers, body = http.get(path) # 請求檔案
if headers.code == "200" # 檢測狀態碼
print body
else
puts "# #"
end本文標題: 簡單的ruby中的socket程式設計教程
本文位址: /jiaoben/ruby/122450.html
簡單的ruby操作
建立here document 多行字串 usr bin ruby w coding utf 8 print eof 這是第一種方式建立here document 多行字串。eof print eof 與上面相同 這是第二種方式建立here document 多行字串。eof print foo b...
C 中Socket的簡單使用
以前學過的socket,後來沒怎麼用過,就基本忘了,所以閒來時重新回顧學習一番.socket其實並不是乙個協議,而是為了方便使用tcp或udp而抽象出來的一層,是位於應用層和傳輸控制層之間的一組介面.當兩台主機通訊是,必須通過socket連線,socket則利用tcp ip協議建立tcp連線.tcp...
python中的socket簡單使用
伺服器端套接字 客戶端套接字 公共用途的套接字函式 服務端我們可以使用 socket 模組的 socket 函式來建立乙個 socket 物件。然後通過呼叫 bind hostname,port 函式來指定服務的埠。接著,呼叫 socket 物件的 accept 方法,等待客戶端的連線,返回 con...