การเขียนโปรแกรมทับทิมซ็อกเก็ต

ทับทิมมีสองระดับของการเข้าถึงบริการเครือข่ายคุณสามารถเข้าถึงระบบปฏิบัติการที่รองรับจะช่วยให้คุณเพื่อให้บรรลุไคลเอ็นต์และเซิร์ฟเวอร์สำหรับการสนับสนุนโปรโตคอลการเชื่อมต่อที่มุ่งเน้นและ connectionless ซ็อกเก็ตขั้นพื้นฐาน

ทับทิมโปรโตคอลแบบครบวงจรสนับสนุนการประยุกต์ใช้เครือข่ายเช่น FTP, HTTP และชอบ

ไม่ว่าจะบนหรือด้านล่าง ทับทิมให้เรียนพื้นฐานบางอย่างเพื่อให้คุณสามารถใช้ TCP โต้ตอบ UDP, ถุงเท้า, และโปรโตคอลอื่น ๆ อีกมากมายโดยไม่ต้องเป็นทางการที่ชั้นเครือข่าย ชั้นเรียนเหล่านี้ยังให้เรียนเสริมเพื่อให้คุณสามารถอ่านและเขียนไปยังเซิร์ฟเวอร์

ถัดไปให้เราได้เรียนรู้วิธีการเขียนโปรแกรมทับทิมซ็อกเก็ต


สิ่งที่เป็นซ็อกเก็ต

เมื่อโปรแกรมการสื่อสารข้อมูลผ่านชั้นชั้นการขนส่ง, TCP และ UDP ประสบการณ์ในขณะที่ให้บริการสำหรับหลายประเด็นขั้นตอนการสมัครพร้อมกัน การเชื่อมต่อ TCP หลายคนหรือหลายโปรแกรมผ่านกระบวนการเดียวกันอาจต้องใช้พอร์ต TCP โปรโตคอลการถ่ายโอนข้อมูล เพื่อที่จะแยกแยะความแตกต่างระหว่างขั้นตอนการสมัครที่แตกต่างกันและการเชื่อมต่อระบบปฏิบัติการคอมพิวเตอร์จำนวนมากโต้ตอบกับการใช้งาน TCP / IP โปรโตคอลและมีอินเตอร์เฟซที่เรียกว่าซ็อกเก็ต (Socket) ความแตกต่างระหว่างการสื่อสารเครือข่ายและการเชื่อมต่อระหว่างขั้นตอนการสมัครที่แตกต่างกันสำหรับ

สร้างซ็อกเก็ตมีสามปัจจัยหลัก: ที่อยู่ IP ปลายทางของการจราจรโปรโตคอลชั้นการขนส่ง (TCP หรือ UDP) และใช้หมายเลขพอร์ต ซ็อกเก็ตมีวัตถุประสงค์เพื่อ "ซ็อกเก็ต." โดยการรวมทั้งสามพารามิเตอร์และ "ซ็อกเก็ต" ซ็อกเก็ตผูกชั้นใบสมัครและชั้นการขนส่งสามารถผ่านอินเตอร์เฟซซ็อกเก็ต, ความแตกต่างระหว่างกระบวนการสื่อสารจากการใช้งานที่แตกต่างกันหรือการเชื่อมต่อเครือข่ายพร้อมกันบริการส่งข้อมูล

ซ็อกเก็ตการวิเคราะห์คำศัพท์:

ตัวเลือก ลักษณะ
โดเมน ระบุครอบครัวโปรโตคอลที่ใช้มักจะ PF_INET, PF_UNIX, PF_X25 และอื่น ๆ
ชนิด ระบุชนิดของซ็อกเก็ต: SOCK_STREAM หรือ SOCK_DGRAM อินเตอร์เฟซซ็อกเก็ตนอกจากนี้ยังกำหนดซ็อกเก็ตดิบ (SOCK_RAW) โปรแกรมที่ช่วยให้การใช้งานของโปรโตคอลในระดับต่ำ
โปรโตคอล มักจะได้รับมอบหมาย 0
ชื่อโฮสต์ เครือข่ายระบุอินเตอร์เฟซ:
  • สตริงอาจจะเป็นชื่อโฮสต์หรือที่อยู่ IP
  • สตริง "<ออกอากาศ>" ระบุที่อยู่ INADDR_BROADCAST
  • สตริงความยาวเป็นศูนย์ที่ระบุ INADDR_ANY
  • จำนวนเต็มตีความว่าเป็นคำสั่งไบต์โฮสต์ที่อยู่ไบนารี
พอร์ต พอร์ตหมายเลขพอร์ตและแต่ละเซิร์ฟเวอร์จะฟังคนหนึ่งหรือหลายหมายเลขพอร์ตสำหรับการเชื่อมต่อของลูกค้าหมายเลขพอร์ตที่สามารถเป็นหมายเลขพอร์ต Fixnum มันมีชื่อเซิร์ฟเวอร์และพอร์ต

ลูกค้าที่เรียบง่าย

