概要
標準の socket ライブラリを使って TCP や UDP のソケットサーバを構築してみました
環境
- macOS 11.3.1
- Ruby 3.0.0
TCP サーバ
3 way hand shake します
require 'socket'
Socket.tcp_server_loop(12345) {|sock, client_addrinfo|
Thread.new {
begin
IO.copy_stream(sock, sock)
ensure
sock.close
end
}
}
TCPServer を使っても書けます
require 'socket'
server = TCPServer.open(12345)
loop {
Thread.start(server.accept) do |client|
client.puts(Time.now.ctime)
client.puts "Closing the connection. Bye!"
client.close
end
}
動作確認は nc を使いましょう
- nc 127.0.0.1 12345
curl だと curl: (1) Received HTTP/0.9 when not allowed
になる可能性があります
UDP サーバ
こちらは通信保証なしです
かなり簡単に書けます
require 'socket'
Socket.udp_server_loop(12345) {|msg, msg_src|
msg_src.reply msg
}
動作確認は nc で -u
オプションを使います
- nc -u 127.0.0.1 12345
UDPSocket を使っても書けます
require 'socket'
u1 = UDPSocket.new
u1.bind("127.0.0.1", 12345)
u2 = UDPSocket.new
u2.connect("127.0.0.1", 12345)
u2.send "uuuu", 0
p u1.recvfrom(10)
おまけ: UNIXソケット
socket ファイルを使って通信します
require 'socket'
Socket.unix_server_loop("/tmp/test.sock") {|sock, client_addrinfo|
Thread.new {
begin
IO.copy_stream(sock, sock)
ensure
sock.close
end
}
}
動作確認は nc で -U
オプションを使います
- nc -U /tmp/test.sock
最後に
他にもいろいろなソケットの作成方法があるのでいろいろなケースに合わせてソケット作成できるはずです
0 件のコメント:
コメントを投稿