Socket Multithreading in the transmission of large data

All welcome. At once I will say that I have a problem with English, so I apologize at once. I’m traveling with an interpreter. And now my problem. There is a server, it works constantly, 24 hours a day and there is an undetermined number of clients. When a client has something that changes in the destination folder (for example: a new file was added or something else), then the client transfers these files to the server. The server receives data from the client and writes them to the destination folder. Problems: loss of data when getting on the server side (example: sends the client 30 files, different in size and format, and the server accepts 10, then 25 files). What is the reason? Help in solving. The program is similar to the well-known programs and services of OneDrive, Yandex Cloud, etc. In programming, I’m also new. For errors in the code I apologize.

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.concurrent.atomic.AtomicInteger;
public class Server {
public static void main(String[] args) {
	AtomicInteger numThreads = new AtomicInteger(0);
	ArrayList<Thread> list = new ArrayList<Thread>();
	try {
		ServerSocket socket = new ServerSocket(2395);
		System.out.println("Сервер прослушивает 2395");
		while(true) {
			Socket client = socket.accept();
			Thread thrd = new Thread(new ServerThread(client));
			list.add(thrd);
			thrd.start();
			numThreads.incrementAndGet();
			System.out.println("Поток " + numThreads.get() + " создан.");
		}
	}
	catch (IOException ioe){
		ioe.printStackTrace();
	}
}
}

/// Part2

    import sample.CopySinhrone.Slejenie;
    import java.io.*;
    import java.net.Socket;
    import java.util.ArrayList;
    public class ServerThread extends Thread {
Socket client = null;
private int j;
private int j2;
private int bytesRead;
public String sravn = "";
public String infoadd = "";
public String infofile = "";
public static ArrayList<String> ipclients = new ArrayList<String>();
public static ArrayList<String> commandclients = new ArrayList<String>();
public ServerThread(Socket client) {
	this.client = client;
}

public void run() {
	System.out.print("Соединение установлено. ");
	try {
		while (true) {
            String fileName = null;
            DataInputStream dis;
            InputStream in = null;
            OutputStream output = null;
			in = client.getInputStream();
			dis = new DataInputStream(client.getInputStream());
			in = new DataInputStream(in);
			try {
                fileName = dis.readUTF();
            }
            catch (EOFException lk) {
            lk.printStackTrace();
            }
			int f = 0;
			for (int i = 0; i < fileName.length(); i++) {
				if (fileName.charAt(i) == '\\')
					f++;
			}
			System.out.println("Количество слешей : " + f);
			if (f > 2) {
				// Если передается файл, не хранящийся в корне папки Cloud
				// 1 метод. Обнаружение начала наименования объекта
				char[] chArray = fileName.toCharArray();
				for (int i = 0; i < chArray.length; i++) {
					if (chArray[i] == '\\') {
						j = (i + 1);
					}
				}
				// 2 метод. Обнаружение начала папки, где хранится данный объект
				char[] chArray2 = fileName.replaceAll("\\\\\\\\", "\\\\").toCharArray();
				for (int i2 = 0; i2 < chArray2.length; i2++) {
					if (chArray[i2] == '\\') {
						j2 = (i2 + 1);
					}
				}
				if ( ipclients.contains(client.getRemoteSocketAddress().toString()) ) {
					System.out.println("Поддерживается связь со старым клиентом : " + client.getRemoteSocketAddress().toString());
				}
				else {
					ipclients.add(client.getRemoteSocketAddress().toString());
					System.out.println("Подключен новый клиент : " + client.getRemoteSocketAddress().toString());
				}
				System.out.println("Принимаемый путь от пользователя : " + fileName.substring(9, j2 - 1));
				System.out.println("Принимаемый объект от пользователя : " + fileName.substring(j, fileName.length()));
				infoadd = client.getRemoteSocketAddress().toString();
				infofile = fileName.substring(9, j2 - 1) + '\\' + fileName.substring(j, fileName.length());
				commandclients.add("IP : " + client.getRemoteSocketAddress().toString() + " File : " + fileName.substring(j, fileName.length()));
				System.out.println(" Архив данных : " + commandclients);
				sravn = (fileName.substring(9, j2 - 1) + fileName.substring(j, fileName.length()));
				// Вставка пути для записи объекта
				Slejenie.ipprov = client.getRemoteSocketAddress().toString().substring(1,(client.getRemoteSocketAddress().toString().length() - 6));
				Slejenie.fileprov = (fileName.substring(9, j2 - 1) + '\\' + fileName.substring(j, fileName.length()));
				output = new FileOutputStream("D:\\Cloud\\" + fileName.substring(9, j2 - 1) + '\\' + fileName.substring(j, fileName.length()));
				// Конец метода
			}
			if (f <= 2) {
				// Если передается файл, хранящийся в корне папки Cloud
				// 1 метод. Обнаружение начала наименования объекта
				char[] chArray = fileName.toCharArray();
				for (int i = 0; i < chArray.length; i++) {
					if (chArray[i] == '\\') {
						j = (i + 1);
					}
				}
				if ( ipclients.contains(client.getRemoteSocketAddress().toString()) ) {
					System.out.println("Поддерживается связь со старым клиентом : " + client.getRemoteSocketAddress().toString());
				}
				else {
					ipclients.add(client.getRemoteSocketAddress().toString());
					System.out.println("Подключен новый клиент : " + client.getRemoteSocketAddress().toString());
				}
				sravn = fileName.substring(j, fileName.length());
				System.out.println("Принимаемый путь от пользователя : Отсутствует");
				System.out.println("Принимаемый объект от пользователя : " + fileName.substring(j, fileName.length()));
				infoadd = client.getRemoteSocketAddress().toString();
				infofile = fileName.substring(j, fileName.length());
				// Вставка пути для записи объекта
				Slejenie.ipprov = client.getRemoteSocketAddress().toString().substring(1,(client.getRemoteSocketAddress().toString().length() - 6));
				Slejenie.fileprov = fileName.substring(j, fileName.length());
				output = new FileOutputStream("D:\\Cloud\\" + fileName.substring(j, fileName.length()));
				// Конец метода
			}
			long size = dis.readLong();
			byte[] buffer = new byte[150*1024*8];
			while (size > 0 && (bytesRead = in.read(buffer, 0, (int) Math.min(buffer.length, size))) != -1) {
				output.write(buffer, 0, bytesRead);
				size -= bytesRead;
			}
			output.close();
		}
	}
	catch (IOException lp) {
	    lp.printStackTrace();
	}
	finally {
		// close the connection to the client
		try {
			client.close();
		}
		catch (IOException e) {
			e.printStackTrace();
		}
		System.out.println("Соединение разорвано.");
	}

}

}

/// Client

      public SocketChannel createChannel() {
        SocketChannel socketChannel = null;
        try {
            socketChannel = SocketChannel.open();
            SocketAddress socketAddress = new InetSocketAddress("192.168.0.12", 2395);
            if (socketChannel.isConnected()) {
                System.out.println("Соединение с сервером уже установлено.");
                nioClient.sendFile(socketChannel);
            } else {
                try {
                    socketChannel.connect(socketAddress);
                    System.out.println("Новое соединение с сервером установлено.");
                    try {
                        nioClient.sendFile(socketChannel);
                    } catch (NullPointerException lp) {
                        System.err.println("Объект(-ы) для передачи не обнаружен(-ы).Пожалуйста проверьте доступномть и наличие данного файла.");
                    }
                } catch (ConnectException lp) {
                    System.err.println("Сервер отключен от всемирной сети. Синхронизация не возможна.");
                    System.out.println("Облако выключается... Спасибо за понимание.");
                    System.exit(0);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return socketChannel;
}
public void sendFile(SocketChannel socketChannel) {
    System.out.println("Передача объектов с / между сервером запущена");
    RandomAccessFile aFile = null;
    try {
        File file = new File(address);
        aFile = new RandomAccessFile(file, "r");
        FileChannel inChannel = aFile.getChannel();
        ByteBuffer buffer = ByteBuffer.allocate(150*1024*8);
        FileReader r = new FileReader(file);
        String s;
        int f = 0;
        for (int i=0; i<String.valueOf(file).length(); i++)
        {
            if (String.valueOf(file).charAt(i) == '\\')
                f++;
        }
        System.out.println("Количество слешей : " + f);
        if (f <= 2) {
            s = file.getName();
        }
        else
        {
            s = file.getAbsolutePath();
        }
        long fs = file.length();
        DataOutputStream dos = new DataOutputStream(socketChannel.socket().getOutputStream());
        dos.writeUTF(s);
        dos.writeLong(fs);
        while (inChannel.read(buffer)!= -1) {
            buffer.flip();
            socketChannel.write(buffer);
            buffer.clear();
        }
        Thread.sleep(1000);
        System.out.println("Чтение объекта(-ов) окончено успешно..");

// Main.setTrayIcon();
dos.flush();
socketChannel.close();
aFile.close();
inChannel.close();
r.close();
file.deleteOnExit();
} catch (FileNotFoundException e) {
System.err.println(“Файл конфигурации свойств не найден”);
} catch (IOException e) {
System.err.println(“Ошибка при чтении объекта”);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}