簡體   English   中英

使用Java套接字發送和接收多個JSON文件

[英]Sending and receiving several JSON files with java sockets

我正在制作一個應該通過wifi直接連接發送和接收一些json文件的android應用程序(無論何時連接了另一台設備,它們都交換了所有的json文件)。 這個問題主要是關於最佳實踐,因為對於android和java來說我都是新手。 建立wifi直接連接后,兩個設備之一(組所有者)將成為服務器並打開服務器套接字。 另一個連接到所述套接字,並向服務器發送一個單個json文件。

我希望客戶端發送所有他的json文件,然后從服務器接收所有json文件,我想知道應該怎么做:如何告訴一個文件結束了? 我應該提前發送文件的長度,還是讓客戶端等待服務器完成讀取的確認? 我可以發信號通知“數據結束”(通過關閉OutputStream嗎?)以在接收端停止讀取循環,然后開始發送另一個文件?

為了獲得一些上下文,這是當前使用的代碼:

客戶端

@Override
    protected String doInBackground(Void... params) {
        Socket socket = new Socket();
        try {
            Log.d(TAG, "Opening client socket - ");
            socket.bind(null);
            socket.connect((new InetSocketAddress(mHost, Constants.PORT)), SOCKET_TIMEOUT);

            Log.d(TAG, "Client socket - " + socket.isConnected());
            OutputStream stream = socket.getOutputStream();

            //There is only one file, so the loop here runs only once
            File dir = Utils.graffitiDir(context);
            for (File tmp : dir.listFiles()) {
                FileInputStream in = new FileInputStream(tmp);
                Utils.copyFileInOut(in, stream);
            }
            Log.d(TAG, "Client: Data written");
            return "ok";
        } catch (IOException e) {
            Log.e(TAG, e.getMessage());
            return null;
        }
        finally {
            if (socket != null) {
                if (socket.isConnected()) {
                    try {
                        socket.close();
                    } catch (IOException e) {
                        // Give up
                        e.printStackTrace();
                    }
                }
            }
        }
    }

服務器端

@Override
    protected String doInBackground(Void... params) {
        try {
            ServerSocket serverSocket = new ServerSocket(Constants.PORT);
            byte buf[] = new byte[4];
            String res;
            Log.d(TAG, "Server: Socket opened");
            Socket client = serverSocket.accept();
            Log.d(TAG, "Server: connection done");

            File f = new File(context.getFilesDir(), Constants.DIRECTORY);
            File dirs = new File(f.getParent());
            if (!dirs.exists())
                dirs.mkdirs();
            f.createNewFile();
            File newf = new File(f, Calendar.getInstance().getTime().toString());
            Log.d(TAG, "server: copying files " + f.toString());
            InputStream inputstream = client.getInputStream();
            //copyFile(inputstream);
            Utils.copyFileInOut(inputstream, new FileOutputStream(newf));
            serverSocket.close();
            return newf.getAbsolutePath();
        } catch (IOException e) {
            Log.e(TAG, e.getMessage());
            return null;
        }
    }

copyFileInOut函數:

public static boolean copyFileInOut(InputStream inputStream, OutputStream out) {
    byte buf[] = new byte[1024];
    int len;
    long startTime=System.currentTimeMillis();

    try {
        while ((len = inputStream.read(buf)) != -1) {
            out.write(buf, 0, len);
            Log.d("copyfile", "I'm writing");
        }
        out.close();
        inputStream.close();
        long endTime=System.currentTimeMillis()-startTime;
        Log.d("copyfile", "Time taken to transfer all bytes is : " + endTime);

    } catch (IOException e) {
        Log.d(TAG, e.toString());
        return false;
    }
    return true;
}

作為一個旁注,我看到了幾個類似的問題( 在套接字上發送和接收文件 ),其中的答案建議提前發送文件的長度,但是我覺得我的情況有所不同,並且我沒有有必要的經驗來找出最佳解決方案。 如果這是一個顯而易見的問題,我深表歉意,但我自己找不到答案。

在您的情況下,您應該

1.發送您要首先發送的文件數,
2.然后發送一個文件和該文件的長度。 對所有文件重復此操作。

在此之后,服務器還可以使用相同的順序發送文件數量,文件大小,然后對所有文件重復該文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM