Java Socket - загрузка нескольких файлов с помощью AsyncTask в Android - PullRequest
1 голос
/ 25 марта 2019

Как отправить несколько файлов, особенно файл изображения и специальную строку из 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");
            }
        }
    }
}

Любая помощь, это так ценится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...