English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Ruby는 네트워크에 접근할 수 있는 두 가지 수준의 서비스를 제공합니다. 하위 수준에서는 운영 체제에 접근할 수 있으며, 이는 클라이언트와 서버가 연결된和无연결 프로토콜의 기본 소켓 지원을 구현할 수 있게 합니다.
Ruby는 FTP, HTTP 등의 애플리케이션 네트워크 프로토콜을 일관되게 지원합니다.
고층이든 저층이든. Ruby는 TCP, UDP, SOCKS 등 많은 프로토콜을 사용하여 네트워크 레이어에 구애받지 않고 상호작용할 수 있는 기본 클래스를 제공합니다. 이 클래스는 서버를 쉽게 읽고 쓸 수 있는 보조 클래스도 제공합니다.
그래서 Ruby Socket 프로그래밍을 배우기 시작해 보겠습니다.
애플리케이션 레이어가 트랜스포트 레이어를 통해 데이터 통신을 수행할 때, TCP와 UDP는 여러 애플리케이션 프로세스에 대해 병행 서비스를 제공하는 문제를 겪습니다. 여러 TCP 연결이나 여러 애플리케이션 프로세스는 동일한 TCP 프로토콜 포트를 통해 데이터를 전송할 수 있습니다. 다른 애플리케이션 프로세스와 연결을 구분하기 위해 많은 컴퓨터 운영 체제는 애플리케이션과 TCP/IP 프로토콜 간의 상호작용을 위해 "소켓(Socket)"라는 인터페이스를 제공합니다. 다른 애플리케이션 프로세스 간의 네트워크 통신과 연결을 구분합니다.
소켓 생성 주요3파라미터: 통신의 목적 IP 주소, 사용하는 트랜스포트 레이어 프로토콜(TCP 또는 UDP) 및 사용하는 포트 번호. 소켓의 원래 의미는 "소켓"입니다. 이를 통해3파라미터가 결합되면, "소켓"과 결합되고, 애플리케이션 레이어는 트랜스포트 레이어를 통해 소켓 인터페이스를 통해 다른 애플리케이션 프로세스 또는 네트워크 연결에서 오는 통신을 구분하여 데이터 전송의 병행 서비스를 구현할 수 있습니다.
Sockets 용어 해석:
옵션 | 설명 |
---|---|
domain | 사용하는 프로토콜 가족을 지정합니다. 일반적으로 PF_INET, PF_UNIX, PF_X입니다.25또는. |
type | 소켓의 유형을 지정합니다: SOCK_STREAM 또는 SOCK_DGRAM, 소켓 인터페이스는 원시 소켓(SOCK_RAW)도 정의하여 프로그램이 저층 프로토콜을 사용할 수 있도록 합니다. |
protocol | 일반적으로 0으로 할당됩니다. |
hostname | 네트워크 인터페이스의 식별자:
|
포트 | 포트는 포트 번호입니다. 각 서버는 하나 이상의 클라이언트 연결을 감시하는 포트 번호를 듣습니다. 포트 번호는 Fixnum의 포트 번호로, 서버 이름과 포트를 포함합니다. |
주어진 호스트와 포트를 통해 간단한 클라이언트 예제를 작성한 후, Ruby TCPSocket 클래스의 open 메서드를 통해 소켓을 열 수 있습니다.
TCPSocket.open(hosname, port)는 TCP 연결을 엽니다.
Socket 연결을 열면 IO 객체와 같이 읽을 수 있으며, 작업이 끝나면 파일을 닫는 것처럼 연결을 닫아야 합니다.
다음 예제는 지정된 호스트에 연결하고 소켓에서 데이터를 읽으며, 마지막으로 소켓을 닫는 방법을 보여줍니다:
require 'socket' # 소켓은 표준 라이브러리입니다 hostname = 'localhost' port = 2000 s = TCPSocket.open(hostname, port) while line = s.gets # 소켓에서 각 행 데이터를 읽습니다 puts line.chop # 터미널에 출력합니다 end s.close # 소켓을 닫습니다
Ruby에서 TCPServer 클래스를 사용하여 간단한 서비스를 작성할 수 있습니다. TCPServer 객체는 TCPSocket의 팩토리 객체입니다.
지금은 TCPServer.open(hostname, port)를 사용하여 TCPServer 객체를 생성합니다.
다음은 TCPServer의 accept 메서드를 호출하여, 이 메서드는 지정된 포트에 클라이언트가 연결될 때까지 기다리고, 해당 클라이언트에 대한 TCPSocket 객체를 반환합니다.
require 'socket' # 소켓 표준 라이브러리를 가져옵니다 server = TCPServer.open(2000) # 소켓이 들어오는 포트 번호입니다 2000 loop { # 서비스를 영구적으로 실행합니다 client = server.accept # 클라이언트 연결을 기다립니다 client.puts(Time.now.ctime) # 현재 시간을 클라이언트로 전송합니다 client.puts "Closing the connection. Bye!" client.close # 클라이언트 연결을 닫습니다 }
이제 이 코드를 서버에서 실행하여 효과를 확인하세요.
인터넷에서는 많은 서비스가 많은 클라이언트 연결을 가지고 있습니다.
Ruby의 Thread 클래스는 다중 스레드 서비스를 쉽게 생성할 수 있습니다. 하나의 스레드가 클라이언트의 연결을 수행하며, 메인 스레드는 더 많은 연결을 기다립니다.
require 'socket' # 소켓 표준 라이브러리를 가져옵니다 server = TCPServer.open(2000) # 소켓이 리스닝 포트를 2000 loop { # 영구적으로 서비스를 실행 Thread.start(server.accept) do |client| client.puts(Time.now.ctime) # 시간을 클라이언트로 보냅니다 client.puts "Closing the connection. Bye!" client.close # 클라이언트 연결을 닫습니다 end }
이 예제에서 socket은 영구적으로 실행되며, server.accept가 클라이언트의 연결을 받을 때마다 새로운 스레드가 생성되어 즉시 요청을 처리합니다. 주 프로그램은 즉시 다시 순환하여 새 연결을 기다립니다.
우리는 socket 라이브러리를 사용하여 어떤 인터넷 프로토콜도 구현할 수 있습니다. 다음 코드는 웹 페이지 내용을 가져오는 방법을 보여줍니다:
require 'socket' 호스트 = 'www.w'3codebox.com' # 웹 서버 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 # 전체 응답을 읽습니다 # response를 첫 번째 공백 줄로 분할하여 headers와 body로 나눕니다 headers, body = response.split("\r\n\r\n", 2) print body # 결과 출력
웹과 유사한 클라이언트를 구현하려면, Net::HTTP와 같은 HTTP를 미리 구축된 라이브러리를 사용할 수 있습니다.
다음 코드는 이전 코드와 동일한 효과를 가집니다:
require 'net'/http' # 필요한 라이브러리 호스트 = 'www.w'3codebox.com' # 웹 서버 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
위에서는 Ruby에서 소켓의 응용을 간단히 소개했습니다. 더 많은 문서는 다음을 참조하십시오:Ruby 소켓 라이브러리와 클래스 메서드