Форум программистов, компьютерный форум, киберфорум
Java: Сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/72: Рейтинг темы: голосов - 72, средняя оценка - 4.64
 Аватар для Drygba
512 / 454 / 119
Регистрация: 17.02.2012
Сообщений: 1,032
Записей в блоге: 1

Ошибка EOFException при передаче файлов через socket

13.12.2012, 18:12. Показов 14023. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
есть сервер
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
public class ServerPart {
    JTextArea area;
    
    ServerPart(){
        JFrame f = new JFrame("Server");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setSize(200, 250);
        f.setLayout(new BorderLayout());
        
        area = new JTextArea();
        f.add(area);
        
        f.setAlwaysOnTop(true);
        f.setVisible(true);
        connect();
        
    }
   
    public void connect(){
        int port = 2154;
        
        try {
            ServerSocket ss = new ServerSocket(port);
            area.append("Wait connect...");
            
            while(true){
                Socket soket = ss.accept();
        
                InputStream in = soket.getInputStream();
                DataInputStream din = new DataInputStream(in);
            
                int filesCount = din.readInt();//получаем количество файлов
                area.setText("Передается " + filesCount + " файлов\n");
                
                for(int i = 0; i<filesCount; i++){
                    area.append("Прием " + (i+1) + "вого файла: \n");
                        
                    long fileSize = din.readLong(); // получаем размер файла
                                
                    String fileName = din.readUTF(); //прием имени файла
                    area.append("Имя файла: " + fileName+"\n");
                    area.append("Размер файла: " + fileSize + " байт\n");
            
                    byte[] buffer = new byte[64*1024];
                    FileOutputStream outF = new FileOutputStream(fileName);
                    int count, total = 0;
                    
                    while ((count = din.read(buffer)) != -1){               
                        total += count;
                        outF.write(buffer, 0, count);
                    
                        if(total == fileSize){
                            break;
                        }
                    }
                    outF.flush();
                    outF.close();
                    area.append("Файл принят\n---------------------------------\n");          
                }
            }
        }
        catch(Exception e){
            e.printStackTrace();
        }
    }
   public static void main(String[] arg){
       new ServerPart();
   }
}

есть клиент
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
public class ClientPart {
 
    JTextArea area;
    JTextField field;
    Socket socket;
    ArrayList<String> selectFiles;
    ClientPart(){
                
        JFrame f = new JFrame("Client");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setSize(300, 200);
        f.setLayout(new BorderLayout());
        f.setVisible(true);
        
        area = new JTextArea();
        field = new JTextField(20);
        final JButton selectBut = new JButton("Select");
        
        final JButton but = new JButton("Send");
        but.setEnabled(false);
        f.add(but, BorderLayout.SOUTH);
        f.add(area);
        f.add(selectBut, BorderLayout.NORTH);           
        
        but.addActionListener(new ActionListener() {
        
            @Override
            public void actionPerformed(ActionEvent arg0) {
                sendFiles(selectFiles); 
            }
        });
        
        selectBut.addActionListener(new ActionListener() {
            
            @Override
            public void actionPerformed(ActionEvent e) {
                JFileChooser chooser = new JFileChooser();
                chooser.setMultiSelectionEnabled(true);
                selectFiles = new ArrayList<String>();
                area.setText("");
                int returnVal = chooser.showOpenDialog(null);
                
                if (returnVal == JFileChooser.APPROVE_OPTION){
                    area.append("Выбранны файлы для передачи:\n" );
                    File[] file = chooser.getSelectedFiles();
                    for (File d : file){
                        selectFiles.add(d+"");
                        area.append(d+"\n");
                    }       
                    but.setEnabled(true);
                }
            }
        });  
    }
    
