-1

Linuxでソケットを使用してファイルを送受信する方法のきちんとした説明を探しましたが、少しでも機能する解決策が見つかりません。Linux に C++ サーバーがあり、Java で実行されるクライアントがあります。

次のことを行うために必要です。

  • クライアントはサーバーに向けてテキスト コマンドを送信できる必要があります。
  • クライアントは、サーバーに対してファイルを送受信できる必要があります。
  • ファイルを受信すると、サーバーは次のコマンドを取得します。 PUT < saveLocation > < filecontents >
  • すべて「\n」で閉じます。

私はすでに多くのコードを書いており、クライアントとサーバーの間でコマンドをやり取りすることができます。しかし、今はクライアントとサーバーの両方でファイルの送受信に行き詰まっています。

クライアントから「PUT /map1/test.pdf somefile」というコマンドを受信し、実際のファイルも受信できるようにするには、どのような手順を踏む必要がありますか?

コードが必要な場合は、お尋ねください。投稿しますが、どのコード ブロックが役立つかわかりません。

4

2 に答える 2

1

代わりに FTP サーバーを使用してみませんか? 結局のところ、FTP はまさにこれを行うように設計されました。サーバーに FTP デーモンをセットアップし、Apache commons-netから FTPClient を使用できます。

車輪の再発明に必死になっている場合は、MIME マルチパート アプローチ (HTTP 経由でファイルを投稿するとき、または電子メールの添付ファイルとして送信するときに使用される) は、境界を定義し、バイナリ ファイルの内容を BASE64 エンコードして、次のことができるようにすることです。 ASCII テキストとして送信します。

境界は、一意になるように十分に複雑なテキストの文字列にする必要があります。あなたの「トランザクション」は次のようになります

PUT <filename> boundary=A_COMPLEX_BOUNDARY_STRING<newline>
<BASE64 encoded binary file content>A_COMPLEX_BOUNDARY_STRING

サーバーで受信するときに、ファイル名と境界値を解析すると、最初の改行から境界文字列までのすべてが BASE64 でエンコードされたバイナリ ファイル データであることがわかります。

于 2012-12-21T12:41:22.903 に答える
0

ソケットは情報のバイトを転送するだけです。それらのバイトがファイルからのものなのか、メッセージからのものなのか、ランダムに生成されたものなのかは「わかりません」。受信者が送信されたバイトを解釈できるようにバイトを編成するのは、完全に送受信ソフトウェア次第です。

多くの場合、単純なメッセージの場合、送信者は各メッセージを ASCII (または何らかのエンコーディング) の行末で終了するだけです。ただし、有効なデータとして行末バイトを含む可能性のあるデータには適していません。

最も単純なことは、各メッセージで送信されるバイト数を送信することだと私には思えます。外部の理由がない限り、ファイル全体を 1 つのメッセージで送信しようとはしません。ファイルを「チャンク」に分割します。特定のチャンクのバイト数を最初のバイトとして配置するメッセージを定義し、残りのチャンクを送信し、すべてのチャンクが送信されるまで繰り返します。

受信者は明らかに、バイト数が最初に送信されたものであること、それが何バイトであるか、どのバイト (上位または下位) が最初であるかなどを知る必要があります。受信者は、すべてを読み取るのに十分な情報を持っています。チャンクを元に戻します。

「ハンドシェイク」も含めます。つまり、受信者は、各チャンクの後にメッセージを返し、それを受信したことを示します。そうしないと、何らかの理由で受信者がダウンしていることを発見するためだけに、バイトの送信に多くの時間を費やす可能性があります。

于 2012-12-21T12:59:01.083 に答える