powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Многопоточность в передачи больших файлов
21 сообщений из 21, страница 1 из 1
Многопоточность в передачи больших файлов
    #39651048
Denis2397
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, нужна помощь в многопоточности передачи данных. Проект подобия облака. Клиент отслеживает папку 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 одновременно ) передает файлы. Процесс подключился,передал и отключился. Сервер: ждет, принял, обработал, и т.д
Конеч
...
Рейтинг: 0 / 0
Многопоточность в передачи больших файлов
    #39651057
Denis2397
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
кто нибудь знает решение данной проблемы?
...
Рейтинг: 0 / 0
Многопоточность в передачи больших файлов
    #39651059
Nixic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если нужно срочно, то можно было бы и оформить код нормально стилями, а не тупо всё скопировать и вставить.
Может кто-то бы и помог, но просто неудобно воспринимать и в итоге, те кто даже и знают, могут просто проигнорить пост.
...
Рейтинг: 0 / 0
Многопоточность в передачи больших файлов
    #39651066
Denis2397
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Один из них получается вы? Считаю, что обсуждать надо код программы, а не как оформлен вид. Кто хочет смотреть "Красоту" пусть на природе погуляет, а не советы по оформлению дает
...
Рейтинг: 0 / 0
Многопоточность в передачи больших файлов
    #39651074
Denis2397
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Народ, при всем уважение ко всем. Неужели никто не знает?
...
Рейтинг: 0 / 0
Многопоточность в передачи больших файлов
    #39651080
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Denis2397Кто хочет смотреть "Красоту" пусть на природе погуляет,из молодых беспредельщиков))
...
Рейтинг: 0 / 0
Многопоточность в передачи больших файлов
    #39651083
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Denis2397Один из них получается вы? Считаю, что обсуждать надо код программы, а не как оформлен вид. Кто хочет смотреть "Красоту" пусть на природе погуляет, а не советы по оформлению дает
Лолшто? Вы не задали ниодного конкретноего вопроса. Вывалили кучу говнокода не потратив даже минуты чтобы его завернуть его в теги подсветки. И хотите чтобы кто-то эту лапшу прочитал и сразу выдал ответ?
Чтобы код обсуждать, его надо читать. Когда код опубликован так как у вас, то читать его тяжелее. Нужно не только вникать в то что код делает но и в то как он должен был выглядеть если бы был отформатирован.

Поэтому с вашей стороны было бы вежливо помочь людям понять вашу проблему, и рассказать о том что вы уже сделали чтобы её решить.
...
Рейтинг: 0 / 0
Многопоточность в передачи больших файлов
    #39651084
Denis2397
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123, спасибо. Но пацаны, правда помощь нужна, без приколов. Помогите
...
Рейтинг: 0 / 0
Многопоточность в передачи больших файлов
    #39651087
Denis2397
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Тема закрыта. В помощи и разборе кода более никто не нуждается. Те кто "постарше" можно и не указывать на возраст, грубо я ниче не написал. И если вы такие обидчевые ваше право. Всем успеха
...
Рейтинг: 0 / 0
Многопоточность в передачи больших файлов
    #39651088
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Denis2397Потеря данных при передачи. Логичный и предсказуемый вопрос, в чем причина?
"Ошибка в 17-й строке". Отлаживайся.
...
Рейтинг: 0 / 0
Многопоточность в передачи больших файлов
    #39651099
Denis2397
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov, Извините, но можно по подробнее. На сколько я понял вы про вторую часть моего сервера, private static OutputStream output. Верно?
...
Рейтинг: 0 / 0
Многопоточность в передачи больших файлов
    #39651109
mad_nazgul
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Denis2397,

Наймите программиста для решения задачи :-)
...
Рейтинг: 0 / 0
Многопоточность в передачи больших файлов
    #39651214
mr_virtus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Denis2397,

авторпередача одинарных файлов работает идеально, но при передачи нескольких файлов одновременно происходит потеря данных со стороны сервера или проблема в недозагруженности файлов

Ну посмотреть сколько данных отправляется, сколько принимается. Там понятно думаю будет, почему часть байтов теряется.
...
Рейтинг: 0 / 0
Многопоточность в передачи больших файлов
    #39651222
mr_virtus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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? Не прочитать же.
...
Рейтинг: 0 / 0
Многопоточность в передачи больших файлов
    #39651232
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mr_virtus,

действительно странное, тем более, что количество слешей определяется в 1 строку
...
Рейтинг: 0 / 0
Многопоточность в передачи больших файлов
    #39651241
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и ошибки обрабатывать нормально, а нет так. В stdout миллион туфты выводится, а ошибка при передачи просто игнорируется.

Код: java
1.
2.
3.
 catch (IOException lp) {

}
...
Рейтинг: 0 / 0
Многопоточность в передачи больших файлов
    #39651244
mr_virtus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадя,

автордействительно странное, тем более, что количество слешей определяется в 1 строку

И что дальше-то? Как это относится к именованию переменной? О чем вообщем разговор.
...
Рейтинг: 0 / 0
Многопоточность в передачи больших файлов
    #39651276
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mr_virtusИ что дальше-то? Как это относится к именованию переменной? О чем вообщем разговор.в том, что можно обойтись вообще без переменной
да и придумывать название переменной , которая используется в 4 строках - смысл?
зато так видно, что переменная "локальная-временная" и искать её использование ещё где-то нет смысла.
...
Рейтинг: 0 / 0
Многопоточность в передачи больших файлов
    #39651285
mr_virtus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадя,

авторда и придумывать название переменной , которая используется в 4 строках - смысл?
зато так видно, что переменная "локальная-временная" и искать её использование ещё где-то нет смысла.

Ну я структуру его кода здесь не обсуждаю. Может и можно обойтись вовсе без переменной. У него там ниже в if-ах используется эта переменная, далеко за пределами её инициализации.Не меняя принципиально структуру метода, slashCounter было бы понятное обозначение.
...
Рейтинг: 0 / 0
Многопоточность в передачи больших файлов
    #39651311
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mr_virtus, slashCounter было бы понятное обозначение.да , конечно. но , как я уже сказал, такое "осмысленное" название подразумевает "глобальное" использование.
а простое "f" - использовал в ближайших строках и забыл.
ну это только моё мнение.
...
Рейтинг: 0 / 0
Многопоточность в передачи больших файлов
    #39651372
rfq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Denis2397,

изучите MultipartFile из Spring, и вообще перейдите на Spring. Все равно рано или поздно перейдете.
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Многопоточность в передачи больших файлов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]