2016-04-14 8 views
0

私はクライアントとしてnodejsを使用し、サーバーとしてphpを使用する予定です。私は公式tutorial.thriftを使用します。倹約nodejsクライアントとPHPサーバは一緒に動作しますか?

私はindex.phpのように、サーバースクリプトを生成し、クライアントがindex.phpを介してサーバーを訪問するように、localhost:9099を訪問したときに、ルートに置き、DIR /path/to/my/tutorial/localhost:9099をホストするためにnginxのサーバーを設定します。 index.php内容:

<?php 

error_reporting(E_ALL); 

require_once __DIR__ . "/Thrift/ClassLoader/ThriftClassLoader.php"; 
use Thrift\ClassLoader\ThriftClassLoader; 

$ROOT = realpath(dirname(__FILE__)); 
$GEN_DIR = $ROOT.'/gen-php'; 

$loader = new ThriftClassLoader(); 
$loader->registerNamespace('Thrift', $ROOT); 
$loader->registerNamespace('Swoole', $ROOT); 
$loader->registerNamespace('tutorial', $GEN_DIR); 
$loader->registerDefinition('shared', $GEN_DIR); 
$loader->registerDefinition('tutorial', $GEN_DIR); 
$loader->register(); 

if (php_sapi_name() == 'cli') { 
    ini_set("display_errors", "stderr"); 
} 

use Thrift\Protocol\TBinaryProtocol; 
use Thrift\Transport\TPhpStream; 
use Thrift\Transport\TBufferedTransport; 
use Thrift\Server\TServer; 

header('Content-Type', 'application/x-thrift'); 
if (php_sapi_name() == 'cli') { 
    echo "\r\n"; 
} 

$handler = new \tutorial\Handler(); 
$processor = new \tutorial\CalculatorProcessor($handler); 

$transport = new TBufferedTransport(new TPhpStream(TPhpStream::MODE_R | TPhpStream::MODE_W)); 
$protocol = new TBinaryProtocol($transport, true, true); 

$transport->open(); 
$processor->process($protocol, $protocol); 
$transport->close(); 

client.node.js内容:

/** 
* Created by Kron on 16/4/12. 
*/ 
var thrift = require('thrift'); 
var ThriftTransports = require('thrift/transport'); 
var ThriftProtocols = require('thrift/protocol'); 
var Calculator = require('../gen-nodejs/Calculator'); 
var ttypes = require('../gen-nodejs/tutorial_types'); 

transport = ThriftTransports.TBufferedTransport(); 
protocol = ThriftProtocols.TBinaryProtocol(); 


var connection = thrift.createConnection("localhost", 9099, { 
    transport : transport, 
    protocol : protocol 
}); 

var client = thrift.createClient(Calculator, connection); 


connection.on('error', function(err) { 
    console.log(err); 
    //assert(false, err); 
}); 

// Create a Calculator client with the connection 

client.ping(function(err, response) { 
    console.log('ping()'); 
}); 

client.add(1,1, function(err, response) { 
    console.log("1+1=" + response); 
}); 

work = new ttypes.Work(); 
work.op = ttypes.Operation.DIVIDE; 
work.num1 = 1; 
work.num2 = 0; 

client.calculate(1, work, function(err, message) { 
    if (err) { 
     console.log("InvalidOperation " + err); 
    } else { 
     console.log('Whoa? You know how to divide by zero?'); 
    } 
}); 

work.op = ttypes.Operation.SUBTRACT; 
work.num1 = 15; 
work.num2 = 10; 

client.calculate(1, work, function(err, message) { 
    console.log('15-10=' + message); 

    client.getStruct(1, function(err, message){ 
     console.log('Check log: ' + message.value); 

     //close the connection once we're done 
     connection.end(); 
    }); 
}); 

client.php内容:

<?php 

error_reporting(E_ALL); 

require_once __DIR__ . "/../Thrift/ClassLoader/ThriftClassLoader.php"; 
use Thrift\ClassLoader\ThriftClassLoader; 

