0

みなさん、こんにちは。クライアントがサーバーからファイルをダウンロードできるように、Java でサーバー クライアント プログラムを実装しました。

しかし、問題は、ファイルをダウンロードする前に、クライアントとサーバーの間でいくつかのメッセージ (文字列) を交換したいということです。Java で文字列を交換するために使用したものはすべて、それらの間で文字列を交換できましたが、ファイルが適切にダウンロードされませんでした。どうしてか分かりません。

ファイルをダウンロードするためのクライアント コード:

byte[] b = new byte[1024];
int len = 0;
long  bytcount = 1024;

File fp = new File("/home/luv/Desktop/LUVSAXENA_IT.docx");

RandomAccessFile ra=new RandomAccessFile(fp,"rw");
ra.seek(0);
InputStream i = sock.getInputStream();

BufferedReader reader=new BufferedReader(new InputStreamReader(i));

InputStream is = sock.getInputStream();

while ((len = is.read(b, 0, 1024)) != -1) {
    System.out.println("len"+len+"\n");
      bytcount = bytcount + 1024;

      //decrypt

      ra.write(b, 0, len);
}
is.close();
ra.close();
sock.close();

ファイルを送信するためのサーバーコード:

byte[] buf = new byte[1024];

OutputStream os = sock.getOutputStream();

BufferedOutputStream out = new BufferedOutputStream(os, 1024);

File folder = new File("/home/luv/NetBeansProjects/Shared/");
File[] listoffiles=folder.listFiles();
String s;

int i=0;
File fp = new File("/home/luv/NetBeansProjects/Shared/LUVSAXENA_IT.docx");
RandomAccessFile ra = new RandomAccessFile(fp,"r");
long bytecount=1024;

while((i=ra.read(buf, 0, 1024)) != -1)
{

    bytecount += 1024;
    out.write(buf, 0, i);
    out.flush();
}
sock.shutdownOutput();
out.close();
ra.close();
sock.close();

ファイルをダウンロードする前にクライアントとサーバーの間で文字列を安全に交換し、その後ファイルを安全にダウンロードできるようにするにはどうすればよいですか。

事前にサンクス

4

2 に答える 2

1

接続を作成する方法は、生データを書き込むが文字を読み取ることです(ストリームとリーダー/ライター)。

ObjectInputStream/ObjectOutputStreamまたはファイルにBase64エンコーディングを使用してから、 Reader/を使用することをお勧めしますWriter

また、文字列をデータから分離する方法を自分で管理する必要があります。

于 2012-11-14T10:40:38.707 に答える
1

サーバーとクライアントの両方が話すある種のプロトコルが必要になります。
最も簡単な方法は、リクエスト/レスポンス パターンで固定長メッセージを使用することです。たとえば、各メッセージ文字列に 10 バイトを使用します (ここでは空白を示すために X を使用します)。

Client sends    "HELLOXXXXX"
Server answers  "WELCOMEXXX"
Client sends    "GIMMEFILEX"
Server ansers   "SIZE=83736"
Client reads the next 83736 bytes
Client sends    "THANKYOUXX"
Server SENDS    "GOODBYEXXX"

これは、固定長のデータを読み取るのに役立つ方法です。すべてのデータが読み取られるまでブロックされます。データを書き込むときは、特別なコードは必要なく、書き出すだけです。

private byte[] readBytes(InputStream stream, int amount) throws IOException
{
  byte[] result = new byte[amount];

  int read = stream.read(result, 0, amount);
  if (read < 0)
  {
    throw new IOException("Can't read from socket");
  }
  while (read < amount)
  {
    int remaining = amount - read;
    int newRead = stream.read(result, read, remaining);
    if (newRead < 0)
    {
      throw new IOException("Can't read from socket");
    }
    read = read + newRead;
  }
  return result;
}
于 2012-11-14T10:43:44.610 に答える