Ruby提供了两个级别访问网络的服务,在底层你可以访问操作系统.
它可以让你实现客户端和服务器为面向连接和无连接协议的基本套接字支持。
ruby提供了一些基本类,包括TCPSocket,UDPSocket,UNIXSocket等很多协议基类;
使用这些基础类,可以完成多种协议交互,而不必拘泥在网络层
多个TCP连接或多个应用程序进程可能需要 通过同一个TCP协议端口传输数据
这些类也提供了辅助类,让你可以轻松的对服务器进行读写
应用层通过传输层进行数据通信时,TCP和UDP会遇到同时为多个应用程序进程提供并发服务的问题
生成套接字,主要有3个参数:通信的目的IP地址、使用的传输 层协议(TCP或UDP)和使用的端口号
Socket原意是"插座"。通过将这3个参数结合起来,与一个"插座"Socket绑定,应用层就可以和传输层
通过套接字接口,来区分来自不同应用程序进程或网络连接的通信,实现数据传输的并发服务。
核心:获取在线帮助UDPSoket.methods (require socket)
=> [:getaddress, :attr, :attr_reader, :attr_writer, :attr_accessor, :select, :new, :open, :sysopen, :popen, :pipe :foreach, :binread, :binwrite, :read, :write, :readlines, :send,]
1) Ruby 提供了UDPSocket类的 new 方法来创建一个基础的Udp套接字。
使用代码:UDPSocket.new() 无参数,创建一个 Udp 套接字。
2) Ruby 提供了UDPSocket类的 bind 方法绑定此套接字使用的地址和端口;
使用代码:UDPSocket.bind(hosname, port) ,绑定该套接字使用的地址和端口
3) Ruby 提供了UDPSocket类的 send 方法发送一定的数据到指定的服务地址
使用代码:UDPSocket.send('message', flag , udpsvr_ip , port) 来向指定的服务端口发送数据
4) Ruby 最后提供UDPSocket类的 recvfrom 方法,接受来自udp链接的数据,参数指定最大接受数量。
使用代码:UDPSocket.recvfrom(1024),表示接受数据;需要保存到指定的变量中;
5) Ruby 也提供了UDPSocket类的 connect 方法记录一个udp服务端地址,这里的仅仅是指定目标地址的属性
使用代码:UDPSocket.connect('localhost', port) 方法,给该socket指定《目标地址》这种属性
当然,这个时候调用 UDPSocket.send('message', flag) 不需要指定目标地址了
{ 费解:UDP是面向不连接的,不应存在connect这类方法,相反;监听端口的方法却未找到 }
require 'socket' # 导入相关类模块 s1 = UDPSocket.new s1.bind("127.0.0.1", 0) s2 = UDPSocket.new s2.bind("127.0.0.1", 0) s2.connect(*s1.addr.values_at(3,1)) s1.connect(*s2.addr.values_at(3,1)) s1.send "aaa", 0 begin # emulate blocking recvfrom p s2.recvfrom_nonblock(10) #=> ["aaa", ["AF_INET", 33302, "localhost.localdomain", "127.0.0.1"]] rescue IO::WaitReadable IO.select([s2]) retry end
================================
u1 = UDPSocket.new u1.bind("127.0.0.1", 4913) #通过上面代码可以猜测,在接收到请求后,这个代码应该包括listen的自动识别能力 u2 = UDPSocket.new u2.send "hi", 0, "127.0.0.1", 4913 mesg, addr = u1.recvfrom(10) u1.send mesg, 0, addr[3], addr[1] p u2.recv(100) #=> "hi"