让我来介绍一下 TCP。 UDP 是一种“将数据包扔到风中”的协议,它不提供任何可靠性。例如,它可用于 IP 语音,其中可以接受奇数丢弃的数据包。通过使用 TCP 套接字,您仍然可以避免使用 HTTP,而且 TCP 堆栈会为您处理重试等。
由inetd 启动的TCP 服务器是世界上最简单的事情:您编写一个程序,从stdin 读取并写入stdout,然后告诉inetd 在某个端口收到请求时运行该程序。您无需编写任何网络代码。
这是一个简单的 inetd tcp 服务器:
#!/usr/bin/ruby1.8
input = gets
puts "You said: #{input}"
下面是告诉 inetd 运行它的方法:
1024 stream tcp nowait wconrad /tmp/tcpserver.rb
这意味着侦听端口 1024 上的 tcp 连接。当它们发生时,以用户 wconrad 启动 /tmp/tcpserver.rb。 man inetd.conf 了解更多信息。
你可以用telnet测试一下:
$ telnet localhost 1024
Trying 127.0.0.1...
Connected to ceres.
Escape character is '^]'.
Howdy!
You said: Howdy!
Connection closed by foreign host.
$
或者你可以使用一个简单的客户端:
$ cat /tmp/tcpclient.rb
#!/usr/bin/ruby1.8
require 'socket'
t = TCPSocket.new('localhost', 1024)
t.puts "Hello"
t.close_write
puts t.read
t.close
$ /tmp/tcpclient.rb
You said: Hello
只是为了表明 Ruby 中的 tcp 服务器很简单:
!/usr/bin/ruby1.8
require 'socket'
def handle_session(socket)
s = socket.gets
socket.puts "You said: #{s}"
socket.close
end
server = TCPServer.new('localhost', 1024)
while (session = server.accept)
Thread.new do
handle_session(session)
end
end
由于 TCP 如此简单,您需要一个令人信服的理由来打扰 UDP。