Java, отправляющая файлы через сокеты

#java #sockets

#java #сокеты

Вопрос:

Я хочу отправлять файлы, а также некоторую другую информацию через сокеты. Я использую следующий код

  public void receiveFile(Socket socket,int filesize,String filename) throws IOException
{
    //after receiving file send ack
    System.out.println("waiting ");
 // int filesize=70; // filesize temporary hardcoded

long start = System.currentTimeMillis();
int bytesRead;
int current = 0;
// localhost for testing
System.out.println("Connecting...");

// receive file
byte [] mybytearray  = new byte [filesize];
InputStream is = socket.getInputStream();
FileOutputStream fos = new FileOutputStream(filename);
BufferedOutputStream bos = new BufferedOutputStream(fos);
bytesRead = is.read(mybytearray,0,mybytearray.length);
current = bytesRead;
System.out.println("recv..." mybytearray.length);
do {
   bytesRead =
      is.read(mybytearray, current, (mybytearray.length-current));
   System.out.println(bytesRead);
   if(bytesRead > 0) current  = bytesRead;
} while(bytesRead > 0);

bos.write(mybytearray, 0 , current);
bos.flush();
long end = System.currentTimeMillis();
System.out.println(end-start);
bos.close();
System.out.println(" File received");
}
  

После получения файла я должен получить некоторые другие строки. Но когда я пытаюсь прочитать входной поток, я получаю содержимое файла. Как удалить содержимое файла из inputstream.

 BufferedReader inFromServer =
            new BufferedReader(new InputStreamReader(
                webServerSocket.getInputStream()));

receiveFile(webServerSocket,filesize,filename);
    while(true)
    {
        msg = inFromServer.readLine(); //here i receive the contents of the file again
     System.out.println(msg);
    }
  

Комментарии:

1. Могу ли я узнать, что такое webServerSocket?

Ответ №1:

Передайте входной поток сокета методу receivefile вместо самого сокета:

 InputStream is = webServerSocket.getInputStream();
BufferedReader inFromServer = new BufferedReader(new InputStreamReader(is));

receiveFile(webServerSocket,filesize,filename);
  

Проблема заключается, я полагаю, в том факте, что у вас есть два входных потока из одного и того же сокета, созданных в один и тот же момент времени (до того, как какие-либо данные были фактически прочитаны). Они указывают на один и тот же поток, но чтение из одного также не перемещает другой, таким образом, после чтения из inputstreamBA этот файл помечается в позиции 15 (например), в то время как inpustream A все еще находится в позиции 0, в начале потока.

(РЕДАКТИРОВАТЬ:) Конечно, вы должны использовать inputstream в методе receiveFile вместо получения файла из сокета. Другим решением было бы получить inputstream из сокета после вызова receive file, как в

 receiveFile(webServerSocket,filesize,filename);

BufferedReader inFromServer =
            new BufferedReader(new InputStreamReader(webServerSocket.getInputStream()));
  

Комментарии:

1. 1: Другой момент заключается в том, что вы используете поток как двоичный файл или текст, но не оба, если у вас нет очень четкого представления о том, что вы делаете. 😉

2. Я понял проблему. Чтобы упростить задачу, я просто еще раз перечитал с inFromServer на flush. Я не хотел сильно менять код

3. могу ли я узнать, что такое webServerSocket?

Ответ №2:

Дочитав файл до завершения, вы прочтете весь файл. Если вы все еще получаете содержимое файла, вы прочитали не весь файл.