私はサーバーに送信する必要がある整数と文字列を含む2D動的配列を持っています。配列は100,000列で構成されています。 1つの可能性は、配列をファイルにコピーしてサーバーに送信することです。サーバーはそれを解析できます。一方、もう1つの可能性はシリアル化を行うことです。私は初めてソケットプログラミングを行い、探しているソリューションは最適でなければなりません。配列のサイズを考えると、各要素をバイトに変換すると良いとは思いません。どのように進めていくべきか、私にはほんの少しのヒントを与えたり、私を導くことができますか?ソケットを介してJavaのサーバーに2D配列を送信する方法
答えて
ソケットを介してストリーミングするためのデータをシリアライズするか、データをファイルにシリアル化して送信することは、基本的に同じことです。ファイルをシリアライズすると、FTPのような確立されたプロトコルに後戻りすることができます。これは、ソケットを初めて使用する開発者にとってはより簡単です。
しかし、やはり本質的に同じ問題だと思います。プログラムストリームオブジェクトをバイトに分解して出力ストリームに書き込みます。
編集
:ZIP圧縮アルゴリズムを使用して、文字列の内容に応じて、は良い賭けです。あなたのストリングに反復される内容が多いほど、より良い圧縮率が得られます。ファイルフォーマットの例を次に示します。
- (あなたが2D配列の中で最大のROWSを与えていないので、何バイトがかかるかは言えませんが、その8バイトと仮定します)
- すべてints。これには3 * NUM_INTSバイトかかります。
- スペースで区切られたZip圧縮文字列。
あなたの質問や回答に十分な説明がないため、私はここで多くの仮定をしています。
私はそれをjsonまたはxmlに変換して送信します。スピードの点で最も効率的なソリューションではありませんが、最もポータブルです。
CSVも良いです。 –
これは良い提案のようです...それについて考えてみましょう – Shahzaib
簡単な方法はDataOutputStream
を使用して、使用しているソケットの周りに包むことです:DataOutputStream dOut = new DataOutputStream(socket.getOuputStream())
。
あなたはその後、ちょうどこのような独自のシンプルなバイナリプロトコル(これは1次元配列のためだが、簡単にだけでなく、2Dアレイで動作するように拡張することができます)確立することができる:あなたが最適化したい場合は
//first write the amount of elements in the array
dOut.write(array.length());
//now write every element
for (Object obj : array) {
if (obj instanceof Integer) {
dOut.writeByte(0); //0 = Integer
dOut.writeInt((Integer) obj);
} else
if (obj instanceof String) {
dOut.writeByte(1); //1 = String
dOut.writeUTF((String) obj); //UTF-8 encoded String
}
// ...
}
をデータサイズの場合は、ソケットのOutputStream
とDataOutputStream
の間にGZIPOutputStream
を使用すると、new DataOutputStream(new GZIPOutputStream(socket.getOutputStream()))
のようになります。もちろん、これを動作させるにはサーバー側で解凍する必要があります。
基本的には、配列の各要素を解析し、それをサーバーに書き出します。これはあまりにも多くのネットワークトラフィックをもたらすことはありませんか?換言すれば、スピードは低下する。 – Shahzaib
これは基本的にはシリアライゼーションプロトコルの機能です。どのような種類のオブジェクトであるかを解析し、各要素を後で区別するためにバイトを無駄にすることを除いて、これは最適です。速度とデータ量を減らしたいのであれば、オブジェクトを分離して別々の配列に入れることをお勧めします。つまり、Integerはint配列になり、StringsはString配列になります。 – Entrusc
また、GZIP圧縮は、トラフィックの一部を形にします(もちろん、パフォーマンスと引き換えに)。特に、配列内で近接して等しいオブジェクトがたくさんある場合は特にそうです。 – Entrusc
- 1. ソケットを介してjSON配列の長さを送信する(Java to Python)
- 2. Javaソケットで配列を送信する
- 3. ソケットを介してnumpy配列を送信
- 4. ソケットを介してC#からノードsocket.ioサーバーにデータを送信
- 5. "ソケットを介して写真とコマンドを送信する方法"
- 6. ソケットを介してデータファイルを送受信する方法は?
- 7. ソケットC++サーバー/ Javaクライアント経由でintを送信する方法
- 8. ソケットを介してファイルを送信
- 9. Tcpソケットを介してファイルサイズを送信
- 10. ソケットを介してオブジェクトを送信
- 11. Javaのソケットを介して(パラレル)ストリームを送信
- 12. Javaのソケットを介してオブジェクトを送信
- 13. サーバーがソケットを介してデータを送信していますが、クライアントが受信していません(Java)
- 14. Javaは、ソケットを介してスクリーンショットを送信
- 15. Javaクライアント/サーバ - ソケット接続を介して複数の文字列を送信
- 16. ソケットを介して文字列を送信
- 17. ソケットを介してデータを送信するためのより良い方法
- 18. ソケットを介したオブジェクトの送信
- 19. Javaソケット、サーバーは複数のクライアントにメッセージを送信します
- 20. ソケットを介して同時にデータを送受信します。
- 21. ApacheサーバーにHttpPost配列を送信する方法
- 22. ソケット送信(2) - サーバーからクライアントにエラーメッセージを送信する方法
- 23. ソケットを介してデータを送信するためのフォーマット
- 24. 複数のオブジェクトを同じサーバーに送信するJavaソケット
- 25. Javaでソケットを介したファイル転送
- 26. CMessageを介して配列を送信する - OMNET ++
- 27. ソケットを介してデータを送受信するpython3
- 28. Pythonがソケットを介してファイルを送信する
- 29. ソケットを介してファイルを送信するQT
- 30. ソケットを介してJavaクライアントからCサーバに複合オブジェクトを送信
どのような方法で最適な "最適なはずですか?速度?セキュリティ?信頼性?何か試しましたか?それが立てば、問題は広すぎます! – Burkhard
速度に関して – Shahzaib
ネットワークの速度と品質によっては、ストリームを圧縮すると便利です。もう一度、いくつかの詳細を追加してください! – Burkhard