JavaでChromeネイティブメッセージングメッセージ処理プロトコルを実装する方法 -- java フィールド と chrome-native-messaging フィールド 関連 問題

How to implement chrome native messaging message handling protocol in java












2
vote

問題

日本語

私はJavaでネイティブメッセージングプロトコルを実装しようとしましたが、うまくいきませんでした。
私はその後それを試してみました。

<事前> <コード> private String readMessage() { int length = getInt(getLength()); ByteArrayOutputStream bOut = new ByteArrayOutputStream(); byte[] b = new byte[4]; try { int total; for(int totalRead = 0 ; totalRead < length ; totalRead = totalRead + 4){ System.in.read(b); // make sure bOut.write(b); } } catch (IOException e) { e.printStackTrace(); } String bRes = null; try { bRes = new String(bOut.toByteArray(), "UTF-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return bRes; }

サイズを読み取るために、以下の方法を使用しました:

これは最初の4バイトからintを構築します

<事前> <コード> db.QueryExpr()0

これは最初の4バイトを読み取り、バイト配列

を返します。 <事前> <コード> db.QueryExpr()1

これは「ネイティブメッセージングホストと通信するとエラー」というエラーが発生します。 Javaでこのプロトコルを正しく実装するにはどうすればよいです。
誰かがJava

のための簡単な動作例を提供することができますか
英語

I tried to implement native messaging protocol in java but it didn't work.
I tried it following way.

private String readMessage() {          int length = getInt(getLength());          ByteArrayOutputStream bOut = new ByteArrayOutputStream();         byte[] b = new byte[4];          try {             int total;             for(int totalRead = 0 ; totalRead < length ; totalRead = totalRead + 4){             System.in.read(b); // make sure                 bOut.write(b);             }          } catch (IOException e) {             e.printStackTrace();         }          String bRes = null;         try {             bRes = new String(bOut.toByteArray(), "UTF-8");         } catch (UnsupportedEncodingException e) {             e.printStackTrace();         }          return bRes;      } 

To read size i have used following methods:

This construct the int from first four bytes

    private int getInt(byte[] bytes)     {         return (bytes[3] << 24) & 0xff000000 |                 (bytes[2] << 16) & 0x00ff0000 |                 (bytes[1] << 8) & 0x0000ff00 |                 (bytes[0] << 0) & 0x000000ff;     } 

This reads first four bytes and returns byte array

private byte[] getLength()         {             int length = 0 ;             byte[] bytes = new byte[4];             try             {                  System.in.read(bytes);              } catch (IOException e)             {                e.printStackTrace();             }               return bytes;      } 

This gives "Error when communicating with the native messaging host" error. How can i implement this protocol correctly in java.
Can someone provide simple working example for java

</div
     

回答リスト

3
 
vote

以下の私のアプローチは、Chromeアプリからメッセージを受信して​​メッセージを送り返すJava実装を提供します。私のリトルエンディアンマシンでは機能します。

私はあなたの努力を適切に研究していませんが、うまくいけばこれはあなたの「単純な実施例」の要求に役立ちます。

主なポイント: 通信は標準ストリームとのものです。あなたが知っているように、最初の4バイトを別々に読んで長さを学ぶ(ここで、Lengthbyte):

<事前> <コード> byte[] lengthByte = new byte[4]; int bytesRead = System.in.read(lengthByte,0,4); //Read the message into byte[] c: byte[] c = new byte[text_length]; int lengthAppMessage = System.in.read(c,0,text_length);

アプリに戻るときは、1つの4バイトのメッセージ長を書き込みます。以下に送信されたメッセージであるメッセージ {"m":"hi"} は、メッセージの長さは10です。(<コード> {"m":"hello"} など)

<事前> <コード> int returnedMessageLength = 10; System.out.write((byte) (returnedMessageLength)); System.out.write((byte)0); System.out.write((byte)0); System.out.write((byte)0);

ここで、最後の3行が4バイトに合計するためのパディングです。メッセージ長の前にこれら3行をストリームに置く必要があるかもしれません。

メッセージを追加するときは、<コード> {"...":"..."} 形式が必要です。私達はセクションe.gでメッセージを送ることができます。

<事前> <コード> System.out.append('{'); System.out.append('"'); System.out.append('m'); System.out.append('"'); System.out.append(':'); System.out.append('"'); System.out.append('h'); System.out.append('i'); System.out.append('"'); System.out.append('}');

ポイントは、セクションへのメッセージをセクションに分割し、各セクションを送信することは、Javaフォーマットの問題(単一の外の引用符によって引き起こされます)のJavaフォーマットの問題を別々に回復することです。

早く出るのを避けるために、終わりのない 'ループの中にすべての上記のコードを置きます。 (このコードの実行を確認するには、Googleのネイティブメッセージングページからの例と統合します。)

これは私が使ったのは良いコードではありませんが、偶然やデザインによって、それは私にとってこのようにうまくいきました。

 

My approach below gives a Java implementation that receives a message from a Chrome App and sends a message back. On my little-endian machine it works.

I haven't properly studied your effort but hopefully this will help with your 'simple working example' request.

The main points: Communication is with the standard stream. As you know, read in the first 4 bytes separately to learn the length (here, in to lengthByte):

byte[] lengthByte = new byte[4]; int bytesRead = System.in.read(lengthByte,0,4);  //Read the message into byte[] c: byte[] c = new byte[text_length]; int lengthAppMessage = System.in.read(c,0,text_length); 

When writing back to the app, we write the message length in the 1st 4 bytes. For the message {"m":"hi"}, which is the message I send below, the message length is 10. (For {"m":"hello"} it's 13, etc.)

int returnedMessageLength = 10;  System.out.write((byte) (returnedMessageLength)); System.out.write((byte)0); System.out.write((byte)0); System.out.write((byte)0); 

Where the last three lines are padding to sum to 4 bytes. You may need to put these three lines in to the stream before the message length.

When appending the message, the {"...":"..."} format is needed. We can send the message through in sections e.g.

System.out.append('{'); System.out.append('"'); System.out.append('m'); System.out.append('"'); System.out.append(':'); System.out.append('"'); System.out.append('h'); System.out.append('i'); System.out.append('"'); System.out.append('}');   

The point is that breaking the message in to sections and sending each section separately circumnavigates the Java formatting problem (caused by the single outer quotes.)

Put all of the above code inside a never-ending 'while' loop to avoid exiting too soon. (To see this code running, I integrated it with the example from Google's native messaging page.)

This is not good code that I've used, but either by accident or design, it worked this way for me.

</div
 
 
0
 
vote

下記のコードは私の側でうまく機能します。

<事前> <コード> //Convert length from Bytes to int public static int getInt(byte[] bytes) { return (bytes[3] << 24) & 0xff000000| (bytes[2] << 16)& 0x00ff0000| (bytes[1] << 8) & 0x0000ff00| (bytes[0] << 0) & 0x000000ff; } // Read an input from Chrome Extension static public String receiveMessage(){ byte[] b = new byte[4]; try{ System.in.read(b); int size = getInt(b); byte[] msg = new byte[size]; System.in.read(msg); // make sure to get message as UTF-8 format String msgStr = new String(msg, "UTF-8"); return msgStr; }catch (IOException e){ e.printStackTrace(); return null; } }
 

The below codes works well on my side.

//Convert length from Bytes to int     public static int getInt(byte[] bytes) {         return (bytes[3] << 24) & 0xff000000|                 (bytes[2] << 16)& 0x00ff0000|                 (bytes[1] << 8) & 0x0000ff00|                 (bytes[0] << 0) & 0x000000ff;     }   // Read an input from Chrome Extension static public String receiveMessage(){      byte[] b = new byte[4];      try{         System.in.read(b);         int size = getInt(b);          byte[] msg = new byte[size];         System.in.read(msg);          // make sure to get message as UTF-8 format         String msgStr = new String(msg, "UTF-8");          return msgStr;      }catch (IOException e){         e.printStackTrace();         return null;     }  } 
</div
 
 

関連する質問

1  PythonでのChromeネイティブメッセージング  ( Chrome native messaging in python ) 
私はPythonでChromeアプリでネイティブメッセージングを実装しようとしていますが、Tkinterを使用せずに([公式例]で使用) 1 だから私の質問は、Chrome JSアプリを端末で実行されているPythonスクリプトに接続することは可能ですか?...

0  ネイティブアプリケーション(ADIIRC、IRCクライアント)からChrome Extensionにデータを渡す方法は?  ( How to pass data from an native application adiirc an irc client to my chrome ) 
Windows 10でChrome 79とNodeJS 13を使用します。 IRCクライアント、ADIIRCを使用して、IRCチャネルに接続します。このプログラムは、そのスクリプト言語を介して引数を持つ外部プログラムを呼び出すことができます( を実行する ...

0  ネイティブメッセージングAPIエラー:指定されたネイティブメッセージングホストが見つかりません  ( Native messaging api error specified native messaging host not found ) 
Google Chromeを渡すメッセージを含むOS X用のObjective-Cアプリを開発しています。私は例に従った後、ここにサンプルをダウンロードしました。ただし、拡張子をアプリに接続することはできません。マニフェストファイル内の私のアプリへのパスは、...

1  Chrome Native Messaging - 「指定されたネイティブメッセージングホストが見つかりません」エラーを受信して​​いるのはなぜですか?  ( Chrome native messaging why am i receiving a specified native messaging host ) 
Chrome Native Messaging Docsによると、connectnation()へのコールが成功したポートを返します。これで、ネイティブアプリケーション(Macアプリ)にメッセージを投稿できます。私の場合、NativeConnect()は私の...

3  何がChromeの拡張機能でconnectNative()とネイティブホストアプリケーションに接続するとき、「ネイティブアプリへの接続エラー」を引き起こしていますか?  ( What is causing an error connecting to native app when connecting to a native ) 
私は、Chromeのネイティブメッセージング機能を使用してWebページとMacのアプリケーション間の通信を実現しています。 :すべての私は、コンソールに次のエラーが生成さchrome.runtime.connectNativeにjavascriptのコール(「...

0  ネイティブメッセージングホストChromeトークン署名  ( Native messaging host chrome token signing ) 
ネイティブのメッセージングホストクロームトークン署名と通信する拡張子を作成しようとしています( https://github.com/open-eid/chrome-token-signing ) 拡張子がインストールされていますが、EXEは開始されていません...

5  Native HostがChromeブラウザの拡張子のエラーを修正する方法 - ネイティブメッセージング  ( How to fix native host has exited error in chrome browser extension native me ) 
Mac用のChromeブラウザ拡張機能に「ネイティブホストが終了しました」というエラーを修正する方法ここでのドキュメントネイティブメッセージングこのエラーに具体的には、このエラーに具体的に説明し、おそらく原因を示唆していますが、それは非常に一般的に述べられて...

0  SecureInput MS Edge Extensionのネイティブメッセージングサンプルの展開  ( Problems deploying secureinput ms edge extension native messaging sample ) 
MS Edge Browser ExtensionsのNativeMessaging機能を示すSecureInput拡張サンプルを試してみて、vs Community Edition 2017を使用して作成後に拡張機能を展開する問題を実行しています。私はUn...

1  キャッチされていないTypeError:ネイティブメッセージングアプリでメソッド 'connectnative'を呼び出すことができません  ( Uncaught typeerror cannot call method connectnative in native messaging app ) 
私はネイティブメッセージングアプリケーションに取り組んでいます.i後のファイルを作成しました 1.C ++コポレアプリ 2.jsファイル マニフェットファイル このようなレジストリエントリを作成しました 今度は port = chrome.runtime....

0  Chromeがユーザーによって閉じられたときのネイティブホストを閉じる  ( Close native host when chrome is closed by the user ) 
C ++ネイティブホストを使用するChrome拡張機能に取り組んでいます。 chrome.onstartupイベントを使用して、background.jsスクリプト(falseに設定されている)で、C ++ホストへの接続を作成します。 私はユーザーがChr...




© 2022 cndgn.com All Rights Reserved. Q&Aハウス 全著作権所有