    private void sendFiles(ArrayList<String> list){
        //----------------------------------------------
        int port = 2154;
        String addres = "127.0.0.1";
        InetAddress ipAddress = null;
        try {
            ipAddress = InetAddress.getByName(addres);
            socket = new Socket(ipAddress, port);
        } 
        catch (UnknownHostException e) {
            e.printStackTrace();
        }
        catch (IOException e) {
            e.printStackTrace();
        }
        //----------------------------------------------
        int countFiles = list.size();
        
        DataOutputStream outD; 
        try{
            outD = new DataOutputStream(socket.getOutputStream());
            
            outD.writeInt(countFiles);//отсылаем количество файлов
                        
            for(int i = 0; i<countFiles; i++){
                File f = new File(list.get(i));
                                
                outD.writeLong(f.length());//отсылаем размер файла
                outD.writeUTF(f.getName());//отсылаем имя файла
            
                FileInputStream in = new FileInputStream(f);
                byte [] buffer = new byte[64*1024];
                int count;
                
                while((count = in.read(buffer)) != -1){
                    outD.write(buffer, 0, count);
                }
                outD.flush();
                in.close();
            }           
            socket.close();         
        }
        catch(IOException e){
            e.printStackTrace();
        }   
    }
    public static void main(String[] args) {
        new ClientPart();
    }
}

при передаче нескольких файлов иногда (чаще всего) выскакивает исключение
java.io.EOFException
at java.io.DataInputStream.readFully(Unknow n Source)
at java.io.DataInputStream.readLong(Unknown Source)
at ClienServer.ServerPart.connect(ServerPar t.java:52) --- это строка с кодом long fileSize = din.readLong();
at ClienServer.ServerPart.<init>(ServerPart .java:29)
at ClienServer.ServerPart.main(ServerPart.j ava:81)
что такого остается в потоке, что приводит к ошибке или что не так с потоком?
4
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.12.2012, 18:12
Ответы с готовыми решениями:

Пересылка больших файлов через Socket
Привет Пишу клиент сервер и проблема такая При передачи маленьких файлов все ок, файл доходит целым и слово Done успешно отправляется ...

Struts проблема при передаче нескольких параметров через ссылку
Ссылка в jsp &lt;html:link action='langs.do?parm=ru&amp;str=index'&gt; сервер говорит что должно заканчиваться на ; Это проблема стратса или...

Ошибка OutOfMemoryException при передаче больших файлов
Приветствую! Используя приложение (клиент сервер), при передаче больших файлов выходит ошибка: Выдано исключение типа...

11
1 / 1 / 1
Регистрация: 13.10.2012
Сообщений: 101
15.10.2013, 12:35
Кто-нибудь нашел решение как передавать сразу несколько файлов?

По одному файлу все работает, а вот при передаче 2-х и более на втором файле передача зависает.
0
 Аватар для Skipy
2000 / 1427 / 92
Регистрация: 25.11.2010
Сообщений: 3,611
15.10.2013, 13:00
Цитата Сообщение от Klafe Посмотреть сообщение
По одному файлу все работает, а вот при передаче 2-х и более на втором файле передача зависает.
Ошибка в строке 42.
0
1 / 1 / 1
Регистрация: 13.10.2012
Сообщений: 101
15.10.2013, 13:06
Точно 42?
0
 Аватар для Skipy
2000 / 1427 / 92
Регистрация: 25.11.2010
Сообщений: 3,611
15.10.2013, 13:33
Цитата Сообщение от Klafe Посмотреть сообщение
Точно 42?
Других вариантов по Вашему коду не вижу.
0
1 / 1 / 1
Регистрация: 13.10.2012
Сообщений: 101
15.10.2013, 13:42
42 строка у сервера:
Java
1
area.append("Размер файла: " + fileSize + " байт\n");
У клиента 42 строка пустая.

Вы наверное номер строки перепутали. Или я чего не понимаю.

Добавлено через 3 минуты
Проблема в этом коде у меня следующая:

когда принимается второй файл сервером, то в цикле:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
 for(int i = 0; i<filesCount; i++){
                    area.append("Прием " + (i+1) + "вого файла: \n");
                        
                    long fileSize = din.readLong(); // получаем размер файла
                                
                    String fileName = din.readUTF(); //прием имени файла
                    area.append("Имя файла: " + fileName+"\n");
                    area.append("Размер файла: " + fileSize + " байт\n");
            
                    byte[] buffer = new byte[64*1024];
                    FileOutputStream outF = new FileOutputStream(fileName);
                    int count, total = 0;
                    
                    while ((count = din.read(buffer)) != -1){               
                        total += count;
                        outF.write(buffer, 0, count);
                    
                        if(total == fileSize){
                            break;
                        }
                    }
                    outF.flush();
                    outF.close();
                    area.append("Файл принят\n---------------------------------\n");            
                }
            }
