2009-09-21 71 views
0

我正在創建一個連接到TCP客戶端的ruby服務器。我的服務器正在使用一個TCPServer,我試圖使用TCPServer :: recv(),但它不會等待數據,所以只是在緊密的循環中繼續,直到收到數據。什麼是從TCPServer讀取最有效的方式?

什麼是處理間歇數據的最有效方法?我無法更改正在發送的數據,因爲我試圖模擬另一臺服務器。從TCPServer/TCPSocket那裏讀取的語句會等待數據發送?

 

    require "socket" 
    dts = TCPServer.new('localhost', 20000) 
    s = dts.accept 
    print(s, " is accepted\n") 
    loopCount = 0; 
    loop do 
     Thread.start(s) do 
     loopCount = loopCount + 1 
     lineRcvd = s.recv(1024) 
     if (!lineRcvd.empty?) 
      puts("#{loopCount} Received: #{lineRcvd}") 
      s.write(Time.now) 
     end 
     end 
    end 
    s.close 
    print(s, " is gone\n") 
 

感謝您的時間。

回答

0

你確定recv沒有返回「」 - 表示套接字已關閉嗎? 如果沒有,那麼也許你的套接字被設置爲非阻塞?

EventMachine的的確遠比使用套接字編程:) GL線程更快。 -r

+0

我會檢查選項以確保我設置爲阻止。我知道的連接沒有關閉,因爲我在收到一些空的lineRcvd字符串後得到了一些響應。 – Superpolock 2009-09-22 18:32:52

+0

所以這實際上是正確的答案? – Jim 2010-03-11 10:13:12

0

根據您一直在問的問題,我想你應該嘗試像EventMachine的框架,寫一個服務器實現你想要的,而不是試圖大驚小怪周圍寫一個服務器包裝的東西。

話雖這麼說,從套接字讀取的最有效的方法是使用一個適當的選擇調用和查詢所有打開的連接。雖然這對於之前開發客戶端 - 服務器應用程序的任何人來說都是相當學術的東西,但這是一件令人討厭的事情,因爲有很多事情很容易出錯。例如。處理多個連接可能會導致各種麻煩的情況,如果你不特別小心避免阻止呼叫。

EventMachine框架使開發查詢/響應類型服務器變得很容易,因爲您始終可以從一個模板開始並從那裏開始工作,例如,內置的EventMachine :: Protocols :: LineAndTextProtocol作爲一個偉大的工具最基礎的。

相關問題