Ruby 소켓 프로그래밍
Ruby는 네트워크에 대한 두 가지 수준의 액세스를 제공합니다. 맨 아래 수준에서는 운영 체제에 액세스할 수 있으며, 이를 통해 연결 지향 및 비연결 프로토콜에 대한 기본 소켓 지원을 통해 클라이언트와 서버를 구현할 수 있습니다.
Ruby는 FTP, HTTP 등과 같은 애플리케이션 네트워크 프로토콜을 균일하게 지원합니다.
고급인지 저급인지. Ruby는 네트워크 계층에 얽매이지 않고 TCP, UDP, SOCKS 및 기타 여러 프로토콜을 사용하여 상호 작용할 수 있는 몇 가지 기본 클래스를 제공합니다. 이러한 클래스는 서버를 쉽게 읽고 쓸 수 있는 도우미 클래스도 제공합니다.
다음으로 Ruby 소켓 프로그래밍 방법을 알아보겠습니다
소켓이란 무엇입니까
애플리케이션 계층이 전송 계층을 통해 데이터를 통신할 때 TCP와 UDP는 동시에 여러 애플리케이션 프로세스에 동시 서비스를 제공하는 문제에 직면하게 됩니다. 여러 TCP 연결 또는 여러 애플리케이션 프로세스가 동일한 TCP 프로토콜 포트를 통해 데이터를 전송해야 할 수도 있습니다. 서로 다른 응용 프로그램 프로세스와 연결을 구별하기 위해 많은 컴퓨터 운영 체제에서는 응용 프로그램 간의 상호 작용을 위한 소켓이라는 인터페이스와 서로 다른 응용 프로그램 프로세스 간의 네트워크 통신 및 연결을 구별하는 TCP/IP 프로토콜을 제공합니다.
통신의 대상 IP 주소, 사용된 전송 계층 프로토콜(TCP 또는 UDP) 및 사용된 포트 번호의 세 가지 주요 매개변수를 사용하여 소켓을 생성합니다. 소켓의 원래 의미는 "소켓"입니다. 이러한 세 가지 매개변수를 결합하고 이를 "소켓" 소켓에 바인딩함으로써 애플리케이션 계층은 소켓 인터페이스를 통해 전송 계층과 통신하여 다양한 애플리케이션 프로세스 또는 네트워크 연결과의 통신을 구별하고 데이터 전송을 위한 동시 서비스를 구현할 수 있습니다.
소켓 어휘 분석:
옵션 | 설명 |
---|---|
domain | 은 일반적으로 PF_INET, PF_UNIX, PF_X25 등 사용되는 프로토콜 제품군을 나타냅니다. |
type | 소켓 유형을 지정하세요: SOCK_STREAM 또는 SOCK_DGRAM. 소켓 인터페이스는 또한 원래 소켓(SOCK_RAW)을 정의하여 프로그램이 낮은 수준의 프로토콜 |
protocol | 을 사용할 수 있도록 해줍니다. 0. |
hostname | 네트워크 인터페이스의 식별자:
|
port | port는 포트 번호입니다. 각 서버는 클라이언트 연결을 위해 하나 이상의 포트 번호를 수신합니다. 포트 번호는 서버 이름과 포트가 포함된 Fixnum의 포트 번호일 수 있습니다. . |
간단한 클라이언트
아래에서는 주어진 호스트와 포트를 사용하여 간단한 클라이언트 인스턴스를 작성합니다. Ruby TCPSocket 클래스는 소켓을 여는 개방형 메서드를 제공합니다.
TCPSocket.open(hosname, port) 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
간단한 서비스
Ruby에서 TCPServer 클래스를 사용하여 간단한 서비스를 작성할 수 있습니다. TCPServer 객체는 TCPSocket의 팩토리 객체입니다.
이제 TCPServer.open(호스트 이름, 포트)을 사용하여 TCPServer 개체를 만듭니다.
다음으로 TCPServer의 accept 메서드를 호출합니다. 이 메서드는 클라이언트가 지정된 포트에 연결될 때까지 기다린 다음 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 서비스
인터넷에서 대부분의 서비스에는 많은 수의 클라이언트 연결이 있습니다.
Ruby의 Thread 클래스를 사용하면 하나의 스레드가 클라이언트 연결을 수행하는 동안 기본 스레드가 추가 연결을 기다리는 다중 스레드 서비스를 쉽게 만들 수 있습니다.
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 # 输出结果
웹과 유사한 클라이언트를 구현하려면 Net::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
위에서는 Ruby의 소켓 응용 프로그램을 간략하게 소개합니다. 자세한 내용은 Ruby 소켓 라이브러리 및 클래스 메서드