Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/21: Рейтинг темы: голосов - 21, средняя оценка - 4.62
0 / 0 / 0
Регистрация: 12.01.2015
Сообщений: 4

Зависает на чтении с InputStream

12.01.2015, 18:31. Показов 4341. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую. Проблема в том, что не могу получить в клиенте файл от сервера, отладка показала что функция зависает на 11 строке и никакой ошибки не выдает. Конструкторы класса ErrorMesage представлены ниже. Функции getFile(fileName) и getServerFileList() используют этот класс и работают исправно. Возможно в getFile(fileName) дело в том, что inputStream не равняется null.
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
public File getFile(String fileName) {
        File localTempFile = null;
        byte[] fileContent = new byte[getFileSize(fileName)];
        try {
            localTempFile = File.createTempFile("studentGrades", ".txt");
            Command cmdGetFile = Command.getCmdGetFile();
            Properties properties = new Properties();
            properties.put("fileName", fileName);
            cmdGetFile.setProperties(properties);
            sendCommandToServer(cmdGetFile);
            ErrorMessage errMsg = (ErrorMessage) inputStream.readObject();
            //inputStream.read(fileContent);
 
            if(errMsg == null || errMsg.getErrorText() == null || errMsg.getErrorText().isEmpty()){
                inputStream.read(fileContent);
                DataInputStream dataIs = new DataInputStream(inputStream);
                dataIs.readFully(fileContent);
            } else {
                return null;
            }
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
        //write fileContent to localTempFile
        return localTempFile;
    }
class ErrorMessage:
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class ErrorMessage implements Serializable{
    private static final long serialVersionUID = 1745845380334011351L;
    
    private String errorText;
    private String remoteStackTrace;
 
    public ErrorMessage() {
        this(null, null);
    }
 
    public ErrorMessage(String errorText, String remoteStackTrace) {
        super();
        this.errorText = errorText;
        this.remoteStackTrace = remoteStackTrace;
    }
...


public int getFileSize(String fileName):
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public int getFileSize(String fileName) {
        Command cmdGetFileSize = Command.getCmdGetFileSize();
        Properties properties = new Properties();
        properties.put("fileName", fileName);
        cmdGetFileSize.setProperties(properties);
        try {
            sendCommandToServer(cmdGetFileSize);
        } catch (IOException e1) {
            e1.printStackTrace();
        }
        
        int fileSize = -1;
        //read error message if null or empty then read file size
        try {
            fileSize = (int) inputStream.readObject();
        } catch (ClassNotFoundException | IOException e) {
            e.printStackTrace();
        }
        return fileSize;
    }


getServerFileList() :
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public List<String> getServerFileList() {
        Command cmdFileList = Command.getCmdGetList();
        try {
            sendCommandToServer(cmdFileList);
        } catch (IOException e) {
            e.printStackTrace();
        }
 
        try{
            ErrorMessage msg = (ErrorMessage) inputStream.readObject();
            if(msg == null || msg.getErrorText() == null || msg.getErrorText().isEmpty()){
                List<String> listOfFiles = (List<String>) inputStream.readObject();
                for(String file : listOfFiles) System.out.println(file);
                
                return listOfFiles;
            }
        } catch (ClassNotFoundException | IOException ex){
            ex.printStackTrace();
        }
        
        return new ArrayList();
    }
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.01.2015, 18:31
Ответы с готовыми решениями:

Зависает при чтении com порта
Привет всем, подскажите, пожалуйста, у меня есть прибор, с которого я считываю данные каждую секунду через ком порт, кроме этого моя...

«Зависает» при чтении com порта
Здравствуйте! Алгоритм программы следующий: «Читать до конца файла» 1.1 Программный reset ардуины, читаем очередную строку из...

TWI зависает при чтении
Общаюсь с BMP085. При чтении транзакция зависает (постоянно SCL=1, SDA=0): &lt;Изображение удалено&gt; На рисунке: START, SLA+W...

5
 Аватар для ne2win
206 / 206 / 71
Регистрация: 25.02.2014
Сообщений: 569
12.01.2015, 18:55
doctorx32, приведите листинг сервера, буфер очищаете при передаче?
0
0 / 0 / 0
Регистрация: 12.01.2015
Сообщений: 4
12.01.2015, 19:08  [ТС]
Kochmarik, спасибо за ответ. Нет, пробовал очищать ObjectOutputStream с помощью flush(), но это приводит к NullPointerException при подключении клиента.

В сервере функция getFile() судя по всему работает, ибо во время получения размера файла вычисление происходит правильно. Вопрос как как поулчить этот файл со стороны клиента.

Вся реализация сервера:
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
106
107
108
109
110
111
112
113
114
115
116
117
118
import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import java.nio.*;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
 
import sun.misc.IOUtils;
import rtu.dip386.praktiskais2.Server;
import rtu.dip386.praktiskais2.ServerClientWorker;
 
public class ServerImpl implements Server{
    private int serverPort = rtu.dip386.praktiskais2.Server.DEFAULT_PORT;
    private boolean acceptClients = false;
    private File fileDirectory = null;
    private ServerSocket serverSocket;
    private ObjectOutputStream oos;
 
    @Override
    public void setLocalPort(int portNumber) {
        // TODO Auto-generated method stub
        
    }
 
    @Override
    public int getLocalPort() {
        // TODO Auto-generated method stub
        
        return 0;
    }
 
    @Override
    public void startServer() {
        this.acceptClients = true;
        try{
            serverSocket = new ServerSocket(this.serverPort);
            while(this.acceptClients){
                System.out.println("waiting for connections @"+this.serverPort);
                Socket socket = serverSocket.accept();
                System.out.println("client accepted creating handler...");
                ServerClientWorker worker = new ServerClientWorkerImpl(socket, this);
                Thread clientThread = new Thread(worker);
                clientThread.start();
            }
        } catch (IOException ex){
            ex.printStackTrace();
            throw new IllegalStateException(ex);
        } finally{
            try{
                serverSocket.close();
            } catch (Exception ex){}
        }
    }
 
    @Override
    public void stopServer() {
        this.acceptClients = false;
    }
 
    @Override
    public void disconnectClient(int index) {
        // ignore
        
    }
 
    @Override
    public List<String> getFileList() {
        // TODO Auto-generated method stub
        return null;
    }
 
    @Override
    public byte[] getFile(String fileName) throws FileNotFoundException {
        File fileToRead = new File(fileDirectory, fileName);
        if(!fileToRead.exists()){
            System.out.println("FileNotFound: "+fileToRead.getAbsolutePath());
            throw new FileNotFoundException(fileName);
        }
        byte[] result = new byte[(int) fileToRead.length()];
        //TODO: read file data to byte array
        Path path = Paths.get(fileToRead.getAbsolutePath());
        try {
            //result = Files.readAllBytes(path);
            FileInputStream fis = new FileInputStream(fileToRead);
            fis.read(result);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return result;
    }
 
    @Override
    public void setFileDirectory(String directory) {
        fileDirectory = new File(directory); 
    }
 
    @Override
    public File getFileDirectory() {
        return fileDirectory;
    }
    
    public static void main(String[] args) {
        Server server = new ServerImpl();
        server.setLocalPort(Server.DEFAULT_PORT);
        server.setFileDirectory("C:/tmp/studentGrades/");
        server.startServer();
    }
}
0
 Аватар для ne2win
206 / 206 / 71
Регистрация: 25.02.2014
Сообщений: 569
12.01.2015, 19:38
doctorx32, не вижу где происходит передача, что в классе ServerClientWorkerImpl?
0
0 / 0 / 0
Регистрация: 12.01.2015
Сообщений: 4
12.01.2015, 19:45  [ТС]
извините, мне стоило сразу выложить все исходники, вот прошу:
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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
import java.io.File;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
 
import rtu.dip386.praktiskais2.Command;
import rtu.dip386.praktiskais2.Server;
import rtu.dip386.praktiskais2.ServerClientWorker;
import rtu.dip386.praktiskais2.ErrorMessage;
 
public class ServerClientWorkerImpl implements ServerClientWorker{
    private Socket socket;
    private Server server;
    private ObjectInputStream ois;
    private ObjectOutputStream oos;
    private Date connectDate = new Date();
    private boolean isError = false;
    
    public ServerClientWorkerImpl(Socket socket, Server server){
        this.socket = socket;
        this.server = server;
        try {
            this.oos = new ObjectOutputStream(socket.getOutputStream());
            this.oos.flush();
            this.ois = new ObjectInputStream(socket.getInputStream());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
 
    @Override
    public void run() {
        while(!socket.isClosed() && !isError){
            readCommand();
            try{
                Thread.sleep(100);
            } catch (InterruptedException ex){}
        }
    }
    
    private void readCommand(){
        Command cmd;
        try{
            cmd = (Command) ois.readObject();
 
            if(cmd.getAction().equals(Command.getCmdGetList().getAction())){
                writeFileList();
            } else if(cmd.getAction().equals(Command.getCmdGetFile())){
                String file = cmd.getProperties().getProperty("fileName");
                writeError(null);
                writeFile(file);
            } else if(cmd.getAction().equals(Command.getCmdGetFileSize().getAction())){
                String file = cmd.getProperties().getProperty("fileName");
                writeError(null);
                writeFileSize(file);
            }
        } catch (IOException | ClassNotFoundException ex){
            //ex.printStackTrace();
            isError = true;
        }
    }
    
    private void writeFile(String file) {
        // TODO Auto-generated method stub
        System.out.println("dsadsad");
    }
 
    private void writeFileList() {
        List<String> fileList = new ArrayList<>();
        try{
            File[] files = new File("C:/tmp/studentGrades").listFiles();
            for(File f : files){
                if(f.isFile())
                    fileList.add(f.getName());
            }
            oos.writeObject(new ErrorMessage());
            oos.flush();
            oos.writeObject(fileList);
            oos.flush();
            
        } catch (Exception ex){
            ex.printStackTrace();
            try{
                oos.writeObject(new ErrorMessage(ex.getMessage(), null));
                oos.flush();
            } catch (IOException e){}
        }
    }
 
    private void writeFileSize(String file){
        try{
            int fileSize = server.getFile(file).length;
            writeError(null);
            this.oos.writeObject(fileSize);
            this.oos.flush();
        } catch (IOException ex){
            ex.printStackTrace();
            //writeError(ex.getMessage());
        }
    }
 
    private ErrorMessage writeError(ErrorMessage e) {
        // TODO Auto-generated method stub
        return e;
    }
 
    @Override
    public InetAddress getClientAddress() {
        // TODO Auto-generated method stub
        return null;
    }
 
    @Override
    public int getClientPort() {
        // TODO Auto-generated method stub
        return 0;
    }
 
    @Override
    public Date getClientConnectDate() {
        // TODO Auto-generated method stub
        return null;
    }
 
    @Override
    public Socket getSocket() {
        // TODO Auto-generated method stub
        return null;
    }
}
0
 Аватар для ne2win
206 / 206 / 71
Регистрация: 25.02.2014
Сообщений: 569
12.01.2015, 20:35
doctorx32, Не знаю, тяжело читать код, проверьте еще раз, везде ли вы считываете то, что отправляете, то что программа зависает во время считывание, означает что данные не приходят, либо приходят не те которые нужны, и не злоупотребляйте flush(), в некоторых местах он лишний.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.01.2015, 20:35
Помогаю со студенческими работами здесь

Зависает форма при чтении из порта
Пишу программку, которая читает данные из серийного порта. Но форма повисает, пока чтение не закончится. Подскажите, пожалуйста, как...

Зависает программа при чтении из файла
За код прошу сильно не пинать)Черновой пока вариант) unit Unit1; interface uses Windows, Messages, SysUtils, Variants,...

При чтении com порта зависает приложение
Вот эта строка кода вешает всё приложение: textBox1-&gt;Text = serialPort1-&gt;ReadLine(); Если её убрать всё работает нормально. Подскажите...

Поток сокета зависает при чтении больших страниц
Создаю сокет. у него есть свой поток. Считываю данные например ReadByte и все. поток намертво зависает и уже никогда не проснется. Таймаут...

анимацимированная gif картинка зависает при чтении excel файла
Добрый день уважаемые форумчане !!! Прошу помощи у гуру !!! пишу обработку при которой есть загрузка данных из excel файла ... ...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru