2016-08-24 4 views
0

私は読み書き可能なストリームの最近のRubyプロジェクトから、次の(簡体字)のコードを持っている:だから私は実行することができますノード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の上に構築されているので、同じことができるはずです。

この私のセットアップこれまでのところ:それはhttps://nodejs.org/dist/latest-v6.x/docs/api/stream.html#stream_event_readablereadableで右end前に放出されると、データはこのケースでnullです言うよう

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 

を印刷します。提供会社はその話題を手助けすることはできません。彼らは理由を知っているだけです。私はそれがルビースニペットのように動作するように助けが必要です。

助けてください。コメントでの議論を通じて発見したよう

+0

送信しているリクエストは有効ですか?何らかの「要求終了」マーカー(CRやLFなど)は必要ありませんか?直ちに、または遅れて、「可読」のイベントを受け取りますか?たとえば、 'openssl s_client'を使って"手で "同じリクエストを送信しようとしましたか? – jcaron

+0

@jcaronルビースニペットのような全く同じ要求です。私は、ルビースニペットでxmlbuilderを使用しましたが、xmlstringも同様に動作します。ちょうどそれをチェックアウト。読み取り可能なイベントは、短い遅延(1-2秒)の後に発生します。それを手動で送信する。 – user1261284

+0

'echo -e" <リクエストタイプ= 'ログイン'ユーザ= 'ユーザ'パスワード= 'パス'> "| openssl s_client -connect some.url.com:1234 -ign_eof'はすぐに開始されます。 – user1261284

答えて

1

  • 問題は、サーバーが送信した要求の終わりを見つけ、それを処理を開始する区切り文字を必要としていることです。

  • 送信された要求の最後に\nを追加すると、問題が解決されます。

関連する問題