2

wifiダイレクトベースのファイル転送アプリケーションを開発しています。TCP ソケットを使用した転送速度が不十分であることがわかります。速度は通常 1Mbps です。データ転送グラフを分析すると、多くのスパイクが見られ、何秒間もデータ転送がまったく行われていません。転送速度をもっと速くする必要があることはわかっています (20 ~ 30Mbps の可能性があります)。転送速度を上げる方法を教えてください。接続を受け入れるサーバーソケットは

private void serverTask() {
        Log.v(TAG, "server task");
        try {
            serverRunning = true;
            ServerSocket serverSocket = new ServerSocket(
                    DeviceDetailFragment.PORT);
            serverSocket.setReceiveBufferSize(TCP_BUFFER_SIZE);


            Socket client = serverSocket.accept();

            BufferedInputStream inputstream = new BufferedInputStream(
                    client.getInputStream());
            // new BufferedInputStream(client.getInputStream(), 8 * 1024);
            BufferedReader bufferedStream = new BufferedReader(
                    new InputStreamReader(inputstream));


                fileName = bufferedStream.readLine();
                fileSizeInBytes = bufferedStream.readLine();
                fileMime = bufferedStream.readLine();

                f = new File(Globals.fileSavingLocation + fileName);

                File dirs = new File(f.getParent());
                if (!dirs.exists())
                    dirs.mkdirs();

                if (f.exists()) {
                    f.delete();
                }

                f.createNewFile();

        IOUtils.copy(inputstream, new FileOutputStream(f));


                serverSocket.close();
            }
            isSuccessful = true;

        } catch (IOException e) {
            isSuccessful = false;
            Log.e(TAG, e.getMessage());

        }
        serverRunning = false;

    }

データを送信するクライアントには次のコードがあります。

 private void clientTask(Intent intent) {
            String fileUri = intent.getExtras().getString(EXTRAS_FILE_PATH);
            String host = intent.getExtras().getString(EXTRAS_ADDRESS);
            String fileName = intent.getExtras().getString(FILE_NAME);
            String fileMimeType = intent.getExtras().getString(FILE_MIME_TYPE);
            final long sizeInBytes = intent.getExtras().getLong(FILE_SIZE);
            Socket socket = new Socket();
            int port = intent.getExtras().getInt(EXTRAS_PORT);

            try {
                socket.setSendBufferSize(TCP_BUFFER_SIZE);
                socket.bind(null);
                socket.connect((new InetSocketAddress(host, port)),
                        SOCKET_TIMEOUT);

                BufferedOutputStream stream = new BufferedOutputStream(
                        socket.getOutputStream());
                ContentResolver cr = FileTransferService.this
                        .getApplicationContext().getContentResolver();
                InputStream is = null;

                BufferedWriter bufferStream = new BufferedWriter(
                        new OutputStreamWriter(stream));


                bufferStream.write(fileName);
                bufferStream.newLine();
                bufferStream.flush();
                bufferStream.write(String.valueOf(sizeInBytes));
                bufferStream.newLine();
                bufferStream.flush();

                bufferStream.write(fileMimeType);
                bufferStream.newLine();
                bufferStream.flush();


                try {

                    is = new BufferedInputStream(cr.openInputStream(Uri
                            .parse(fileUri)));

                } catch (FileNotFoundException e) {

                    isSuccessful = false;

                }
 IOUtils.copy(is, stream);


                isSuccessful = true;

            } catch (IOException e) {
                Log.e(TAG, e.getMessage());
                isSuccessful = false;
            } finally {
                if (socket != null) {
                    if (socket.isConnected()) {
                        try {
                            socket.close();
                        } catch (IOException e) {
                            // Give up
                            e.printStackTrace();
                        }
                    }
                }
            }

の値TCP_BUFFER_SIZEは に設定されてい1024*512ます。

TCP_BUFFER_SIZE の値を変更しようと何度も試みましたが、うまくいきませんでした。ストリームをコピーする実装を Apache Commons IOUtils に置き換えました。手伝ってください

更新: 次の転送グラフを参照してください。 転送速度グラフ

4

2 に答える 2

2

setReceiveBufferSize() javadocから、バッファをオーバーロードしているようです

Socket.setReceiveBufferSize(int) を呼び出して、後で値を変更することができます。ただし、RFC1323 で定義されているように、アプリケーションが 64K バイトを超える受信ウィンドウを許可する場合は、提案された値をローカル アドレスにバインドする前に ServerSocket に設定する必要があります。これは、ServerSocket を引数なしのコンストラクターで作成し、次に setReceiveBufferSize() を呼び出す必要があり、最後に bind() を呼び出して ServerSocket をアドレスにバインドする必要があることを意味します。

于 2013-04-17T11:58:48.663 に答える
0

ファイルを使用せずに、プレーンな Socket を使用して単純なデータ転送を試みます。

接続時に 100 MB の空のデータを送信する単純なサーバーを用意します。クライアントにそのデータをできるだけ速く読み取らせ、得られたスループットを報告させます。同じマシンで、100 MB/秒を簡単に超えるはずです。これで適切な数値が得られたら、Android クライアントで試してください。

于 2013-04-17T11:53:10.570 に答える