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

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

13.12.2012, 18:12. Показов 13976. Ответов 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
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru