#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:
Дочитав файл до завершения, вы прочтете весь файл. Если вы все еще получаете содержимое файла, вы прочитали не весь файл.