2016-04-14 7 views
0

Ich plane, nodejs als Client und php als Server zu verwenden. Ich benutze die offizielle tutorial.thrift.Sparsamkeit Knotenjs Client und PHP-Server arbeitet zusammen?

stellte ich einen nginx-Server, um die localhost:9099 mit dir /path/to/my/tutorial/, erzeugen einen Server-Skript als index.php zu hosten und es in der Wurzel zu platzieren, wenn die localhost:9099 besuchen, so dass der Client den Server über index.php besuchen. der index.php Inhalt:

<?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(); 

der client.node.js Inhalt:

/** 
* 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(); 
    }); 
}); 

Der client.php Inhalt:

<?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"; 
} 

Sie als Original fast gleich sind.

  1. wenn ich client.php den Host besuchen, funktioniert es gut.
  2. wenn ich client.node.js benutze den Host besuchen, funktioniert es nicht.
  3. wenn ich versuche, einen Knoten-Server zu verwenden, nicht den Host, besuchen sie die client.php verwenden, ich habe $socket = new THttpClient('localhost', 9099) zu $socket = new TSocket('localhost', 9099) ändern es funktioniert.
  4. client.node.js nie berührt localhost:9099, und ohne jeden Standard.
+0

Dank @JensG zum Entfernen von unnützen Worte ~ –

+0

Das auf SO eine allgemeine Politik ist (und SE im Allgemeinen). Persönliche Hilferufe und Grüße stimmen nicht sehr gut mit dem beabsichtigten Q & A-Format überein. Es geht also nicht um dich persönlich. – JensG

Antwort

1

Endlich half mir mein Partner die Antwort zu finden.

die offizielle Demo von NodeJS zient hat einige Probleme:

offiziellen Code:

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

unseren Code:

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

die () entfernen, die den Code Arbeit macht.

+0

Großartig - bitte denken Sie daran, eine [Patch oder Pull-Anfrage!] (Https://trift.apache.org/docs/HowToContribute) zu liefern – JensG

0

[hbase-dir] /bin/hbase-daemon.sh thrift starten -f

ich denselben Fehler bin vor. Siehe http://dailyjs.com/post/hbase TFRamedTransport ist standardmäßig deaktiviert. Sie müssen es aktivieren, indem Sie den obigen Befehl verwenden. Hinweis: Nach der Aktivierung können Sie keine Verbindung zu PHP herstellen. Ich verwende verschiedene Protokolle für die in PHP

prüfen Sie: NodeJS Hbase thrift weirdness