2

そのため、クライアントがサーバーに無制限のファイルを送信する必要がある学校の宿題があります。こんな思いで作りました。

  1. クライアントは無制限のファイルをサーバーに送信します。
  2. サーバーは、クライアントによってアップロードされたファイルを私のワンプサーバーフォルダーにリダイレクトします

動作するコードがありますが、このコードはクライアントからサーバーに 1 つのファイルしか送信できません。私のコードでは1つのファイル名しか使用しないため、アップロードされたファイルのファイル名もインクリメントしたいので、より多くのクライアントがファイルをアップロードすると、古いファイル名が上書きされます。

例: file01.rar 次のアップロード file02.rar など。

ここに私のサーバーコードがあります:

public void run() {
    filePath = "C:/wamp/www/file.rar";
    byte[] aByte = new byte[1];
    int bytesRead;
    InputStream is = null;
    try {
        is = clientSocket.getInputStream();
    } catch (IOException ie) {
        ie.printStackTrace();
    }
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    if (is != null) {
        FileOutputStream fos = null;
        BufferedOutputStream bos = null;
        try {
            fos = new FileOutputStream(filePath);
            bos = new BufferedOutputStream(fos);
            bytesRead = is.read(aByte, 0, aByte.length);
            do {
                baos.write(aByte);
                bytesRead = is.read(aByte);
            } while (bytesRead != -1);
            bos.write(baos.toByteArray());
            bos.flush();
            bos.close();
        } catch (IOException ie) {
            ie.printStackTrace();
        }
    }
}

ここに私のクライアントコードがあります:

BufferedOutputStream bos = null;
            try {
                bos = new BufferedOutputStream(s.getOutputStream());
            } catch (IOException ie) {
                ie.printStackTrace();
            }

            if (bos != null) {
                File uploadFile = new File(clientFacultyUploadTextField.getText());
                byte[] myFileSize = new byte[(int)uploadFile.length()];
                FileInputStream fis = null;
                try {
                    fis = new FileInputStream(uploadFile);
                } catch (FileNotFoundException fife) {
                    fife.printStackTrace();
                }
                BufferedInputStream bis = new BufferedInputStream(fis);
                try {
                    bis.read(myFileSize, 0, myFileSize.length);
                    bos.write(myFileSize, 0, myFileSize.length);
                    bos.flush();
                    bos.close();
                    clientFacultyUploadTextField.setText("Upload complete...");
                } catch (IOException ie) {
                    ie.printStackTrace();
                }
            }
4

1 に答える 1

0

複数のファイルを送信する場合は、1つのファイルが停止し、別のファイルが開始するタイミングをサーバーに通知して、それらを個別に処理できるようにする必要があります。

この問題に取り組むには複数の方法があります。簡単だが制限的なものから難しいが印象的なものまで、いくつか並べてあります。

a)ファイルごとに新しい接続を使用し、転送が完了したらファイルを閉じます。これは、ファイルが終了したことをサーバーに通知します。これの利点は、複数のファイルを同時にアップロードできるように簡単に拡張できることです。欠点:転送が何らかの理由で中断された場合、サーバーはこれをエラーとして検出せず、ファイルの一部を完了したかのように保存する場合があります。

b)同じ接続を使用しますが、各ファイルの長さをサーバーに通知します。これを行うには、ファイルの長さ(バイト単位)で各ファイル転送を開始します。このようにして、サーバーはこのバイト数を読み取ってから、新しいファイルを開始できます。もちろん、これはファイルサイズが事前にわかっている場合にのみ機能します。アップロード中に作成中のファイルをストリーミングする場合は使用できません。

c)フレーミングプロトコルを使用します。ファイルをチャンクに分割し、各チャンクの前に、サーバーにチャンクの長さ、およびそれが最後のチャンクであるか、さらにチャンクが続くかどうかを通知するヘッダーを付けます。この方法には多少のオーバーヘッドがありますが、ヘッダーに情報を追加することで新しい機能を簡単に追加できる非常に拡張可能なアーキテクチャです。たとえば、転送のIDをヘッダーに追加し、シーケンス番号と制御コード、サーバーに削除または名前変更を指示する特別なコマンドフレームを追加してアップロードを中止および再開することにより、1つの接続で複数の転送を多重化できます。すでに持っているファイルなど。いくつかのインスピレーションについては、HTTPとFTPがどのように機能するかを見てください。

于 2013-02-03T17:09:29.277 に答える