Ruby教程
Ruby控制语句
Ruby高级

Ruby 套接字编程

Ruby 套接字编程

套接字是网络通信通道的端点,客户端和服务器在此处相互通信。它们可以在同一台机器上或不同的机器上进行通信。
套接字类型:
TCP 套接字 UDP 套接字 UNIX 套接字
socket有高低两级。低级访问允许您处理系统支持的套接字。它允许实现无连接和面向连接的协议。高级访问权限允许您处理 HTTP 和 FTP 等网络协议。

示例 1

server1.rb
#!/usr/bin/ruby require 'socket' server = TCPServer. open(2017) loop { client = server.accept client.puts "Hello. this is socket programming" client.close }
在上面的代码中,需要包含预先安装的socket模块。我们在我们的系统上使用 2017 端口。您可以使用任何端口。
开始一个循环,接受到端口 2017 的所有连接,并通过套接字网络向客户端发送数据。
最后,关闭套接字。
client1.rb
#!/usr/bin/ruby require 'socket' hostname = 'localhost' port = 2017 s = TCPSocket. open(hostname, port) while line = s.gets puts line.chomp end s.close
在上面的代码中,需要包含预先安装的socket模块。创建一个套接字并将其连接到端口 2017、
创建一个 while 循环来获取通过套接字发送的所有信息。
最后,关闭套接字。
输出:
转到终端,切换到您保存上述两个文件的目录。我们已将其保存在我们的桌面目录中。
现在要执行这些文件,我们需要具有所需的权限。在终端中运行以下命令,
chmod a+x *.rb
此命令将使此目录中的所有 Ruby 文件可执行。
Ruby Socket Programming 1

现在打开两个终端。在第一个终端中执行服务器脚本,在第二个终端中使用以下命令执行客户端脚本。
ruby filename.rb
Ruby Socket 编程 2


多客户端套接字编程

对于多个客户端进行套接字编程,需要一个循环和一些线程来接受和响应多个客户端。

示例2

server3.rb
#!/usr/bin/env ruby-w require "socket" class Server def initialize( port, ip ) @server = TCPServer. open( ip, port ) @connections = Hash.new @rooms = Hash.new @clients = Hash.new @connections[:server] = @server @connections[:rooms] = @rooms @connections[:clients] = @clients run end def run loop { Thread. start(@server.accept) do | client | nick_name = client.gets.chomp.to_sym @connections[:clients].each do |other_name, other_client| if nick_name == other_name || client == other_client client.puts "this username already exist" Thread.kill self end end puts "#{nick_name} #{client}" @connections[:clients][nick_name] = client client.puts "Connection established..." listen_user_messages( nick_name, client ) end }.join end def listen_user_messages( username, client ) loop { msg = client.gets.chomp @connections[:clients].each do |other_name, other_client| unless other_name == username other_client.puts "#{username.to_s}: #{msg}" end end } end end Server. new( 2019, "localhost" )
在上面的代码中,服务器将与客户端具有相同的端口来建立连接。这里我们需要每个连接的用户一个线程来处理所有可能的用户。
run 方法验证输入的名称是否唯一。如果用户名已经存在,连接将被终止,否则将建立连接。
listen_user_messages 方法监听用户消息并将它们发送给所有用户。
client3.rb
#!/usr/bin/env ruby-w require "socket" class Client def initialize( server ) @server = server @request = nil @response = nil listen send @request.join @response.join end def listen @response = Thread.new do loop { msg = @server.gets.chomp puts "#{msg}" } end end def send puts "Enter your name:" @request = Thread.new do loop { msg = $stdin.gets.chomp @server. puts( msg ) } end end end server = TCPSocket. open( "localhost", 2019 ) Client. new( server )
在上面的代码中,创建了类Client来处理用户。
在send 和listen 方法中创建了两个线程,以便我们可以同时读/写消息。
输出:
下面的快照显示了两个客户端之间的聊天。
Ruby Socket 编程 3

服务器端的输出如下所示。
《Ruby

昵称: 邮箱:
Copyright © 2022 立地货 All Rights Reserved.
备案号:京ICP备14037608号-4