Latest web development tutorials

루비 소켓 프로그래밍

루비는 네트워크 서비스에 대한 액세스의 두 가지 수준을 제공합니다, 당신은 기본 운영 체제에 액세스 할 수 있습니다, 그것은 당신이 기본 소켓 연결 지향과 비 연결 프로토콜에 대한 클라이언트 및 서버 지원을 달성 할 수 있습니다.

예컨대 FTP, HTTP 등 루비 통합 어플리케이션 지원 네트워크 프로토콜.

상단 또는 하단 여부. 네트워크 계층에서 형식없이 양방향 TCP, UDP, SOCKS 등 다양한 프로토콜을 사용할 수 있도록 루비 일부 기본 클래스를 제공한다. 이 클래스는 보충 수업을 제공합니다, 그래서 당신은 쉽게 읽고 서버에 기록 할 수 있습니다.

다음으로, 우리가 배울 수 있도록하는 방법 루비 소켓 프로그래밍


소켓은 무엇입니까

경우 전송 계층, TCP 복수 동시 지원 프로세스 문제에 대해 서비스를 제공하는 반면 UDP 경험을 통해 응용 계층 데이터 통신. 동일한 프로세스를 통해 여러 TCP 연결 또는 여러 애플리케이션은 데이터를 전송하기위한 TCP 프로토콜의 포트를 필요로 할 수있다. 다른 애플리케이션 프로세스 및 연결을 구별하기 위해, 많은 컴퓨터 운영 체제 프로그램의 TCP의 IP / 프로토콜과 상호 작용하고 소켓 (소켓)이라는 인터페이스의 다른 애플리케이션 프로세스 간의 네트워크 통신 및 연결의 차이를 제공한다.

소켓을 생성하는 세 가지 주요 변수가있다 : 트래픽의 목적지 IP 어드레스, 전송 계층 프로토콜 (TCP 또는 UDP)을 사용하고, 포트 번호. 소켓을 대상으로 "소켓입니다." 이들 세 개의 파라미터, 및 "소켓"소켓 바인딩을 조합하여 애플리케이션 계층과 전송 계층은 소켓 인터페이스, 다른 애플리케이션 또는 네트워크 접속의 동시 데이터 전송 서비스의 통신 프로세스 간의 구별을 할 수있다.

소켓 어휘 분석 :

옵션 기술
도메인 지정된 프로토콜 제품군은 그래서 일반적으로 PF_INET, PF_UNIX, PF_X25, 사용된다.
유형 소켓의 종류를 지정하거나 SOCK_STREAM SOCK_DGRAM이 소켓 인터페이스는 또한 원시 소켓 (SOCK_RAW)를 정의하고, 프로그램은 낮은 레벨의 프로토콜의 사용을 허용
프로토콜 일반적으로 0을 할당.
호스트 이름 네트워크 인터페이스 식별자 :
  • 문자열은 호스트 이름 또는 IP 주소가 될 수 있습니다
  • "<방송>"문자열은, INADDR_BROADCAST 주소를 지정합니다.
  • INADDR_ANY를 지정 길이가 0 인 문자열
  • 정수는 이진 주소의 호스트 바이트 순서로 해석했다.
포트 포트의 포트 번호이고, 각 서버가 클라이언트에 접속하기위한 하나 또는 다수의 포트 번호를 수신 할 포트 번호가 Fixnum이라는 포트 번호 일 수있다, 서버 이름 및 포트를 포함한다.

간단한 클라이언트

지정된 호스트와 포트를 통해 우리는 단순한 클라이언트 인스턴스를 작성하는 아래, 루비 TCPSocket 오픈 클래스는 socke을 열 수있는 방법을 제공합니다.

TCPSocket.open (hosname, 포트)는 TCP 연결을 엽니 다.

당신은 소켓 연결을 열면이 완료되면, 당신은 IO 객체처럼 읽을 수 있습니다, 당신은 연결 가깝게 파일을 닫아야합니다.

다음의 예는 특정 호스트에 연결 소켓으로부터 데이터를 읽고, 마지막으로 소켓을 닫는 방법을 보여

require 'socket'      # Sockets 是标准库

hostname = 'localhost'
port = 2000

s = TCPSocket.open(hostname, port)

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

간단한 서비스

루비 간단한 서비스를 작성 tcpserver는 클래스가 사용될 수있다. tcpserver는 개체 TCPSocket 팩토리 객체입니다.

이제 우리는 tcpserver는 개체를 만들 TCPServer.open (호스트 이름, 포트)를 사용합니다.

방법을 받아 들일 tcpserver는 다음 호출은 클라이언트가 지정된 포트에 연결될 때까지 대기하고, 클라이언트와의 연결을 나타내는 하나의 TCPSocket 개체를 반환합니다.

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

이제 위의 코드는 서버에서 결과를 볼 실행합니다.


멀티 클라이언트 TCP 서비스

인터넷에서 대부분의 서비스는 클라이언트 연결의 수가 많다.

루비의 스레드 클래스는 쉽게, 다중 스레드 클라이언트 연결을위한 실행 스레드를 생성 할 수 있으며, 메인 쓰레드는 더 많은 연결을 기다리고 있습니다.

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
}

이 예에서, 소켓은 영원히 실행하고 연결하는 클라이언트를 수신 server.accept는 새로운 스레드가 생성 될 때 요청을 즉시 처리하기 시작합니다. 이제 메인 프로그램 루프 뒤로하고 새로운 연결을 기다립니다.


작은 웹 브라우저

우리는 어떤 인터넷 프로토콜을 구현하는 소켓 라이브러리를 사용할 수 있습니다. 다음 코드는 페이지의 콘텐츠를 가져 오는 방법을 보여줍니다 :

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

유사한 웹 클라이언트를 달성하기 위해, 당신은 닷넷 :: HTTP와 같은 HTTP의 사전 구축 된 라이브러리를 사용할 수 있습니다.

다음 코드는 앞의 코드와 동일합니다 :

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

우리는 단순히 소켓 응용 프로그램에서 루비를 소개보다도 더 설명서를 참조하시기 바랍니다 루비 라이브러리와 소켓 클래스 메소드