2011年8月30日 星期二

Ruby 的 Simple Echo Server/Client

image 

今天稍微研究了一下,試著寫出 Ruby 版本的 Echo Server/Client,但目前只能一對一的連著,要等前一個 Client 斷線了,下一個 Client 再連才不會異常。若要能一對多,可能得在 Server 端加入 multi-thread 的機制。

對我來說比較奇怪的地方,是 eof 的行為,若 Client 端不正常關閉(就是直接把 console 關掉),則 eof 指令也會出錯,所以最後才用 begin / rescue 來處理,錯誤訊息如下:

image

可能要先用某個指令檢查連線是否正常,而不能直接用 eof 來問狀況,有空再來更深入的研究看看。

 

底下程式碼是包含 begin / rescue 可正常運行的版本:

程式碼

下載 echoServer.rb

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

 

下載 echoClient.rb

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。

沒有留言:

張貼留言