激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Ruby - 簡單的Ruby中的Socket編程教程

簡單的Ruby中的Socket編程教程

2020-04-24 10:51goldensun Ruby

這篇文章主要介紹了簡單的Ruby中的Socket編程教程,是為Ruby on Rails學習過程當中的基礎知識,需要的朋友可以參考下

Ruby提供了兩個級別訪問網(wǎng)絡的服務,在底層你可以訪問操作系統(tǒng),它可以讓你實現(xiàn)客戶端和服務器為面向連接和無連接協(xié)議的基本套接字支持。

Ruby 統(tǒng)一支持應用程的網(wǎng)絡協(xié)議,如FTP、HTTP等。

不管是高層的還是底層的。ruby提供了一些基本類,讓你可以使用TCP,UDP,SOCKS等很多協(xié)議交互,而不必拘泥在網(wǎng)絡層。這些類也提供了輔助類,讓你可以輕松的對服務器進行讀寫。

接下來就讓我們來學習如何進行 Ruby Socket 編程
什么是 Sockets

應用層通過傳輸層進行數(shù)據(jù)通信時,TCP和UDP會遇到同時為多個應用程序進程提供并發(fā)服務的問題。多個TCP連接或多個應用程序進程可能需要 通過同一個TCP協(xié)議端口傳輸數(shù)據(jù)。為了區(qū)別不同的應用程序進程和連接,許多計算機操作系統(tǒng)為應用程序與TCP/IP協(xié)議交互提供了稱為套接字 (Socket)的接口,區(qū)分不同應用程序進程間的網(wǎng)絡通信和連接。

生成套接字,主要有3個參數(shù):通信的目的IP地址、使用的傳輸 層協(xié)議(TCP或UDP)和使用的端口號。Socket原意是"插座"。通過將這3個參數(shù)結合起來,與一個"插座"Socket綁定,應用層就可以和傳輸 層通過套接字接口,區(qū)分來自不同應用程序進程或網(wǎng)絡連接的通信,實現(xiàn)數(shù)據(jù)傳輸?shù)牟l(fā)服務。

Sockets 詞匯解析:

簡單的Ruby中的Socket編程教程

簡單的客戶端

以下我們通過給定的主機和端口編寫了一個簡單的客戶端實例,Ruby TCPSocket 類提供了 open 方法來打開一個 socke。

TCPSocket.open(hosname, port ) 打開一個 TCP 連接。

一旦你打開一個 Socket 連接,你可以像 IO 對象一樣讀取它,完成后,你需要像關閉文件一樣關閉該連接。

以下實例演示了如何連接到一個指定的主機,并從 socket 中讀取數(shù)據(jù),最后關閉socket:

?
1
2
3
4
5
6
7
8
9
10
11
require 'socket'   # Sockets 是標準庫
 
hostname = 'localhost'
port = 2000
 
s = TCPSocket.open(hostname, port)
 
while line = s.gets  # 從 socket 中讀取每行數(shù)據(jù)
 puts line.chop   # 打印到終端
end
s.close        # 關閉 socket

簡單的服務

Ruby 中可以使用 TCPServer 類來寫個簡單的服務。TCPServer 對象是 TCPSocket 的工廠對象。

現(xiàn)在我們使用 TCPServer.open(hostname, port) 來創(chuàng)建一個 TCPServer 對象。

接下來調(diào)用 TCPServer 的 accept 方法,該方法會等到一個客戶端連接到指定的端口,然后返回一個的TCPSocket對象,表示連接到該客戶端。

?
1
2
3
4
5
6
7
8
9
require 'socket'        # 獲取socket標準庫
 
server = TCPServer.open(2000) # Socket 監(jiān)聽端口為 2000
loop {             # 永久運行服務
 client = server.accept    # 等待客戶端連接
 client.puts(Time.now.ctime) # 發(fā)送時間到客戶端
 client.puts "Closing the connection. Bye!"
 client.close         # 關閉客戶端連接
}

現(xiàn)在,在服務器上運行以上代碼,查看效果。
多客戶端TCP服務

互聯(lián)網(wǎng)上,大多服務都有大量的客戶端連接。

Ruby的Thread類可以很容易地創(chuàng)建多線程服務,一個線程執(zhí)行客戶端的連接,而主線程在等待更多的連接。

?
1
2
3
4
5
6
7
8
9
10
require 'socket'        # 獲取socket標準庫
 
