Latest web development tutorials

Ruby Socket Programming

Ruby menyediakan dua tingkat akses ke layanan jaringan, Anda dapat mengakses sistem operasi yang mendasari, memungkinkan Anda untuk mencapai klien dan server dukungan untuk sambungan-oriented dan connectionless protokol socket dasar.

Ruby protokol jaringan dukungan aplikasi terpadu, seperti FTP, HTTP dan sejenisnya.

Apakah atas atau bawah. ruby memberikan beberapa kelas dasar, sehingga Anda dapat menggunakan TCP interaktif, UDP, SOCKS, dan banyak protokol lainnya, tanpa formalitas pada lapisan jaringan. Kelas ini juga menyediakan kelas tambahan, sehingga Anda dapat dengan mudah membaca dan menulis ke server.

Selanjutnya, mari kita belajar bagaimana Ruby Socket Programming


Apa Sockets

Ketika komunikasi data lapisan aplikasi melalui lapisan transport, TCP dan pengalaman UDP sambil memberikan layanan untuk beberapa masalah proses aplikasi bersamaan. Beberapa koneksi TCP atau beberapa aplikasi melalui proses yang sama mungkin memerlukan port protokol TCP untuk mentransfer data. Untuk membedakan antara proses aplikasi yang berbeda, dan koneksi, banyak sistem operasi komputer berinteraksi dengan aplikasi TCP IP / protokol dan menyediakan sebuah antarmuka yang disebut soket (Socket), perbedaan antara jaringan komunikasi dan konektivitas antara proses aplikasi yang berbeda untuk.

Menghasilkan socket, ada tiga parameter utama: tujuan alamat IP dari lalu lintas, protokol lapisan transport (TCP atau UDP) yang digunakan dan nomor port. Socket ini dimaksudkan untuk "socket." Dengan menggabungkan tiga parameter, dan "socket" Socket mengikat, lapisan aplikasi dan lapisan transport dapat melalui antarmuka socket, perbedaan antara proses komunikasi dari aplikasi yang berbeda atau koneksi jaringan, layanan transmisi data bersamaan.

Analisis soket kosakata:

Pilihan deskripsi
domain Ditentukan keluarga protokol yang digunakan, biasanya PF_INET, PF_UNIX, PF_X25, dan sebagainya.
jenis Tentukan jenis socket: SOCK_STREAM atau SOCK_DGRAM, Socket antarmuka juga mendefinisikan Socket mentah (SOCK_RAW), program ini memungkinkan penggunaan protokol tingkat rendah
protokol Biasanya ditugaskan 0.
hostname Jaringan antarmuka identifier:
  • String dapat menjadi host atau alamat IP
  • String "<disiarkan>", tentukan alamat INADDR_BROADCAST.
  • Zero-panjang string yang menentukan INADDR_ANY
  • Integer ditafsirkan sebagai perintah tuan byte dari alamat biner.
pelabuhan port nomor port, dan setiap server akan mendengarkan satu atau beberapa nomor port untuk koneksi client, nomor port dapat nomor port Fixnum, berisi nama server dan port.

klien sederhana

Di bawah ini kami melalui host yang diberikan dan port untuk menulis contoh klien sederhana, Ruby TCPSocket kelas terbuka menyediakan cara untuk membuka Socke a.

TCPSocket.open (hosname, port) untuk membuka koneksi TCP.

Setelah Anda membuka koneksi Socket, Anda dapat membaca seperti IO objek seperti selesai, Anda harus menutup file sedekat sambungan.

Contoh berikut menunjukkan bagaimana menghubungkan ke host tertentu, dan membaca data dari soket, dan akhirnya menutup soket:

require 'socket'      # Sockets 是标准库

hostname = 'localhost'
port = 2000

s = TCPSocket.open(hostname, port)

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

layanan yang sederhana

Ruby dapat digunakan kelas TCPServer untuk menulis sebuah layanan yang sederhana. TCPServer benda yang TCPSocket objek pabrik.

Sekarang kita menggunakan TCPServer.open (hostname, port) untuk membuat objek TCPServer.

Panggilan berikutnya TCPServer menerima metode menunggu sampai klien terhubung ke port tertentu, dan mengembalikan satu objek TCPSocket yang mewakili koneksi ke klien.

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                 # 关闭客户端连接
}

Sekarang, kode di atas berjalan pada server, melihat hasil.


layanan TCP multi-client

Di Internet, sebagian besar layanan memiliki sejumlah besar koneksi klien.

kelas Thread Ruby dapat dengan mudah membuat multi-ulir, thread eksekusi untuk koneksi client, dan benang utama sedang menunggu untuk koneksi lebih.

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
}

Dalam contoh ini, soket menjalankan selamanya, dan ketika server.accept menerima klien untuk menghubungkan ke, thread baru dibuat dan segera mulai memproses permintaan. Dan sekarang program utama loop kembali dan menunggu koneksi baru.


Web browser kecil

Kita dapat menggunakan perpustakaan socket untuk mengimplementasikan Internet Protocol. Kode berikut menunjukkan bagaimana untuk mendapatkan konten halaman:

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

Untuk mencapai klien web yang sama, Anda dapat menggunakan perpustakaan pre-built HTTP seperti Net :: HTTP.

Kode berikut ini setara dengan kode sebelumnya:

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

Di atas kita hanya memperkenalkan Ruby dalam aplikasi socket, dokumentasi lebih lanjut, silakan lihat: perpustakaan Ruby dan metode kelas Socket