Latest web development tutorials

Programación Ruby Socket

Rubí ofrece dos niveles de acceso a los servicios de red, se puede acceder al sistema operativo subyacente, que le permite conseguir el apoyo de cliente y servidor de los protocolos de conexión y orientados a conexión de socket básico.

Rubí protocolos de red de soporte de aplicaciones unificadas, como FTP, HTTP y similares.

Ya sea superior o inferior. rubí ofrece algunas clases básicas, por lo que puede utilizar el protocolo TCP interactiva, UDP, calcetines, y muchos otros protocolos, sin ninguna formalidad en la capa de red. Estas clases también ofrecen clases complementarias, por lo que pueden leer y escribir en el servidor fácilmente.

A continuación, vamos a aprender cómo Rubí programación de sockets


¿Cuáles son sockets

Cuando la comunicación de datos de capa de aplicación a través de la capa de transporte, TCP y UDP experiencia al tiempo que proporciona servicios a varias cuestiones relativas al proceso de aplicación concurrentes. conexiones TCP múltiples o múltiples aplicaciones por el mismo proceso pueden requerir un puerto de protocolo TCP para transferir datos. Con el fin de distinguir entre los diferentes procesos de aplicación, y las conexiones, muchos sistemas operativos de ordenador interactúan con las aplicaciones TCP IP / protocolo y proporciona una interfaz llamada un socket (Socket), la distinción entre la comunicación de red y la conectividad entre los diferentes procesos de aplicación para.

Generar zócalo, hay tres parámetros principales: la dirección IP de destino del tráfico, el protocolo de capa de transporte (TCP o UDP) utilizado y el número de puerto. Socket se pretende que "socket." Mediante la combinación de estos tres parámetros, y una "toma" se unen zócalo, la capa de aplicación y la capa de transporte puede ser a través de la interfaz de socket, la distinción entre los procesos de comunicación de diferentes aplicaciones o conexiones de red, servicios de transmisión de datos concurrentes.

El análisis de sockets vocabulario:

opciones descripción
dominio Se utiliza familia protocolo especificado, por lo general PF_INET, PF_UNIX, PF_X25, y así sucesivamente.
tipo Especifique el tipo de socket: SOCK_STREAM o SOCK_DGRAM, la interfaz de socket también define el conector directo (SOCK_RAW), el programa permite el uso del protocolo de bajo nivel
protocolo Por lo general asignado 0.
nombre de host identificador de interfaz de red:
  • Cadena puede ser un nombre de host o la dirección IP
  • La cadena "< 'broadcast", especifique la dirección INADDR_BROADCAST.
  • cadena de longitud cero que especifica INADDR_ANY
  • Un entero interpretado como orden de bytes de la dirección binaria.
puerto puerto es el número de puerto, y cada servidor escuchará a uno o varios números de puerto para las conexiones de clientes, un número de puerto puede ser el número de puerto Fixnum, que contiene el nombre del servidor y el puerto.

cliente sencillo

A continuación a través de un host y puerto dado para escribir un simple instancia de cliente, clase abierta Rubí TCPSocket proporciona una manera de abrir un socke.

TCPSocket.open (hosname, puerto) para abrir una conexión TCP.

Una vez que abra una conexión de socket, se puede leer como objeto IO, ya que se ha completado, debe cerrar el archivo tan cerca como la conexión.

El siguiente ejemplo muestra cómo conectarse a un host específico, y leer datos del socket, y finalmente cierra el socket:

require 'socket'      # Sockets 是标准库

hostname = 'localhost'
port = 2000

s = TCPSocket.open(hostname, port)

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

servicio sencillo

Ruby puede ser utilizado para escribir la clase TCPServer un servicio sencillo. Tcpserver objetos son TCPSocket objeto de fábrica.

Ahora usamos TCPServer.open (nombre de host, puerto) para crear un objeto TCPServer.

La siguiente llamada TCPServer aceptar método espera hasta que un cliente se conecta al puerto especificado y devuelve un objeto TCPSocket que representa la conexión con el cliente.

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

Ahora, el código anterior se ejecuta en el servidor, ver los resultados.


servicio TCP multi-cliente

En Internet, la mayoría de los servicios tienen un gran número de conexiones de cliente.

El hilo de la clase Ruby puede crear fácilmente múltiples roscado, un hilo de ejecución para las conexiones de cliente, y el hilo principal está a la espera de más conexiones.

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
}

En este ejemplo, toma de correr para siempre, y cuando, se crea server.accept recepción de cliente para conectarse a un nuevo hilo y comenzar inmediatamente el procesamiento de la solicitud. Y ahora la parte posterior de bucle principal del programa y esperar a una nueva conexión.


Tiny navegador Web

Podemos utilizar la biblioteca de sockets para implementar cualquier protocolo de Internet. El código siguiente muestra cómo obtener el contenido de la página:

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

Para conseguir un cliente web similar, puede utilizar la biblioteca de pre-construidos de HTTP como Net :: HTTP.

El código siguiente es equivalente al código anterior:

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

Por encima de nosotros simplemente introducimos Rubí en aplicaciones de socket, documentación adicional, consulte: bibliotecas Ruby y los métodos de la clase Socket