server = TCPServer.open(2000# Socket 監(jiān)聽端口為 2000
loop {             # 永久運行服務
 Thread.start(server.accept) do |client|
  client.puts(Time.now.ctime) # 發(fā)送時間到客戶端
  client.puts "Closing the connection. Bye!"
  client.close        # 關閉客戶端連接
 end
}

在這個例子中,socket永久運行,而當server.accept接收到客戶端的連接時,一個新的線程被創(chuàng)建并立即開始處理請求。而主程序立即循環(huán)回,并等待新的連接。
微小的Web瀏覽器

我們可以使用socket庫來實現(xiàn)任何的 Internet 協(xié)議。以下代碼展示了如何獲取網(wǎng)頁的內(nèi)容:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
require 'socket'
 
host = 'www.ziqiangxuetang.com'   # web服務器
port = 80              # 默認 HTTP 端口
path = "/index.htm"         # 想要獲取的文件地址
 
# 這是個 HTTP 請求
request = "GET #{path} HTTP/1.0 "
 
socket = TCPSocket.open(host,port) # 連接服務器
socket.print(request)        # 發(fā)送請求
response = socket.read       # 讀取完整的響應
# Split response at first blank line into headers and body
headers,body = response.split(" ", 2)
print body             # 輸出結果

要實現(xiàn)一個類似 web 的客戶端,你可以使用為 HTTP 預先構建的庫如Net::HTTP。

以下代碼與先前代碼是等效的:

?
1
2
3
4
5
6
7
8
9
10
11
require 'net/http'         # 我們需要的庫
host = 'www.ziqiangxuetang.com'      # web 服務器
path = '/index.htm'         # 我們想要的文件
 
http = Net::HTTP.new(host)     # 創(chuàng)建連接
headers, body = http.get(path)   # 請求文件
if headers.code == "200"      # 檢測狀態(tài)碼
 print body           
else               
 puts "#{headers.code} #{headers.message}"
end

 

延伸 · 閱讀

精彩推薦
  • RubyRuby設計模式編程中使用Builder建造者模式的實例

    Ruby設計模式編程中使用Builder建造者模式的實例

    這篇文章主要介紹了Ruby設計模式編程中使用Builder建造者模式的實例,建造者模式將一個復雜對象的構造與它的表示分離,使同樣的構建過程可以創(chuàng)建不同的表...

    范孝鵬2192020-05-07
  • RubyCentOS中配置Ruby on Rails環(huán)境

    CentOS中配置Ruby on Rails環(huán)境

    經(jīng)過一個上午的折騰,終于把ROR環(huán)境在CentOS中搞定,繞了很多彎路,把文章寫下來總結一下 ...

    可樂加糖4762020-04-12
  • RubyRuby簡潔學習筆記(一):字符串、數(shù)字、類和對象

    Ruby簡潔學習筆記(一):字符串、數(shù)字、類和對象

    這篇文章主要介紹了Ruby簡潔學習筆記(一):字符串、數(shù)字、類和對象,本文是學習筆記第一篇,需要的朋友可以參考下 ...

    腳本之家2472020-04-20
  • RubyRuby環(huán)境下安裝使用bundler來管理多版本的gem

    Ruby環(huán)境下安裝使用bundler來管理多版本的gem

    這篇文章主要介紹了Ruby環(huán)境下安裝使用bundler來管理多版本的gem的方法,舉了Ruby On Rails中的應用實例來進行演示,需要的朋友可以參考下 ...

    日拱一卒4332020-05-10
  • RubyRuby進行文件信息輸出實例代碼

    Ruby進行文件信息輸出實例代碼

    Ruby進行文件信息輸出實例代碼,數(shù)據(jù)是隨機的,所以每次的記錄都會不同。 ...

    ruby教程網(wǎng)2962020-04-10
  • Ruby剖析 Ruby 訪問控制

    剖析 Ruby 訪問控制

    前面,我們說 Ruby 沒有函數(shù),只有方法.而且實際上有不止一種方法.這一節(jié)我們介紹 訪問控制 (accesscontrols). 想想當我們在最高層而不是在一個類的定義里定義...

    ruby教程網(wǎng)3572020-04-08
  • RubyRuby迭代器的7種技巧分享

    Ruby迭代器的7種技巧分享

    這篇文章主要介紹了Ruby迭代器的7種技巧分享,Ruby中的迭代器非常人性化,本文既是講解了7個技巧也是講解了7種迭代器,需要的朋友可以參考下 ...

    腳本之家4782020-04-20
  • Ruby簡要說明Ruby中的迭代器

    簡要說明Ruby中的迭代器

    這篇文章主要介紹了Ruby中的迭代器,迭代器的概念在動態(tài)語言的編程中十分重要,文章中介紹了Ruby中的each迭代器和collect迭代器,需要的朋友可以參考下 ...

    goldensun2772020-04-25
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25
主站蜘蛛池模板: 在线成人精品视频 | 亚洲福利视 | 精品国产一区二区三区久久久蜜 | 免费a视频 | 久久99国产精品久久99 | 亚洲天堂在线电影 | 黄色片网站在线看 | 亚洲精品成人18久久久久 | 超污视频在线看 | 国产日韩亚洲 | 国产精品久久久久久婷婷天堂 | av色先锋| 在线观看福利网站 | 久久一区三区 | 国产亚洲精品久久午夜玫瑰园 | 国产精品一区二区三区在线看 | 国产精品热 | 人人舔人人插 | 有色视频在线观看 | 国产精品一区二区手机在线观看 | 一区二区三区日韩在线观看 | 国产精品久久久久久久不卡 | 国产日韩在线 | 亚洲视频精品在线 | 午夜精品成人 | 成人免费av在线播放 | 国产精品麻豆一区二区三区 | 国产一精品一av一免费爽爽 | 亚洲成年人免费网站 | 久久99久久99免费视频 | 国产亚洲精品久久久久久久软件 | 538任你躁在线精品视频网站 | 久久草草影视免费网 | 亚洲第一视频在线 | 在线观看中文字幕国产 | 99麻豆久久久国产精品免费 | 天天草天天干天天射 | 日本精品久久久久 | 久草最新网址 | 看一级毛片 | av影院在线播放 |