Latest web development tutorials
×

Ruby หลักสูตร

Ruby หลักสูตร Ruby แนะนำโดยย่อ Ruby สิ่งแวดล้อม Ruby ติดตั้ง Linux Ruby ติดตั้ง Windows Ruby การเข้ารหัสจีน Ruby เลือกบรรทัดคำสั่ง Ruby ตัวแปรสภาพแวดล้อม Ruby ไวยากรณ์ Ruby ชนิดข้อมูล Ruby คลาสและวัตถุ Ruby กรณีระดับ Ruby ตัวแปร Ruby ผู้ประกอบการ Ruby หมายเหตุ Ruby เงื่อนไข Ruby การไหลเวียน Ruby ทาง Ruby กลุ่ม Ruby โมดูล Ruby เชือก Ruby แถว Ruby กัญชา Ruby วันที่และเวลา Ruby ขอบเขต Ruby iterator Ruby input และ output ไฟล์ Ruby File ชั้นเรียนและวิธี Ruby Dir ชั้นเรียนและวิธี Ruby ผิดปกติ

Ruby การสอนที่ทันสมัย

Ruby เชิงวัตถุ Ruby นิพจน์ปกติ Ruby การเข้าถึงฐานข้อมูล - DBI หลักสูตร Ruby MySQL Ruby CGI โครงการ Ruby CGI ทาง Ruby CGI Cookies Ruby CGI Sessions Ruby ส่ง Email SMTP Ruby Socket โครงการ Ruby XML, XSLT, XPath Ruby Web Services Ruby multithreading Ruby JSON Ruby RubyGems

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

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

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