ด้านล่างเราจะผ่านโฮสต์ที่กำหนดและพอร์ตการเขียนเช่นลูกค้าง่ายทับทิม TCPSocket เปิดชั้นเรียนมีวิธีการเปิด socke ที่

TCPSocket.open (hosname พอร์ต) เพื่อเปิดการเชื่อมต่อ TCP

เมื่อคุณเปิดการเชื่อมต่อซ็อกเก็ตคุณสามารถอ่านเช่นวัตถุ IO ตามจะเสร็จสมบูรณ์คุณจะต้องปิดแฟ้มใกล้ที่สุดเท่าที่เชื่อมต่อ

ตัวอย่างต่อไปนี้แสดงให้เห็นถึงวิธีการเชื่อมต่อไปยังพื้นที่ที่เฉพาะเจาะจงและอ่านข้อมูลจากซ็อกเก็ตและสุดท้ายปิดซ็อกเก็ต:

require 'socket'      # Sockets 是标准库

hostname = 'localhost'
port = 2000

s = TCPSocket.open(hostname, port)

while line = s.gets   # 从 socket 中读取每行数据
  puts line.chop      # 打印到终端
end
s.close               # 关闭 socket 

บริการแบบธรรมดา

ทับทิมสามารถนำมาใช้ระดับ tcpserver การเขียนบริการที่ง่าย tcpserver วัตถุวัตถุโรงงาน TCPSocket

ตอนนี้เราใช้ TCPServer.open (ชื่อโฮสต์พอร์ต) ในการสร้างวัตถุ tcpserver

สายต่อไป tcpserver ยอมรับวิธีการรอจนกว่าลูกค้าเชื่อมต่อกับพอร์ตที่ระบุและส่งกลับวัตถุ TCPSocket หนึ่งที่แสดงให้เห็นถึงการเชื่อมต่อกับลูกค้า

require 'socket'               # 获取socket标准库

server = TCPServer.open(2000)  # Socket 监听端口为 2000
loop {                         # 永久运行服务
  client = server.accept       # 等待客户端连接
  client.puts(Time.now.ctime)  # 发送时间到客户端
  client.puts "Closing the connection. Bye!"
  client.close                 # 关闭客户端连接
}

ตอนนี้โค้ดข้างต้นทำงานบนเซิร์ฟเวอร์ดูผลลัพธ์


บริการ TCP หลายลูกค้า

บนอินเทอร์เน็ตที่ให้บริการส่วนใหญ่จะมีจำนวนมากของการเชื่อมต่อลูกค้า

ระดับกระทู้ทับทิมสามารถสร้างแบบมัลติเธรดด้ายของการดำเนินการสำหรับการเชื่อมต่อลูกค้าและหัวข้อหลักคือการรอคอยสำหรับการเชื่อมต่อมากขึ้น

require 'socket'                # 获取socket标准库

server = TCPServer.open(2000)   # Socket 监听端口为 2000
loop {                          # 永久运行服务
  Thread.start(server.accept) do |client|
    client.puts(Time.now.ctime) # 发送时间到客户端
	client.puts "Closing the connection. Bye!"
    client.close                # 关闭客户端连接
  end
}

ในตัวอย่างนี้ซ็อกเก็ตรันและเมื่อ server.accept รับลูกค้าเพื่อเชื่อมต่อกับหัวข้อใหม่จะถูกสร้างขึ้นและทันทีที่เริ่มการประมวลผลคำขอ และตอนนี้วงหลักของโปรแกรมกลับและรอการเชื่อมต่อใหม่


เว็บเบราเซอร์เล็ก ๆ

เราสามารถใช้ห้องสมุดซ็อกเก็ตที่จะดำเนินการใด ๆ ของ Internet Protocol รหัสต่อไปนี้แสดงให้เห็นถึงวิธีการที่จะได้รับเนื้อหาของหน้า:

require 'socket'
 
host = 'www.w3cschool.cc'     # web服务器
port = 80                           # 默认 HTTP 端口
path = "/index.htm"                 # 想要获取的文件地址

# 这是个 HTTP 请求
request = "GET #{path} HTTP/1.0\r\n\r\n"

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                          # 输出结果

เพื่อให้บรรลุลูกค้าเว็บที่คล้ายกันคุณสามารถใช้ห้องสมุดที่สร้างไว้ล่วงหน้าเช่น HTTP สุทธิ :: HTTP

รหัสต่อไปนี้จะเทียบเท่ากับรหัสก่อนหน้านี้:

require 'net/http'                  # 我们需要的库
host = 'www.w3cschool.cc'           #  web 服务器
path = '/index.htm'                 # 我们想要的文件 

http = Net::HTTP.new(host)          # 创建连接
headers, body = http.get(path)      # 请求文件
if headers.code == "200"            # 检测状态码
  print body                        
else                                
  puts "#{headers.code} #{headers.message}" 
end

ดังกล่าวข้างต้นเราก็แนะนำในการใช้งานทับทิมซ็อกเก็ตเอกสารเพิ่มเติมโปรดดูที่: ห้องสมุดทับทิมและวิธีการเรียนเบ้า