今天稍微研究了一下,試著寫出 Ruby 版本的 Echo Server/Client,但目前只能一對一的連著,要等前一個 Client 斷線了,下一個 Client 再連才不會異常。若要能一對多,可能得在 Server 端加入 multi-thread 的機制。
對我來說比較奇怪的地方,是 eof 的行為,若 Client 端不正常關閉(就是直接把 console 關掉),則 eof 指令也會出錯,所以最後才用 begin / rescue 來處理,錯誤訊息如下:
可能要先用某個指令檢查連線是否正常,而不能直接用 eof 來問狀況,有空再來更深入的研究看看。
底下程式碼是包含 begin / rescue 可正常運行的版本:
程式碼
require 'socket'
def disconnect(socket)
dummy, port, ip = socket.peeraddr
socket.close()
puts "Close #{socket} from #{ip} port #{port}"
end
def listen(server, socket = nil)
client = server.accept()
dummy, port, ip = client.peeraddr
puts "Accept #{client} from #{ip} port #{port}"
return client, ip, port
end
server = TCPServer.new('', 5555)
client, ip, port = listen(server)
loop do
begin
eof = client.eof?
rescue
disconnect(client)
client, ip, port = listen(server)
else
if eof
disconnect(client)
client, ip, port = listen(server)
else
line = client.readline().chomp()
puts "#{ip} #{port}:#{line}"
client.puts(line)
end
end
end
require 'socket'
client = TCPSocket.new('127.0.0.1', 5555)
while true
print "Input? "
client.puts(gets)
line = client.readline().chomp()
puts "Echo back:#{line}"
end
還可以研究看看…
- 追蹤 eof 的錯誤。
- 使用 multi-thread 讓 Server 可接收多個連線。
- 可將傳入的訊息廣播給所有連線著的 Client。
沒有留言:
張貼留言