Witam,
Napotkałem pewien problem, otóż jestem w trakcie pisania programu synchronizującego dwa wybrane katalogi na dowolnych komputerach. Wszystko przebiega pomyślnie, aż do próby przesłania drugiego pliku. Mianowicie, żeby socket odbierający plik zrozumiał, że to już koniec pliku do odbierania trzeba wyłączyć outputstream. Program musi być przygotowany na przyjęcie wielu plików, niestety po wyłączeniu outputstream'a nie działa mi:
in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
ponieważ przy wczytywaniu linii za pomocą readLine() kompilator wyrzuca błędy.
funkcja odbierająca:
public void DownloadFile() throws IOException{
int bytesRead;
InputStream is = clientSocket.getInputStream();
DataInputStream clientData = new DataInputStream(is);
//String fileName = clientData.readUTF();
adding.append("\n"+catalogOfFiles+fileToDownload);
adding.append("sciaganie pliku");
OutputStream output = new FileOutputStream(catalogOfFiles+"\\"+fileToDownload);
long size = clientData.readLong();
byte[] buffer = new byte[1024];
while (size >= 0 && (bytesRead = clientData.read(buffer, 0, (int)Math.min(buffer.length, size))) != -1)
{
output.write(buffer, 0, bytesRead);
size -= bytesRead;
}
is.close();
output.close();
clientData.close();
out.println("end");
}
wysyłająca:
public void SendFile(File file) throws IOException{
byte[] buf = new byte[1024];
OutputStream os = socket.getOutputStream();
BufferedOutputStream bos = new BufferedOutputStream(os, 1024);
FileInputStream in = new FileInputStream(file);
int i = 0;
int bytecount = 1024;
while ((i = in.read(buf, 0, 1024)) != -1) {
bytecount = bytecount + 1024;
bos.write(buf, 0, i);
bos.flush();
}
os.close();
bos.close();
in.close();
}
Odbieranie pliku następuje po uprzednim odebraniu od drugiego socketa słówka "file". Natomiast odebraniu pliku przesyłana jest informacja "end", żeby socket wysyłający wiedział, że może wysłać już kolejny plik. Niestety właśnie przy drugim pliku wyskakują błędy z wczytywaniem linii przy pomocy in.readLine(), gdzie BufferedReader jest zdefiniowany na początku i wcześniej działa bez zarzutów.