节点js TLS双工流

时间:2016-08-24 09:15:11

标签: node.js stream tls1.2

我有一个最近的ruby项目中的以下(简化)代码,用于可读和可写的流:

class StreamReader
  require 'socket'
  require 'openssl'
  OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE
  def initialize
    tcp_client = TCPSocket.new ENV['URL'], ENV['PORT']
    context = OpenSSL::SSL::SSLContext.new
    context.ssl_version = :TLSv1_2
    context.verify_mode = OpenSSL::SSL::VERIFY_PEER
    cert_store = OpenSSL::X509::Store.new
    cert_store.set_default_paths
    context.cert_store = cert_store
    @stream_client = OpenSSL::SSL::SSLSocket.new tcp_client, context
    @stream_client.connect
    @requester = StreamRequester.new
  end

  def open_stream
    login = @requester.create_login_request
    @stream_client.puts login
    loop  do
      line = @live_client.gets
      puts line.strip if !line.strip.empty? 
    end
  end
end

所以我可以跑:

stream = StreamReader.new
stream.open_stream

并打印出数据。

现在我正在尝试使用nodejs 6.4.0打开Feed,但我无法理解它。

我认为我需要net.Socket,然后将其传递给tls.TLSSocket,这将返回双工流。但我无法弄清楚如何设置它。 TLS建立在OpenSSL之上,因此它应该能够做同样的事情。

到目前为止我的设置:

var net = require('net');
var tls = require('tls');
var HOST = 'some.url.com';
var PORT = 1234;

var loginRequest = "<Request type='login' user='user' password='pass'></Request>"

//create net.Socket
var socket = new net.Socket();
socket.connect({port: PORT, host: HOST})

var tlsSocket = new tls.TLSSocket(socket,{requestCert:false})
tlsSocket.setEncoding("UTF-8")
//Listen for connect
socket.on("connect",function(){
    console.log("connected to",HOST)
    tlsSocket.write(loginRequest,function (){
        console.log("request sent")
    })
})
tlsSocket.on("error",function(err){
    console.log("ERROR:",err)
})

tlsSocket.on("close",function(){
    console.log("CLOSING")
})

tlsSocket.on("end",function(){
    console.log("END")
})

tlsSocket.on("data",function(data){
    console.log("DATA:",data)
})

tlsSocket.on("readable",function(){
    console.log("SOMETHING TO READ")
    console.log(tlsSocket.read())
})

打印

connected to some.url.com
request sent
SOMETHING TO READ
null
END
CLOSING

正如https://nodejs.org/dist/latest-v6.x/docs/api/stream.html#stream_event_readable readable中所述,在end之前发出,在这种情况下数据为null。提供公司无法协助该主题,只有他们知道原因。我需要帮助才能让它像ruby片段一样工作。

任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:2)

通过评论中的讨论发现:

  • 问题是服务器需要一个分隔符来查找发送请求的结尾并开始处理它。

  • 在发送的请求结尾处添加\n可解决此问题。