プロトコル バッファを使用する 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
.