首页 > 解决方案 > 对等方重置 TCPSocket 连接

问题描述

require 'socket'
socket = TCPSocket.open('stream-api.betfair.com', '443') 
while line = socket.gets
  puts line.chop
end
socket.close

我应该收到类似的东西{"op":"connection","connectionId":"002-230915140112-174"}

但我收到Connection reset by peer哪个

意味着远程端将发送一个重置数据包(RST)来终止连接,而无需有序关闭(关闭)。在这种情况下,您知道它是对等方(客户端)。

betfair 包含一个 nodejs 示例csharp/java 示例

任何帮助深表感谢。谢谢!

标签: rubyssltcpwebsocketbetfair

解决方案


首先,您应该将字符串 '443' 替换为整数:

TCPSocket.open('stream-api.betfair.com', 443)

无论如何,它似乎与 SSL 协商有关:下面的 Stackoverflow 帖子快速了解了什么会起作用:如何在 Ruby 中建立启用 SSL 的 TCP/IP 连接。使用这种方法,我工作。

require 'socket'
require 'openssl'

host = 'stream-api.betfair.com'
port = 443

socket = TCPSocket.open(host,port)
ssl_context = OpenSSL::SSL::SSLContext.new()
ssl_context.ssl_version = :SSLv23
ssl_socket = OpenSSL::SSL::SSLSocket.new(socket, ssl_context)
ssl_socket.sync_close = true
ssl_socket.connect
while line = ssl_socket.gets
  p line
end
ssl_socket.close

结果 :

"{\"op\":\"connection\",\"connectionId\":\"001-151118094105-259478\"}\r\n"

使用 Ruby 处理受 SSL/TLS 保护的连接有时非常冗长。在您给出的示例中,在 NodeJS 中,提示是第一行:

var tls = require('tls');

推荐阅读