Отправить стоп-сообщение в сокет - PullRequest
0 голосов
/ 28 февраля 2012

Я хочу эффективный и быстрый способ отправки сообщения остановки в сокет.

У меня есть метод, который отправляет файлы с одного компьютера на другой. Все файлы от отправителя появляются на ПК получателя. Однако все данные записываются в первый файл (только). Другие файлы существуют, но они пусты. Это происходит потому, что метод получателя не знает, когда начинать запись в следующий файл.

Отправитель

public static void sendFile (final Socket sock, File source)
{
    FileInputStream fileIn = null;

    try
{
        //Read bytes from the source file
        fileIn = new FileInputStream(source);

        //Write bytes to the receive
        //No need to use a buffered class, we make our own buffer.
        OutputStream netOut = sock.getOutputStream();

        byte[] buffer = new byte[BUFFER_SIZE];
        int read;

        while ((read = fileIn.read(buffer)) != -1)
        {
            netOut.write(buffer, 0, read);
            netOut.flush ();
        }
        //Send some stop message here
}
    catch (Exception e)
{
        e.printStackTrace ();
}
    finally
    {
        if (fileIn != null)
        {
            try
            {
                fileIn.close ();
            }
            catch (IOException e)
            {
                e.printStackTrace ();
            }
        }
    }
}

//Send files via socket
public static void sendFile (final Socket sock, File[] source)
{
    for (int i = 0; i < source.length; i++)
        sendFile (sock, source[i]);
}

Получатель:

public static void receiveFile (final Socket sock, File destination)
{
    BufferedOutputStream out = null;

    try
    {
        //Receive data from socket
        InputStream clientInputStream = sock.getInputStream();

        //Write bytes to a file
        out = new BufferedOutputStream (new FileOutputStream (destination));

        byte[] buffer = new byte[BUFFER_SIZE];
        int read;
        while (true)
        {
            read = clientInputStream.read(buffer);


            out.write(buffer, 0, read);
            out.flush ();
        }
    }
    catch (IOException e)
    {
        e.printStackTrace ();
    }
    finally
    {
        if (out != null)
        {
            try
            {
                out.close ();
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
        }
    }
}

//Receive files via socket
public static void receiveFile (final Socket sock, File[] destination)
{
    for (int i = 0; i < destination.length; i++)
        receiveFile (sock, destination[i]);
}

Ответы [ 2 ]

2 голосов
/ 28 февраля 2012

Вам необходимо изменить свой протокол отправки / получения, чтобы включить хотя бы минимальный заголовок перед отправкой файла. Ваш заголовок должен включать как минимум размер данных, которым нужно следовать, и все, что вам может понадобиться (например, имя файла).

0 голосов
/ 02 марта 2012

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

public static void sendFile (Socket sock, File source)
{
    FileInputStream fileIn = null;

    try
    {
        //Read bytes from the source file
        fileIn = new FileInputStream(source);

        //Write bytes to the receive
        //No need to use a buffered class, we make our own buffer.
        OutputStream netOut = sock.getOutputStream();

        byte[] buffer = new byte[BUFFER_SIZE];
        int readBytes = 0;
        long fileSize = source.length();
        long counter = 0;

        //Send the file size
        DataOutputStream objOut = new DataOutputStream (netOut);
        System.out.println ("Writing: " + source.length ());
        objOut.writeLong (fileSize);
        objOut.flush ();

        while ((counter += readBytes) < fileSize)
        {
            readBytes = fileIn.read(buffer);
            netOut.write(buffer, 0, readBytes);
            netOut.flush ();
        }
        fileIn.close();
    }
    catch (Exception e)
    {
        e.printStackTrace ();
    }
    finally
    {
        if (fileIn != null)
        {
            try
            {
                fileIn.close ();
            }
            catch (IOException e)
            {
                e.printStackTrace ();
            }
        }
    }
}

[]

public static void receiveFile (Socket sock, File destination)
{
    BufferedOutputStream fileOut = null;

    try
    {
        //Receive data from socket
        InputStream netIn = sock.getInputStream();

        //Write bytes to a file
        fileOut = new BufferedOutputStream (new FileOutputStream (destination));

        byte[] buffer = new byte[BUFFER_SIZE];
        int readBytes = 0;
        long fileSize;
        long counter = 0;

        //Receive the file size
        DataInputStream objIn = new DataInputStream (netIn);
        fileSize = objIn.readLong ();
        System.out.println ("Receiving: " + fileSize);

        while (true)
        {
            readBytes = netIn.read (buffer);
            fileOut.write (buffer, 0, readBytes);
            fileOut.flush ();

            counter += readBytes;
            if (counter > fileSize)
                break;
        }
    }
    catch (IOException e)
    {
        e.printStackTrace ();
    }
    finally
    {
        if (fileOut != null)
        {
            try
            {
                fileOut.close ();
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
        }
    }
    System.out.println ("Ending method");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...