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

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

12.01.2015, 18:31. Показов 4277. Ответов 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
Ответ Создать тему
Новые блоги и статьи
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Old Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru