[英]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.