Передача файлов клиент-серверного приложения - PullRequest
0 голосов
/ 11 мая 2011

В настоящее время я пытаюсь разработать клиент-серверное приложение, что-то вроде этого: пользователь подключается к серверу, и когда аутентификация в порядке, сервер отправляет пользователю некоторые файлы.Проблема в том, что эти файлы записаны в одном файле (с моим методом).

Вот некоторый код:

Функция, которая передает файл

public void processFile(int id, DataOutputStream oStream, Socket socket, int tip){
        String fileName;
        if(tip==0){
            fileName="File"+Integer.toString(Intrebari[id])+".txt";
        }else{
            fileName="Image"+Integer.toString(Intrebari[id])+".jpg";
        }
        byte[] buffer=null;
        int bytesRead = 0;
        FileInputStream file=null;

        try {
            file = new FileInputStream(fileName);
            buffer = new byte[socket.getSendBufferSize()];
            while((bytesRead = file.read(buffer))>0)
                {
                oStream.write(buffer,0,bytesRead);
                }
            file.close();
        } catch (IOException ex) {
           System.out.println(ex);
        }

    }

И функция, которая выбирает, какой файл должен быть отправлен

private void send(int id) throws IOException {
        os.writeBytes("sendFile" + id+"\n");

        System.out.println("sendFile" + id);
        generatedFiles.processFile(id, os, comunicare, 0);
        if (generatedFiles.Imagini[id] == 1) {
            os.writeBytes("sendImage" + id+"\n");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException ex) {
                Logger.getLogger(clientThread.class.getName()).log(Level.SEVERE, null, ex);
            }
            System.out.println("sendImage" + id);
            generatedFiles.processFile(id, os, comunicare, 1);
        }
    }

Я должен отметить, что os это DataOutputStream, а comunicare это Socket тип.

Я думаюпроблема в том, что я объединяю writeBytes с write.Может кто-нибудь помочь мне с этой проблемой?Как я могу заставить сервер и клиент получать и файлы, и сообщения?

1 Ответ

1 голос
/ 11 мая 2011

Я делаю что-то вроде этого:

Server -send Command Сервер-отправить файл Клиент подтверждает файл успешно

Команда Server -send Сервер-отправить файл Клиент-подтверждает файл успешно ...

вот так ... Предположим, у вас есть сокет от клиента, чем вы ...

socket.getOutputStream.write ("ФАЙЛ: SomeFile.bin, РАЗМЕР: 872973493 \ r \ n" .getBytes ("выберите кодировку")) socket.getOutputStream.flush (); (вам нужно будет выполнить сброс только в том случае, если вы ожидаете ответа от строки сервера, например: ОК, ОТПРАВЬТЕ ФАЙЛ, IM ГОТОВ, в противном случае тоже не нужно) клиент читает и видит, что это файл, и он имеет размер в байтах, поэтому он начинает чтение из socket.getInputStream, пока не получит ожидаемую длину файла. после этого клиенты подтверждают, что он получил файл

тогда сервер может отправить другой файл, вы можете сделать вместо ФАЙЛА, использовать ИЗОБРАЖЕНИЕ: или что угодно. Вам просто нужно прочитать сообщение со стороны клиента, чтобы увидеть, является ли это файл или изображение

Вот некоторые функции, которые могут вам помочь:

public static void readInputStreamToFile(InputStream is, FileOutputStream fout,
        long size, int bufferSize) throws Exception
{
    byte[] buffer = new byte[bufferSize];
    long curRead = 0;
    long totalRead = 0;
    long sizeToRead = size;
    while(totalRead < sizeToRead)
    {
        if(totalRead + buffer.length <= sizeToRead)
        {
            curRead = is.read(buffer);
        }
        else
        {
            curRead = is.read(buffer, 0, (int)(sizeToRead - totalRead));
        }
        totalRead = totalRead + curRead;
        fout.write(buffer, 0, (int) curRead);
    }
}


public static void writeFileInputStreamToOutputStream(FileInputStream in, OutputStream out, int bufferSize) throws Exception
{
    byte[] buffer = new byte[bufferSize];
    int count = 0;
    while((count = in.read(buffer)) != -1)
    {
        out.write(buffer, 0, count);
    }
}
...