$ROOT = realpath(dirname(__FILE__).'/../'); 
$GEN_DIR = $ROOT.'/gen-php'; 

$loader = new ThriftClassLoader(); 
$loader->registerNamespace('Thrift', $ROOT); 
$loader->registerNamespace('Swoole', $ROOT); 
$loader->registerNamespace('tutorial', $GEN_DIR); 
$loader->registerDefinition('shared', $GEN_DIR); 
$loader->registerDefinition('tutorial', $GEN_DIR); 
$loader->register(); 

use Thrift\Protocol\TBinaryProtocol; 
use Thrift\Transport\TSocket; 
use Thrift\Transport\THttpClient; 
use Thrift\Transport\TBufferedTransport; 
use Thrift\Exception\TException; 

try { 
    if (array_search('--http', $argv)) { 
     $socket = new THttpClient('localhost', 9099, '/clients_servers/tutorial.server.php'); 
    } else { 
     $socket = new THttpClient('localhost', 9099); // 8080 for node server, 9099 for php server 
    } 

    $transport = new TBufferedTransport($socket, 1024, 1024); 
    $protocol = new TBinaryProtocol($transport); 
    $client = new \tutorial\CalculatorClient($protocol); 

    $transport->open(); 

    $client->ping(); 
    print "ping()\n"; 

    $sum = $client->add(1,1); 
    print "1+1=$sum\n"; 

    $work = new \tutorial\Work(); 

    $work->op = \tutorial\Operation::DIVIDE; 
    $work->num1 = 1; 
    $work->num2 = 0; 

    try { 
     $client->calculate(1, $work); 
     print "Whoa! We can divide by zero?\n"; 
    } catch (\tutorial\InvalidOperation $io) { 
     print "InvalidOperation: $io->why\n"; 
    } 

    $work->op = \tutorial\Operation::SUBTRACT; 
    $work->num1 = 15; 
    $work->num2 = 10; 
    $diff = $client->calculate(1, $work); 
    print "15-10=$diff\n"; 

    $log = $client->getStruct(1); 
    print "Log: $log->value\n"; 

    $transport->close(); 

} catch (TException $tx) { 
    print 'TException: '.$tx->getMessage()."\n"; 
} 

彼らは、ほぼオリジナルと同じです。

  1. 私がclient.phpを使用すると、ホストにアクセスするとうまくいきます。
  2. 私がclient.node.jsを訪問すると、それは動作しません。
  3. 私はノードサーバーを使用しようと、ないホスト、それはclient.phpを使用訪れ、私はそれを動作させるために$socket = new TSocket('localhost', 9099)$socket = new THttpClient('localhost', 9099)を変更する必要があります。
  4. client.node.jsは、localhost:9099には一度も触れず、標準出力もありませんでした。
+0

おかげ@JensG役に立たない単語を除去するために〜 –

+0

:私はPHPで、そのために、この

チェックを異なるプロトコルを使用しています。個人的な助けの叫び声と挨拶は、意図したQ&Aのフォーマットとよく一致しません。それは個人的なことではありません。 – JensG

答えて

1

最後に、私のパートナーは私に答えを見つけ出しました。

公式コード:

transport = ThriftTransports.TFramedTransport(); 
protocol = ThriftProtocols.TBinaryProtocol(); 

我々のコード:

transport = ThriftTransports.TFramedTransport; 
protocol = ThriftProtocols.TBinaryProtocol; 

は、コードの作業を行い()を、削除

nodejsのcientの公式デモは、いくつかの問題があります。

+0

素晴らしい - [パッチまたはプルリクエスト]を提供することを検討してください(https://thrift.apache.org/docs/HowToContribute) – JensG

0

[HBaseの-DIR] /bin/hbase-daemon.sh

私は同じエラーが直面しています-f倹約を開始します。参照http://dailyjs.com/post/hbase TFramedTransportは、デフォルトでは無効です。上記のコマンドを使用して有効にする必要があります。 注:有効にした後、あなたはphpに接続できません。 (一般的には及びSE)SO上の一般的なポリシーだ NodeJS Hbase thrift weirdness

関連する問題