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:
|
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