2009-09-21 53 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作为一个伟大的工具最基础的。

相关问题