0

プロトコル バッファを使用する Python アプリケーションと、プロトコル バッファを使用する Java アプリケーションもあります。私がやりたいことは、メッセージ(シリアライズ後のバイナリ文字列)を標準出力に出力できるようにすることです。この目的のために、Python アプリで次のことを行います。

def printMessage (自己、protobuf_msg):

データ = protobuf_msg.SerializeToString()

sys.stdout.write(データ)

sys.stdout.flush()

デフメイン():

protobuf_msg = create_message()

controller.printMessage(protobuf_msg)

その後、この出力 (python pytonApp | Java javaApp) をパイプし、このデータを javaApp で取得して解析したいと考えています。Protobuf API を使用して、次の 2 つのオプションを試しました。

protected ProtobufMsg receiveMsg() は例外をスローします{

ProtobufMsg メッセージ = null;

メッセージ = protobuf_msg.parseFrom(System.in);

メッセージを返します。

}

また、次の方法で BufferedInputStream を使用してこれを実行しようとしました。

protected ProtobufMsg receiveMsg() は例外をスローします{

ProtobufMsg メッセージ = null;

byte[] data = receiveFromStd();

メッセージ = protobuf_msg.parseFrom(データ);

メッセージを返します。

}

public byte[] receiveFromStd() throws Exception{

BufferedInputStream 入力 = 新しい BufferedInputStream(System.in);

バイト[]アウト=新しいバイト[1024];

int i=0;

System.out.println("Entering While");

while((out[i] = (byte)input.read())!= -1){

    i++;

System.out.println("1 バイト読み取りました");

}

byte[] data_out = new byte[i];

for(int l=0; l<data_out.length; l++){

    data_out[l]=out[l];

}

return data_out;

}

したがって、私が何か間違ったことをしていることは明らかですが、input.read() 内にとどまっているため、何が間違っているのかを理解できません...

編集: 私は戦略を変更することに決めました。今は最初にパケットのサイズを取得し、その後、input.read(byte []) 関数を使用しているため、パケットを取得します...使用しているスクリプトは次のとおりです。

FIFO_FILE=/tmp/named_$$   # unique name ($$ is the PID of the bash process running this script)
mkfifo $FIFO_FILE   
export FIFO_FILE    # export the env variable
ant run &    # start a background process that reads the env variable and reads the fifo
cat > $FIFO_FILE #  reads the standard input and writes to the fifo 
rm $FIFO_FILE

そして、私はこれを次のように呼びます: python pythonApp.py | ./script.

4

2 に答える 2