Форум программистов, компьютерный форум, киберфорум
Java: Сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
 Аватар для waip
7 / 7 / 1
Регистрация: 27.05.2011
Сообщений: 297

Методы чтения из сети

21.07.2014, 09:37. Показов 665. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет. Возникла задача получать данные из сети. Что я делаю

Java
1
Socket cs = new Socket("127.0.0.1",49190);
Далее чтобы почитать делаю

Java
1
InputStream in = cs.getInputStream();
и вызываю in.read();

Это меня вполне устраивало.. Однако информации прилетает достаточно хорошо и в цикле читать по одному байту занимает ощутимое время... Что я решил сделать

заменить метод на in.read(new byte[количество_доступных_байт])

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

Начал использовать программу и понял что обработка идет не верно! Вот как собирается информация

read:
[-128][0][1][8][1][0][0][0][127][0][0][1]

read(в массив байтов)
[128][0][1][8][3][0][0][0][127][0][0][1]

И тут я кое что понял..

read возвращает int. А что если по сети придет FF (255) и тогда если попытаться запихать FF в массив байтов я получаю -1 потому что значение оказалось большое для переменной типа байта...

На самом деле я хотел узнать.. может существует какой то метод на подобии
read(int[] massive)

Я бы мог загонять вручную в интовский массив через in.read НО боюсь это будет сильно сказываться на скорости. Суть вся в том что я перехватываю сообщения приложения А и пересылаю их приложению Б. Можно так сказать что я слушаю то что происходит между ними...

Или может можно как то скопировать допупные байты в какой-нибудь буфер и дальше работать?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.07.2014, 09:37
Ответы с готовыми решениями:

методы чтения, обновления, удаления
есть класс using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication2 ...

Реализовать «синхронные» методы чтения/записи для переменной типа String в java
Всем Здорова! Тут такая проблемка, нужно реализовать методы чтения/ записи для переменной типа string по следующим правилам: ...

Файл БД в сети доступен только для чтения, как исправить?
Здравствуйте, уважаемые программисты, прошу мне помочь советом, у нас в офисе существует база данных с заказами, лежит на диске обмена,...

9
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
21.07.2014, 10:04
Цитата Сообщение от waip Посмотреть сообщение
read возвращает int. А что если по сети придет FF (255) и тогда если попытаться запихать FF в массив байтов я получаю -1 потому что значение оказалось большое для переменной типа байта...
Тут я логику вообще не понял. Вы про какой read? Про тот что в массив читает или только один байт?

Попробуйте использовать методы из commons-io для упрощения работы. Вот этот например - IOUtils.html#read
0
 Аватар для waip
7 / 7 / 1
Регистрация: 27.05.2011
Сообщений: 297
21.07.2014, 10:08  [ТС]
Цитата Сообщение от turbanoff Посмотреть сообщение
Вы про какой read?
Про тот что в массив.
0
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
21.07.2014, 10:11
waip, Так, дальше.
Цитата Сообщение от waip Посмотреть сообщение
А что если по сети придет FF (255)
FF - это количество байт, или значение того байта, который пришел?

Добавлено через 2 минуты
В общем, чего ходить вокруг да около. Ваша догадка скорее всего не верна. Проблема в вашей реализации. Нужно смотреть код.
0
 Аватар для waip
7 / 7 / 1
Регистрация: 27.05.2011
Сообщений: 297
21.07.2014, 10:11  [ТС]
Значение того байта, который пришел.

(Я жеж говорю. Мне реально по сети пришло 128. По итогу -128 оказалось в массиве ибо он байтовский)
0
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
21.07.2014, 10:15
waip, 128 не может поместиться в байт. У байта 127 - максимальное значение. Вы, наверное, выводите его как-то не так.
0
 Аватар для waip
7 / 7 / 1
Регистрация: 27.05.2011
Сообщений: 297
21.07.2014, 10:19  [ТС]
Да... Вы правы.. Не будем ванговать.

*Задание для второго потока смотреть не обязательно(он делает тоже самое только читает и пишет в другую сторону так сказать поток для ответов)
Кликните здесь для просмотра всего текста
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
public class JavaApplication225 {
 
