|
|
|
Многопоточность в передачи больших файлов
|
|||
|---|---|---|---|
|
#18+
Здравствуйте, нужна помощь в многопоточности передачи данных. Проект подобия облака. Клиент отслеживает папку 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[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())); // 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[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())); // 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 одновременно ) передает файлы. Процесс подключился,передал и отключился. Сервер: ждет, принял, обработал, и т.д Конеч ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2018, 13:12 |
|
||
|
Многопоточность в передачи больших файлов
|
|||
|---|---|---|---|
|
#18+
кто нибудь знает решение данной проблемы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2018, 13:21 |
|
||
|
Многопоточность в передачи больших файлов
|
|||
|---|---|---|---|
|
#18+
Если нужно срочно, то можно было бы и оформить код нормально стилями, а не тупо всё скопировать и вставить. Может кто-то бы и помог, но просто неудобно воспринимать и в итоге, те кто даже и знают, могут просто проигнорить пост. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2018, 13:21 |
|
||
|
Многопоточность в передачи больших файлов
|
|||
|---|---|---|---|
|
#18+
Один из них получается вы? Считаю, что обсуждать надо код программы, а не как оформлен вид. Кто хочет смотреть "Красоту" пусть на природе погуляет, а не советы по оформлению дает ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2018, 13:28 |
|
||
|
Многопоточность в передачи больших файлов
|
|||
|---|---|---|---|
|
#18+
Народ, при всем уважение ко всем. Неужели никто не знает? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2018, 13:36 |
|
||
|
Многопоточность в передачи больших файлов
|
|||
|---|---|---|---|
|
#18+
Denis2397Кто хочет смотреть "Красоту" пусть на природе погуляет,из молодых беспредельщиков)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2018, 13:39 |
|
||
|
Многопоточность в передачи больших файлов
|
|||
|---|---|---|---|
|
#18+
Denis2397Один из них получается вы? Считаю, что обсуждать надо код программы, а не как оформлен вид. Кто хочет смотреть "Красоту" пусть на природе погуляет, а не советы по оформлению дает Лолшто? Вы не задали ниодного конкретноего вопроса. Вывалили кучу говнокода не потратив даже минуты чтобы его завернуть его в теги подсветки. И хотите чтобы кто-то эту лапшу прочитал и сразу выдал ответ? Чтобы код обсуждать, его надо читать. Когда код опубликован так как у вас, то читать его тяжелее. Нужно не только вникать в то что код делает но и в то как он должен был выглядеть если бы был отформатирован. Поэтому с вашей стороны было бы вежливо помочь людям понять вашу проблему, и рассказать о том что вы уже сделали чтобы её решить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2018, 13:42 |
|
||
|
Многопоточность в передачи больших файлов
|
|||
|---|---|---|---|
|
#18+
Petro123, спасибо. Но пацаны, правда помощь нужна, без приколов. Помогите ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2018, 13:42 |
|
||
|
Многопоточность в передачи больших файлов
|
|||
|---|---|---|---|
|
#18+
Тема закрыта. В помощи и разборе кода более никто не нуждается. Те кто "постарше" можно и не указывать на возраст, грубо я ниче не написал. И если вы такие обидчевые ваше право. Всем успеха ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2018, 13:49 |
|
||
|
Многопоточность в передачи больших файлов
|
|||
|---|---|---|---|
|
#18+
Denis2397Потеря данных при передачи. Логичный и предсказуемый вопрос, в чем причина? "Ошибка в 17-й строке". Отлаживайся. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2018, 13:50 |
|
||
|
Многопоточность в передачи больших файлов
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov, Извините, но можно по подробнее. На сколько я понял вы про вторую часть моего сервера, private static OutputStream output. Верно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2018, 14:16 |
|
||
|
Многопоточность в передачи больших файлов
|
|||
|---|---|---|---|
|
#18+
Denis2397, Наймите программиста для решения задачи :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2018, 14:33 |
|
||
|
Многопоточность в передачи больших файлов
|
|||
|---|---|---|---|
|
#18+
Denis2397, авторпередача одинарных файлов работает идеально, но при передачи нескольких файлов одновременно происходит потеря данных со стороны сервера или проблема в недозагруженности файлов Ну посмотреть сколько данных отправляется, сколько принимается. Там понятно думаю будет, почему часть байтов теряется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2018, 17:02 |
|
||
|
Многопоточность в передачи больших файлов
|
|||
|---|---|---|---|
|
#18+
Denis2397, авторint f = 0; for (int i = 0; i < fileName.length(); i++) { if (fileName.charAt(i) == '\\') f++; } System.out.println("Количество слешей : " + f); if (f > 2) { Это тоже странное место. Что за f? Не прочитать же. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2018, 17:07 |
|
||
|
Многопоточность в передачи больших файлов
|
|||
|---|---|---|---|
|
#18+
mr_virtus, действительно странное, тем более, что количество слешей определяется в 1 строку ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2018, 17:12 |
|
||
|
Многопоточность в передачи больших файлов
|
|||
|---|---|---|---|
|
#18+
Ну и ошибки обрабатывать нормально, а нет так. В stdout миллион туфты выводится, а ошибка при передачи просто игнорируется. Код: java 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2018, 17:16 |
|
||
|
Многопоточность в передачи больших файлов
|
|||
|---|---|---|---|
|
#18+
вадя, автордействительно странное, тем более, что количество слешей определяется в 1 строку И что дальше-то? Как это относится к именованию переменной? О чем вообщем разговор. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2018, 17:19 |
|
||
|
Многопоточность в передачи больших файлов
|
|||
|---|---|---|---|
|
#18+
mr_virtusИ что дальше-то? Как это относится к именованию переменной? О чем вообщем разговор.в том, что можно обойтись вообще без переменной да и придумывать название переменной , которая используется в 4 строках - смысл? зато так видно, что переменная "локальная-временная" и искать её использование ещё где-то нет смысла. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2018, 17:55 |
|
||
|
Многопоточность в передачи больших файлов
|
|||
|---|---|---|---|
|
#18+
вадя, авторда и придумывать название переменной , которая используется в 4 строках - смысл? зато так видно, что переменная "локальная-временная" и искать её использование ещё где-то нет смысла. Ну я структуру его кода здесь не обсуждаю. Может и можно обойтись вовсе без переменной. У него там ниже в if-ах используется эта переменная, далеко за пределами её инициализации.Не меняя принципиально структуру метода, slashCounter было бы понятное обозначение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2018, 18:01 |
|
||
|
Многопоточность в передачи больших файлов
|
|||
|---|---|---|---|
|
#18+
mr_virtus, slashCounter было бы понятное обозначение.да , конечно. но , как я уже сказал, такое "осмысленное" название подразумевает "глобальное" использование. а простое "f" - использовал в ближайших строках и забыл. ну это только моё мнение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2018, 18:57 |
|
||
|
|

start [/forum/topic.php?fid=59&fpage=46&tid=2122024]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
52ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
51ms |
get tp. blocked users: |
1ms |
| others: | 15ms |
| total: | 160ms |

| 0 / 0 |

Извините, этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
... ля, ля, ля ...