【问题标题】:Ruby TCPSocket request not getting responseRuby TCPSocket 请求没有得到响应
【发布时间】:2015-10-19 11:26:57
【问题描述】:

我一直在TutorialsPoint 阅读有关 TCPSockets 的信息,我需要一个简单的客户端来发出请求,但我不明白为什么没有响应。

网站 API 登录

login 命令接受 JSON 对象作为参数,后跟 EOT 字符作为响应。

来自网站的 API

这就是我所拥有的

def connect
    url = "someurl.com"
    port = 19534 
    loginRequest = 'login {"protocol":1,"client":"testruby","clientver":0.1}' +"\04"

    s = TCPSocket.open(url,port)

    s.puts(loginRequest)
    while line = s.gets
        puts line.chop
    end
puts "end"
s.close
end
connect

我的尝试

1) 我在终端中运行 ruby​​ 代码,但我与服务器的连接立即关闭。

我完全一无所知,希望能得到一些关于这方面的指导。

【问题讨论】:

  • 在您指定的域和端口上是否有正在运行的服务器?
  • 根据vndb.org/d11,指定的端口是19534,是的,服务器正在域上运行。
  • 它位于如上vndb.org/d11的链接中
  • 它们是可选的,由文档指定
  • 尝试使用 socket read 而不是 socket gets ,像这样:socket = TCPSocket.open(host,port) # socket.print(request) response = socket.read

标签: ruby sockets tcpsocket


【解决方案1】:

似乎服务器正在使用原始 TCP/IP,使用 0x04 字符表示“消息结束”。

您的代码似乎更喜欢阻塞 IO(尽管它可能不是我的首选),所以请允许我建议调整阻塞 API:

require 'socket'

module VNDB
   public

   def send_message message
      raise "Not connected" unless @s
      @s.write (message + "\x04")
   end

   def get_message
      raise "Not connected" unless @s
      message = ''
      message << @s.getc until message[-1] == "\x04"
      message
   end

   def connect
       url = "someurl.com"
       port = 19534 
       loginRequest = 'login {"protocol":1,"client":"testruby","clientver":0.1}' +"\04"

       @s = TCPSocket.open(url,port)

       send_message loginRequest
       puts get_message
       puts "end"
       @s.close
       @s = nil
   end
   extend self
end

VNDB.connect

附言

  1. 我无法测试代码,因为“someurl.com”并不是真正的地址,我猜。

  2. 数据库服务器未使用 Websockets(这是协议的名称),因此请考虑编辑您的问题并删除该标签。

【讨论】: