Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> и снова передача файлов, сессия чата и передачи файлов 
:(
    Опции темы
hagerds
Дата 20.5.2012, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 12.12.2011

Репутация: нет
Всего: нет



Всем добрый день!

Я создаю соединение клиента с сервером. Между ними передаю строки не разрывая соединения. (тоесть чата). 
Мне надо передать файлы побайтно по сети. отдельно это реализовал, а как с чатом не понимаю. 
К примеру по нажатию клавиши я попадаю в case 2: и передаю коллекцию файлов, для передачи по сети. Прохожу её итератором. Дальше джидаевским способом создаю поток для передачи байт итому клиенту. Без закрытия потока, клиент не получает последней порции передоваемых байт. По закрытию потока мы не можем передать ещё один файл и тем более строку т.к. поток мы закрыли. smile 

Вопрос! как правильно передать файл / лы. не разрывая соединения с чатом?

вот куски кода.
Код

...
ServerSocket s = new ServerSocket(p);
while (true) {
    Socket client = s.accept();
    t = new ConnectionOfClient(client, client.getPort());
    clientList.add((ConnectionOfClient) t);

    t.start();
}
...
class ConnectionOfClient extends Thread {

    Socket sock;
    int port;
    Scanner in;
    PrintWriter out;
    
    public ConnectionOfClient(Socket s, int PORT) {
        sock = s;
        port = PORT;
    }
...
    public void run() {
        in = new Scanner(sock.getInputStream());
        out = new PrintWriter(sock.getOutputStream(), true);
        while (done) {
            //inte - число из передоваемой строки. достаю с помошью JSON
            switch (inte) {
            case 1://чат
            ...
            break;
            case 2:// передача файлов
            ...
            while (it.hasNext()) {// здесь коллекция файлов, которые надо передать
                File f = (File) it.next();
                try {
                    InputStream in = new FileInputStream(f);
                    OutputStream out = new BufferedOutputStream(sock.getOutputStream());
                    int bbb = 8192;
                    byte[] dataFile= new byte[8192];
                    long fileLength =  f.length();
                    long length = 0;
                    int carrentLength = 0;
                    try {
                        while (carrentLength < fileLength) {
                        if((length = fileLength - carrentLength) < bbb) {
                            dataFile= new byte[(int)length];
                        }
                        length = in.read(dataFile);
                        out.write(dataFile, 0, (int)length);
                        carrentLength += length;
                        }
                  } catch (ArrayIndexOutOfBoundsException e1) {
                      e1.printStackTrace();
                  }catch (FileNotFoundException e1) {
                      e1.printStackTrace();
                  }
                   out.close();
               } catch (IOException e1) {
                    e1.printStackTrace();
               }
            }    
            break;
            case 99:
                done = false;//выход
            break;
            }
    }


Это сообщение отредактировал(а) hagerds - 20.5.2012, 13:53
PM MAIL   Вверх
hagerds
Дата 20.5.2012, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 12.12.2011

Репутация: нет
Всего: нет



мысль пришла в голову. можно передать файл по другому порту, но при этом придётся создавать на клиенте ServerSocket. а это мне кажется не есть холошо.




Это сообщение отредактировал(а) hagerds - 20.5.2012, 21:41
PM MAIL   Вверх
hagerds
Дата 20.5.2012, 21:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 12.12.2011

Репутация: нет
Всего: нет



Нашол интересный класс DataInputStream но при передаче строки передаётся часть байтов. Что ведёт к краху передачи файлов.

саветы на других форумах нашол говорят надо писать свой протакол. где хоть про это посмотреть?
 smile  smile  smile 

Это сообщение отредактировал(а) hagerds - 20.5.2012, 21:41
PM MAIL   Вверх
Dummy
Дата 21.5.2012, 08:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 263
Регистрация: 21.5.2007

Репутация: 1
Всего: 19



В вашем изначальном коде вы после out.write() не делаете out.flush(). Измените, и тогда должны все данные приходить без закрытия потока. После первого файла сможете передать второй и т. д.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Работа с сетью | Следующая тема »


 




[ Время генерации скрипта: 0.0704 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.