Java отправка файлов через сокеты - PullRequest
2 голосов
/ 12 апреля 2011

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

 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");
}

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

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);
    }

Ответы [ 2 ]

3 голосов
/ 12 апреля 2011

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

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

receiveFile(webServerSocket,filesize,filename);

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

(EDIT :) Конечно, вы должны использовать входной поток в методе receiveFile вместо того, чтобы получать его из сокета. Другим решением будет получение входного потока из сокета после вызова для получения файла, как в

receiveFile(webServerSocket,filesize,filename);

BufferedReader inFromServer =
            new BufferedReader(new InputStreamReader(webServerSocket.getInputStream()));
1 голос
/ 12 апреля 2011

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

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