การเขียนโปรแกรมทับทิมซ็อกเก็ต
ทับทิมมีสองระดับของการเข้าถึงบริการเครือข่ายคุณสามารถเข้าถึงระบบปฏิบัติการที่รองรับจะช่วยให้คุณเพื่อให้บรรลุไคลเอ็นต์และเซิร์ฟเวอร์สำหรับการสนับสนุนโปรโตคอลการเชื่อมต่อที่มุ่งเน้นและ 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 |
ชื่อโฮสต์ | เครือข่ายระบุอินเตอร์เฟซ:
|
พอร์ต | พอร์ตหมายเลขพอร์ตและแต่ละเซิร์ฟเวอร์จะฟังคนหนึ่งหรือหลายหมายเลขพอร์ตสำหรับการเชื่อมต่อของลูกค้าหมายเลขพอร์ตที่สามารถเป็นหมายเลขพอร์ต 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
ดังกล่าวข้างต้นเราก็แนะนำในการใช้งานทับทิมซ็อกเก็ตเอกสารเพิ่มเติมโปรดดูที่: ห้องสมุดทับทิมและวิธีการเรียนเบ้า