TCPSocket соединение сбрасывается одноранговым - PullRequest
0 голосов
/ 15 ноября 2018
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

Любая помощь очень ценится. Спасибо!

1 Ответ

0 голосов
/ 15 ноября 2018

Во-первых, вы должны заменить строку '443' на целое число:

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

В любом случае, похоже, что это связано с обсуждением SSL: следующий пост Stackoverflow дает краткое представление о том, что будет работать: Как установить соединение TCP / IP с включенным SSL в Ruby . Используя этот метод, я работаю.

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"

Работа с защищенным соединением SSL / TLS иногда довольно многословна с Ruby. В приведенном вами примере в NodeJS подсказка является первой строкой:

var tls = require('tls');
...