Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Работа с сетью > и снова передача файлов


Автор: hagerds 20.5.2012, 13:02
Всем добрый день!

Я создаю соединение клиента с сервером. Между ними передаю строки не разрывая соединения. (тоесть чата). 
Мне надо передать файлы побайтно по сети. отдельно это реализовал, а как с чатом не понимаю. 
К примеру по нажатию клавиши я попадаю в 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:56
мысль пришла в голову. можно передать файл по другому порту, но при этом придётся создавать на клиенте ServerSocket. а это мне кажется не есть холошо.



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

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

Автор: Dummy 21.5.2012, 08:29
В вашем изначальном коде вы после out.write() не делаете out.flush(). Измените, и тогда должны все данные приходить без закрытия потока. После первого файла сможете передать второй и т. д.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)