0

2 台の Android デバイス間で Wi-Fi ホットスポットの IP アドレスと MAC アドレスを使用して、ソケット接続でファイルを転送したいと考えています。ソケット。以下は送信者側のコードです:-

            Socket socket = null;
            File file = new File(
                    Environment.getExternalStorageDirectory(),
                    "test.mp3");

            byte[] bytes = new byte[(int) file.length()];
            BufferedInputStream bis;
            try {
                socket = new Socket(dstAddress, dstPort);
                bis = new BufferedInputStream(new FileInputStream(file));
                bis.read(bytes, 0, bytes.length);
                OutputStream os = socket.getOutputStream();
                os.write(bytes, 0, bytes.length);
                os.flush();
                if (socket != null) {
                    socket.close();
                }

                final String sentMsg = "File Sent.....";
                ((Activity)context_con).runOnUiThread(new Runnable() {

                    @Override
                    public void run() {
                        Toast.makeText(context_con,
                                sentMsg,
                                Toast.LENGTH_LONG).show();
                    }});


            }catch (ConnectException e) {
                e.printStackTrace();
            }
            catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    if (socket != null) {
                        socket.close();
                    }
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }

これは受信側のコードです:-

           try {
            File file = new File(
                    Environment.getExternalStorageDirectory(),
                    "test.mp3");

            byte[] bytes = new byte[1024];
            InputStream is = socket.getInputStream();
            FileOutputStream fos = new FileOutputStream(file);
            BufferedOutputStream bos = new BufferedOutputStream(fos);
            int bytesRead = is.read(bytes, 0, bytes.length);
            bos.write(bytes, 0, bytesRead);
            bos.close();
            socket.close();

            final String sentMsg = "File Received...";
            Main.this.runOnUiThread(new Runnable() {

                @Override
                public void run() {
                    Toast.makeText(Main.this,
                            sentMsg,
                            Toast.LENGTH_LONG).show();
                }});

        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            try {
                socket.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

mp3 ファイルのような大きなサイズのファイルを転送したいのですが、正確なサイズの 2.1 MB ではなく、受信側で 1Kb サイズのファイルしか作成されません。この実装で間違っているところを教えてください。

4

1 に答える 1

0

これをまとめましたが、テストしていません。これはいくつかのヒントを与えるはずです

 //Server side snippet
 public void server(int port) throws IOException {
    try (ServerSocket serverSocket = new ServerSocket(port); Socket socket = serverSocket.accept()) {
        try (InputStream in = socket.getInputStream(); OutputStream out = new FileOutputStream("test.mp3")) {
            byte[] bytes = new byte[2 * 1024];

            int count;
            while ((count = in.read(bytes)) > 0) {
                out.write(bytes, 0, count);
            }
        }
    }
}

 //client side
 public static void client(String dstAddress, int dstPort) throws IOException { 
    try (Socket socket = new Socket(dstAddress, dstPort)) {
        File file = new File(Environment.getExternalStorageDirectory(), "test.mp3");

        // Get the size of the file
        long length = file.length();
        if (length > 0) {
            byte[] bytes = new byte[2 * 1024];
            InputStream in = new FileInputStream(file);
            OutputStream out = socket.getOutputStream();

            int count;
            while ((count = in.read(bytes)) > 0) {
                out.write(bytes, 0, count);
            }
            out.close();
            in.close();
        }
    }
}

私が行ったように、try-catch でリソースをラップするか、ラップしないことを選択できます。それに応じてバッファ サイズを調整することを検討してください。これを考慮してください

それを試してみてください。

于 2016-12-13T10:48:13.610 に答える