Как отправить несколько файлов, особенно файл изображения и специальную строку из Android в качестве клиентского сокета, в сокет Java-сервера?
Файл описан в виде строкового массива, где строка - это путь, в котором хранятся файлы.
Что касается специальной строки, она будет использоваться в качестве родительского каталога на сервере, и загруженный файл будет помещен туда.
Я пробовал много учебников по SO, например Stackoverflow
Вот скелет, который я сделал.
Обновлено
Я успешно перенес эти файлы, но не могу передать родительский элемент специальных строк
Клиент Android
private void handlingUpload(String vehicleNumber) {
System.out.println("PathImage: " + vehicleNumber);
ArrayList<String> list = new ArrayList<String>();
// Get all path each object and sign into list
for (Image image : images) {
list.add(image.getPath());
}
// just prove if list is not emtpty
for (String temp : list) {
System.out.println("FilePath" + temp);
}
// The rules is sending a String vehicleNumber as parent folder
// element in list uploaded Async
Client client = new Client("192.168.8.34", 59090, vehicleNumber);
client.execute();
}
Класс для обработки Android-сокета
package com.tsurumaru.dzil.clientwarehouse.controllers;
import android.content.ContentResolver;
import android.content.Context;
import android.net.Uri;
import android.os.AsyncTask;
import android.util.Log;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.ArrayList;
public class Client extends AsyncTask<Void, Void, Void> {
private String address;
private int port;
private String textResponse;
FileInputStream fis = null;
BufferedInputStream bis = null;
DataInputStream dis = null;
OutputStream os = null;
DataOutputStream dos = null;
Context context;
ArrayList<String> list;
public Client(Context context, String address, int port, ArrayList<String> list, String textResponse) {
this.context = context;
this.address = address;
this.port = port;
this.textResponse = textResponse;
this.list = list;
}
@Override
protected Void doInBackground(Void... arg0) {
Socket socket = null;
try {
socket = new Socket(address, port);
//Execute them
DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(socket.getOutputStream()));
//write the number of files to the server
dos.writeInt(list.size());
System.out.println("Do In Background TO Server" + list.size());
dos.flush();
//write file names to the server
for (String temp : list) {
dos.writeUTF(temp);
dos.flush();
}
// write file size to the server
int n = 0;
byte[]buf = new byte[4092];
for (String temp : list) {
File file = new File(temp);
dos.writeLong(file.length());
dos.flush();
}
// write the file
for (String temp : list) {
File file = new File(temp);
FileInputStream fis = new FileInputStream(file);
while ((n = fis.read(buf)) != -1) {
dos.write(buf, 0, n);
dos.flush();
}
}
dos.close();
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}
protected void onPostExecute() {
Log.i("ThreadPost", "onPost");
}
}
Java Server
public class MainWindow extends javax.swing.JFrame {
public static void main(String args[]) {
// Create a Socket Server
Thread starter = new Thread(new ServerStart());
starter.start();
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new MainWindow().setVisible(true);
}
});
}
public class ServerStart implements Runnable {
@Override
public void run() {
try {
ServerSocket serverSocket = new ServerSocket(59090);
while (true) {
Socket clientSocket = null;
clientSocket = serverSocket.accept();
// create each thread
Thread listener = new Thread(new ClientHandler(clientSocket));
listener.start();
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
public class ClientHandler implements Runnable {
Socket socket;
public ClientHandler(Socket clientSocket) {
try {
socket = clientSocket;
} catch (Exception ex) {
textAreaLog.append(ex.getMessage());
}
}
@Override
public void run() {
try {
DataInputStream dis = new DataInputStream(new BufferedInputStream(socket.getInputStream()));
//read the number of files from the client
int number = dis.readInt();
textAreaLog.append("Number of Files to be received: " + number + "\n");
ArrayList<File> files = new ArrayList<File>(number);
ArrayList<Long> size = new ArrayList<Long>(number);
//read file names, add files to arraylist
for (int i = 0; i < number; i++) {
File file = new File(dis.readUTF());
files.add(file);
}
long longSize;
for (int i = 0; i < number; i++) {
longSize = dis.readLong();
size.add(longSize);
}
int n = 0;
byte[] buf = new byte[4092];
for (int i = 0; i < files.size(); i++) {
long fileSize = size.get(i);
textAreaLog.append("Receiving file: " + files.get(i).getPath() + " size: " + fileSize + "\n");
//read file
try (
//create a new fileoutputstream for each new file
FileOutputStream fileOutputStream = new FileOutputStream("D:\\Server Warehouse\\incoming_lokal\\" + files.get(i).getName())) {
//read file
while (fileSize > 0 && (n = dis.read(buf, 0, (int) Math.min(buf.length, fileSize))) != -1) {
fileOutputStream.write(buf, 0, n);
fileSize -= n;
}
fileOutputStream.close();
}
}
} catch (IOException ex) {
textAreaLog.append(ex.getMessage());
} finally {
textAreaLog.append("Thread Is Done " + "\n");
}
}
}
}
Любая помощь, это так ценится.