не срабатывает метод корректно метод din.readLong();. Размер второго файла не принимается, хотя клиент его корректно отправляет.
0
 Аватар для Skipy
2000 / 1427 / 92
Регистрация: 25.11.2010
Сообщений: 3,611
15.10.2013, 17:26
Цитата Сообщение от Klafe Посмотреть сообщение
42 строка у сервера:
Java
1
area.append("Размер файла: " + fileSize + " байт\n");
У клиента 42 строка пустая.

Вы наверное номер строки перепутали.
Не может быть! В моем хрустальном шаре явно виден номер строки - 42! Он светится и переливается!

Или я чего не понимаю.
Вы не понимаете очевидного - если Вы говорите о проблеме в Вашем коде из разряда "не работает", то без публикации Вашего кода разобраться в проблеме не сможет НИКТО. Или Вы действительно искренне уверены, что передачу файлов можно написать одним единственным способом?

Вот Вы привели какой-то код. Серверный. Что такое din? Где он создается, как? Что такое filesCount? Откуда он?

Вы пишете, что "не срабатывает метод корректно метод din.readLong();. Размер второго файла не принимается, хотя клиент его корректно отправляет.". Так вот, это ВЫ утверждаете, что клиент его отправляет корректно. КОД ГДЕ? Вы не понимаете, что приводить надо код с обеих сторон проблемы?
0
15.10.2013, 17:43

Не по теме:

Ох уж эта неустаревающая шутка про 42 :jokingly:

0
15.10.2013, 18:52

Не по теме:

Цитата Сообщение от Gibby Посмотреть сообщение
Ох уж эта неустаревающая шутка про 42 :jokingly:
Что убивает - многие воспринимают это серьезно. Смотрят в 42-ю строку и пытаются там что-то найти.

2
1 / 1 / 1
Регистрация: 13.10.2012
Сообщений: 101
16.10.2013, 05:47
Цитата Сообщение от Skipy Посмотреть сообщение
Вы пишете, что "не срабатывает метод корректно метод din.readLong();. Размер второго файла не принимается, хотя клиент его корректно отправляет.". Так вот, это ВЫ утверждаете, что клиент его отправляет корректно. КОД ГДЕ? Вы не понимаете, что приводить надо код с обеих сторон проблемы?
Код в первом сообщении этой темы!

Про него я говорю и из него беру и дины и файлкаунты (тема эта из-за этого кода и была поднята, как я понимаю)!

Там, в первом сообщении, которое написал Drygba, есть два плюсика, на них нажимаем и БИНГО, вот он код!

Но я уже в нем разобрался, ошибка, если кому интересно, в строке 48 листинга сервера.

Спасибо за внимание!
1
0 / 0 / 0
Регистрация: 20.04.2015
Сообщений: 1
03.05.2015, 17:06
Klafe, так а в чём ошибка? Помогите разобраться, пожалуйста.
0
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
05.05.2015, 10:38
Никита Юницин, Запрашивается на чтение больше чем нужно.
48-ю строчку надо заменить надо на что-то вроде такого:
Java
48
   while ((count = din.read(buffer, 0, Math.min(buffer.length, fileSize-total))) != -1){
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.05.2015, 10:38
Помогаю со студенческими работами здесь

Ошибка в кодировке при передаче через URL
var sql=&quot;SELECT `name`, `number` FROM `test1` WHERE `name` like 'абвгдabcd123'&quot;; xmlhttp.open(&quot;GET&quot;,&quot;searchIt.php?sql=&quot;+sql,true); ...

Ошибка при передаче массива через JSON Unexpected token &
Простейший код, передающий из PHP в Javascript массив, вызывает ошибку в момент парсинга на стороне javascript &lt;?php $data = ...

Ошибка при передаче строк в функцию, ошибка при формировании дерева
Курсовой проект, в основе база данных, данные записываются в двоичное дерево. Есть 2 проблемы: 1) Если я считываю структуру с файла...

Отправка файлов через non blocking socket
доброго времени суток. пытаюсь реализовать отправку файлов через nonblocking socket в справке по делфи нашёл код(представлен чуть...

Передача файлов через Tcp/Ip Socket
Всем привет. Как возможно передавать файлы в размерах от 200-500 мб.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru