• Codeby web-security - Курс "Тестирование Веб-Приложений на проникновение с нуля" от команды codeby. Общая теория, подготовка рабочего окружения, пассивный фазинг и фингерпринт, Активный фаззинг, Уязвимости, Пост-эксплуатация, Инструментальные средства, Social Engeneering и многое другое. Подробнее ...

  • Мобильный клиент нашего форума для Android гаджетов доступен в Google Play Market по этой ссылке. Клиент можно скачать с нашего форума по этой ссылке. Последняя версия МК в нашем телеграм канале вот здесь

Проблема Многопоточность в передачи больших файлов

Deonis2397

New member
28.05.2018
1
0
#1
Здравствуйте, нужна помощь в многопоточности передачи данных. Проект подобия облака. Клиент отслеживает папку N, как только вней появляются файлы он их передает на сервер. Сервер принимает и записывает в свою папку. Проблема : передача одинарных файлов работает идеально, но при передачи нескольких файлов одновременно происходит потеря данных со стороны сервера или проблема в недозагруженности файлов. Пример отсылаю 30 получаю 18 идеальных файлов, лиюо отсылаю 30 получаю30 неполноценных (в размере и качестве) файлов.
Вот сервер. Класс 1

Java
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("Server listening on port 2395");
// loop (forever) until program is stopped
while(true) {
// accept a new connection
Socket client = socket.accept();
// start a new ServerThread to handle the connection and send
// output to the client
Thread thrd = new Thread(new ServerThread(client));
list.add(thrd);
thrd.start();
numThreads.incrementAndGet();
System.out.println("Thread " + numThreads.get() + " started.");
}
}
catch (IOException ioe){
ioe.printStackTrace();
}
}
}
Продолжение сервера. Класс 2

Java
package sample.Connecting.Proba;
import sample.CopySinhrone.Slejenie;
//import sample.FileCommandOperation.UnArchive;
//import sample.OpenCloud.Controller;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
public class ServerThread extends Thread {
Socket client = null;
BufferedReader input;
private static int j;
private static int j2;
private static OutputStream output;
// private static Calendar dating;
// private static SimpleDateFormat formating;
// public static Date l;
// private static ServerSocket serverSocket = null;
private static int port = 2395;
private static int bytesRead;
private static int current = 0;
public static String sravn = "";
public static String infoadd = "";
public static 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("Accepted connection. ");
try {
while (true) {
InputStream in = client.getInputStream();
DataInputStream dis = new DataInputStream(client.getInputStream());
in = new DataInputStream(in);
String fileName = dis.readUTF();
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 == '\\') {
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()));
// Controller.textto2.getItems().add(" Архив данных : " + commandclients);
// Controller.textto2.getItems().add(formating.format(l) + ": Принимаемый объект от пользователя : " + 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 == '\\') {
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()));
// Controller.textto2.getItems().add(formating.format(l) + ": Принимаемый объект от пользователя : " + 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[1024];
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) {


}
finally {
// close the connection to the client
try {
client.close();
}
catch (IOException e) {
e.printStackTrace();
}
System.out.println("Output closed.");
}


}
}
И конечно сам клиент.


Java

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("Передача объектов с / между сервером запущена");
// URL imageURL = Main.class.getResource("/images/2.gif");
// Image icon = Toolkit.getDefaultToolkit().getImage(imageURL);
// Main.ICON_STR = new TrayIcon(icon, APPLICATION_NAME, Main.);
// Main.tray.add(Main.trayIcon);
// Main.setTrayIcon2();
RandomAccessFile aFile = null;
try {
File file = new File(address);
aFile = new RandomAccessFile(file, "r");
FileChannel inChannel = aFile.getChannel();
ByteBuffer buffer = ByteBuffer.allocate(1024);
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();
}
}
Пожалуйста помогите. Решение нужно срочно. Сразу скажу,что сетевыми процессами занялся недавно. Критика только вплюс. Но только дайте граматный ответ с конкретным решением. Понять просто не могу
Конечный вариант, запланированный, должен быть следующим. Работает сервер 24 часа в сутки. Подключается клиент (заранее количество неизвестно, может быть и 30 одновременно ) передает файлы. Процесс подключился,передал и отключился. Сервер: ждет, принял, обработал, и т.д
 
Вверх Снизу