    public static void main(String[] args) throws IOException {
        ServerSocket ss = new ServerSocket(39190);
        final Socket s = ss.accept();
        System.out.println("Connected");
        final Socket cs = new Socket("127.0.0.1",49190);
        Thread t2 = new Thread(new Runnable() {
 
            @Override
            public void run() {
                try {
                    InputStream in = cs.getInputStream();
                    OutputStream out = s.getOutputStream();
                      System.out.println();
                    /* Начало рабочей реализации
                    *int opx;                  
                    *while(true){
                    *    opx = in.read();
                    *     System.out.print("["+opx+"]");
                    *   out.write(opx);
                    *   out.flush(); 
                    *}
                      Конец рабочей реализации  */
                    //Начало не рабочей реализации
                    int size;
                    byte[] b;
                    while(true){
                        size = in.available();
                        b = new byte[size];
                        if(size != 0){
                        System.out.println("[S - C]AVAILABLE SIZE = "+size);
                        out.write(in.read(b));
                        System.out.println("B_LENGTH = "+b.length);
                        System.out.println();
                        for(byte bb: b){
                            System.out.print("["+bb+"]");
                        }
                        out.flush();   
                        }
                    }
                    //Конец не рабочей реализации
                } catch (IOException ex) {
                    Logger.getLogger(JavaApplication225.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        });
        
        Thread t = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    InputStream in = s.getInputStream();
                    OutputStream out = cs.getOutputStream();
                    //OutputStream out = s.getOutputStream();
                     System.out.println();
                  int opx;
                    while(true){
                        opx = in.read();
                         System.out.print("["+opx+"]");
                       out.write(opx);
                       out.flush(); 
                    }
//                    int size;
//                    byte[] b;
//                    while(true){
//                        size = in.available();
//                        b = new byte[size];
//                        if(size != 0){
//                        System.out.println("[C - S]AVAILABLE SIZE = "+size);
//                        out.write(in.read(b));
//                        System.out.println("B_LENGTH = "+b.length);
//                        System.out.println();
//                        for(byte bb: b){
//                            System.out.print("["+bb+"]");
//                        }
//                        out.flush();   
//                        }
//                    }
//                  while(true){
//                       out.write(in.read());
//                       out.flush(); 
//                    }
                } catch (Exception ex) {
                    Logger.getLogger(JavaApplication225.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        });
        t.start(); t2.start();
    }


В первом потоке я закоментировал... То что закоментировано в первом потоке - работает. Чуть ниже текущая версия, но она не верно работает.
0
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
21.07.2014, 11:51
waip, in.read(b) возвращает количество элементов, которые считались из потока. И это число не обязательно будет равно in.available(), оно может быть и меньше. Это необходимо учитывать.
InputStream.available возвращает количество байт, который можно считать без блокирования. Это не значит, что всё это количество байт можно считать за раз, одним вызовом read.

PS. Первый поток - это t2, я правильно понял?
0
 Аватар для waip
7 / 7 / 1
Регистрация: 27.05.2011
Сообщений: 297
21.07.2014, 12:14  [ТС]
Немного реорганизовал(Если есть замечания по организации - готов принять к сведению).
Кликните здесь для просмотра всего текста

Java
1
2
3
4
5
6
7
8
9
    public static void main(String[] args) throws IOException {       
        Thread t2 = new Thread(new Task(AuthCommunication.getInstance().getLoginIS(),
                                        AuthCommunication.getInstance().getClientOS()));
        Thread t = new Thread(new Task(AuthCommunication.getInstance().getClientIS(),
                                       AuthCommunication.getInstance().getLoginOS()));
 
        
        t.start(); t2.start();
    }
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
public class Task implements Runnable{
    private InputStream in;
    private OutputStream out; 
    
    public Task(InputStream in, OutputStream out){
        this.in = in;
        this.out = out;
    }
 
    @Override
    public void run() {
            try{
                int opx;                  
                while(true){
                    opx = in.read();
                    out.write(opx);
                    out.flush(); 
                }
            }catch(Exception ex){
               ex.printStackTrace();
            }
    }
    
}
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
public class AuthCommunication {
    private ServerSocket proxy;
    private Socket clientSource;
    private Socket loginSource;
    
    private AuthCommunication() {
        try {
            proxy = new ServerSocket(39190);
            clientSource = proxy.accept();
            loginSource = new Socket("127.0.0.1",49190);
        } catch (IOException ex) {
            Logger.getLogger(AuthCommunication.class.getName()).log(Level.SEVERE, null, ex);
            System.exit(1);
        }
    }
    
    public Socket getClientSource(){
        return clientSource;
    }
    
    public InputStream getClientIS() throws IOException{
        return clientSource.getInputStream();
    }
    public OutputStream getClientOS() throws IOException{
        return clientSource.getOutputStream();
    }
    
    public Socket getLoginSource(){
        return loginSource;
    }
    
    public InputStream getLoginIS() throws IOException{
        return loginSource.getInputStream();
    }
    public OutputStream getLoginOS() throws IOException{
        return loginSource.getOutputStream();
    }
    
    public static AuthCommunication getInstance() {
        return AuthCommunicationHolder.INSTANCE;
    }
    
    private static class AuthCommunicationHolder {
 
        private static final AuthCommunication INSTANCE = new AuthCommunication();
    }
}

К вопросу о потоках. Я нарисовал схемку(см приложение).
Миниатюры
Методы чтения из сети  
0
 Аватар для waip
7 / 7 / 1
Регистрация: 27.05.2011
Сообщений: 297
21.07.2014, 12:16  [ТС]
Цитата Сообщение от turbanoff Посмотреть сообщение
PS. Первый поток - это t2, я правильно понял?
Изначально не понял.. потом дошло.. Да.. первый поток t2. Обозвал его первым т.к по ходу листинга первый. Не совсем удачно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.07.2014, 12:16
Помогаю со студенческими работами здесь

Методы шифрования в сети Wi Fi
Доброго времени всем! Поиск результатов не принес, так что пришлось создать данную тему :pardon:. Имеется два ноутбука RoverBook...

Как открыть файл для чтения/записи по локальной сети на удалённой машине?
Проблема следующая. 1. В сети на одном компе есть расшаренная папка с доступом локального пользователя.у компа две подсети A и B и он не...

Сервер HP Primergy Econel 200 S2, Win2008R2 x64, RAID10 4x2000Gb падает скорость чтения/записи по сети
Здравствуйте. Подскажите, пожалуйста, в чем может быть проблема: Сервер бэкапов HP Primergy Econel 200 S2 Встроенный SATA RAID...

Защита чтения Flash памяти от пиратского чтения у STM8S
Добрый день STMовцы! Есть ли защита от чтения прошивки с флеш у STM8S? Если есть, то какими программно-аппаратными средствами можно это...

Каким образом после чтения из файла, узнать позицию для чтения следующего куска байт
Здравствуйте, задача такова есть файл, размером 1000 байт, нужно открыть его считать 100 байт, после чтения закрыть. Потом опять открыть...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru