2016-08-24 60 views
0

我有從最近紅寶石項目以下(簡化的)代碼用於讀取和寫入的數據流:節點JS TLS雙工流

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飼料,但我不能得到我的頭。

我認爲我需要一個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_readablereadableend前右發射和數據在這種情況下null。提供公司不能協助這個話題,只有他們知道原因。我需要幫助才能像在Ruby代碼片段中那樣工作。

任何幫助表示讚賞。

+0

您確定要發送的請求有效嗎?你不需要某種「請求結束」標記(例如CR和/或LF)嗎?您是否立即收到「可讀」事件,或者延遲後?您是否嘗試過使用'openssl s_client'手動發送相同的請求? – jcaron

+0

@jcaron這是完全相同的請求,像在紅寶石片段。我在ruby代碼片段中使用了xmlbuilder,但xmlstring也適用。剛剛檢查出來。可讀的事件發生在短暫的延遲(1-2秒)之後。手動發送它的作品。 – user1261284

+0

'echo -e「」| openssl s_client -connect some.url.com:1234 -ign_eof'只是馬上開始。 – user1261284

回答

1

通過討論在評論中發現:

  • 的問題是,服務器需要一個分隔符找到發送請求的結束和開始處理它。

  • 在發送請求結束時添加一個\n可解決問題。