Latest web development tutorials

Rubi soquete de programação

Rubi oferece dois níveis de acesso aos serviços de rede, você pode acessar o sistema operacional subjacente, que lhe permite alcançar o suporte ao cliente e servidor para os protocolos orientados a conexão e sem conexão de soquete de base.

protocolos de rubi unificados de suporte a aplicativos de rede, como FTP, HTTP e similares.

Se superior ou inferior. ruby fornece algumas classes básicas, para que possa utilizar o protocolo TCP interativa, UDP, meias e muitos outros protocolos, sem formalidade na camada de rede. Essas classes também oferecem aulas suplementares, assim você pode facilmente ler e escrever para o servidor.

Em seguida, vamos aprender como o Ruby soquete de programação


Quais são Sockets

Quando a comunicação de dados de camada de aplicação através da camada de transporte, TCP e UDP experiência ao fornecer serviços para vários problemas do processo de aplicação em simultâneo. Múltiplas conexões TCP ou vários aplicativos através do mesmo processo pode exigir uma porta de protocolo TCP para transferir dados. A fim de distinguir entre diferentes processos de aplicação e ligações, muitos sistemas operacionais de computador interagir com aplicações de TCP / IP protocolo e fornece uma interface chamada de socket (soquete), a distinção entre a comunicação de rede e conectividade entre os diferentes processos de aplicação para.

Gerar socket, existem três parâmetros principais: endereço IP de destino do tráfego, o protocolo de camada de transporte (TCP ou UDP) usado eo número da porta. Tomada destina-se a "socket". Ao combinar esses três parâmetros, e um "socket" ligar soquete, a camada de aplicação e camada de transporte pode ser através da interface de socket, a distinção entre processos de comunicação de diferentes aplicações ou ligações de rede, serviços de transmissão de dados simultâneos.

análise Sockets vocabulário:

opções descrição
domínio família protocolo especificado é usado, geralmente PF_INET, PF_UNIX, PF_X25, e assim por diante.
tipo Especifique o tipo de socket: SOCK_STREAM ou SOCK_DGRAM, soquete interface também define o soquete bruto (SOCK_RAW), o programa permite o uso do protocolo de baixo nível
protocolo Geralmente atribuído 0.
hostname Rede identificador de interface:
  • Cadeia pode ser um nome de host ou o endereço IP
  • A cadeia "<broadcast>", especificar o endereço INADDR_BROADCAST.
  • cadeia de comprimento zero que especifica INADDR_ANY
  • Um inteiro interpretado como byte order série de endereço binário.
porto port é o número da porta, e cada servidor irá ouvir um ou vários números de porta para conexões de clientes, um número de porta pode ser o número da porta Fixnum, que contém o nome do servidor ea porta.

cliente simples

A seguir, através de um determinado host e porta para escrever um exemplo simples cliente, Ruby TcpSocket classe aberta fornece uma maneira de abrir um socke.

TCPSocket.open (hosname, porta) para abrir uma conexão TCP.

Depois de abrir uma conexão de soquete, você pode ler como IO objeto como ele é concluído, você precisa fechar o arquivo de tão perto quanto a conexão.

O exemplo a seguir demonstra como se conectar a um host específico e ler dados a partir do soquete, e, finalmente, fechar o 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 

serviço simples

Ruby pode ser usado classe TCPServer escrever um serviço simples. Tcpserver objetos são TcpSocket objeto de fábrica.

Agora usamos TCPServer.open (hostname, porta) para criar um objeto TCPServer.

A próxima chamada TCPServer aceitamos o método aguarda até que um cliente se conecta à porta especificada e retorna um objeto TcpSocket que representa a conexão com o 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                 # 关闭客户端连接
}

Agora, o código acima é executado no servidor, ver os resultados.


serviço TCP multi-cliente

Na Internet, a maioria dos serviços têm um grande número de conexões de clientes.

classe Thread de Ruby pode facilmente criar vários segmentos, um segmento de execução para conexões de cliente, e o segmento principal está à espera de mais conexões.

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
}

Neste exemplo, tomada de correr para sempre, e quando server.accept receber o cliente para conectar-se a um novo segmento é criado e imediatamente começar a processar o pedido. E agora o principal de volta loop de programa e esperar por uma nova conexão.


browser minúsculo

Podemos usar a biblioteca socket para implementar qualquer protocolo Internet. O código a seguir mostra como obter o conteúdo da 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 um cliente web similar, você pode usar a biblioteca pré-construída de HTTP, como o Net :: HTTP.

O código a seguir é equivalente ao 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

Acima de nós simplesmente introduzir o Ruby em aplicações de soquete, mais documentação, consulte: bibliotecas Ruby e os métodos de classe Socket