попробуйте отправить файл и строку через тот же сокет (в Java) - PullRequest
2 голосов
/ 26 мая 2011

Мне нужно отправить файл с сервера на клиент через некоторый сокет (скажем, порт 8478), а также массаж (в середине передачи файлов) (что-то вроде «привет», или «вы достигнете своего предела» или «вы достигнете»)на ваш 50% -ный лимит ").

Теперь для отправки только файла легко использовать им BufferedInputStrear и BufferedOutputStream на стороне клиента и сервера.Теперь, как я могу отправить также массаж в середине передачи файлов в том же порту (8478).

спасибо всем ..

это, как я передаю файл

на стороне сервера:

         BufferedInputStream d=new BufferedInputStream(new FileInputStream(s));

        BufferedOutputStream outStream = new         BufferedOutputStream(cs.getOutputStream());
        ObjectOutputStream msgoutStream = new ObjectOutputStream(cs.getOutputStream());
        byte buffer[] = new byte[1024];


        int read;
        while((read = d.read(buffer))!=-1)
        {

            //msgoutStream.writeUTF("hjlhkhjk");


            outStream.write(buffer, 0, read);

            outStream.flush();
        }

на стороне клиента:

         byte buffer[] = new byte[1024];
        int read;
        int f=0;

        while((read = d.read(buffer))!=-1)
        {
            if(ifContinun)
            {
                System.out.println("strat write to file...");
            }

        //String s1=msgInPutStream.readLine();
        //String s2=msgInPutStream.readUTF();

        outStream.write(buffer, 0, read);
            outStream.flush();
            if(ifContinun)
            {
                System.out.println("after write to file...");
                ifContinun=false;
            }
        }

Ответы [ 3 ]

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

Вам необходимо отправить файл по частям. Вы можете изобрести протокол как

 short stream-id
 short length of message
 bytes of the message

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

Однако, вероятно, будет гораздо проще открыть два соединения, что избавит от необходимости использования такого протокола. например FTP делает это. ;)

0 голосов
/ 26 мая 2011

Одним из способов является использование некоторого управляющего кода для указания при переходе от передачи файла к передаче текста и наоборот.Поскольку в двоичном файле могут содержаться ваши escape-коды, вы должны передать их как.

Но протокол сообщений предпочтительнее.

0 голосов
/ 26 мая 2011

Для этого вам нужно определить протокол поверх TCP.Например, протокол может быть:

  1. Существует ряд сообщений
  2. Каждое сообщение имеет тип
  3. Каждому сообщению предшествуют 4 байта, которые несутразмер следующего сообщения
  4. Каждое сообщение начинается с байта типа
  5. Типы: 1 - StartFile, 2 - NextFileChunk, 3 - TextMessage
  6. второй байт и далее содержит тело сообщения
  7. Для StartFile остальные байты составляют имя файла и любые другие свойства, которые вы хотите отправить.(Вы можете использовать обычную сериализацию Java.)
  8. Для NextFileChunk у вас просто есть следующие n байтов передаваемого файла
  9. Для TestMessage остальные байты будут содержать текстсообщение
...