Witam, mam proste przesyłanie plików (poprzez socket'y), gdzie serwer odbiera plik od klienta.
Klient wysyła do serwera wielkość oraz nazwę pliku, a następnie sam plik.
Wielkość pliku wyznaczam za pomocą myFile.length(); gdzie myFile to wczytany plik.
I po pierwsze, jeśli na serwerze wielkość będzie taka sama jak ta, którą wyznaczyłem u klienta to skopiowany plik ma 0bajtów. Jeśli dodam do wyznaczonej wielkości pliku chociażby wartość 100 to już kopiuje się dobrze.
Poza tym, gdy chcę przesłać jakiś większy plik - kilkadziesiąt mb to mam: ava.lang.OutOfMemoryError: Java heap space
fragment klienta:
Socket s = new Socket("localhost", 6666);
//jfc to obiekt JFileChooser
String sciezka = jfc.getSelectedFile().getPath();
File myFile = new File (sciezka);
byte [] mybytearray = new byte [(int)myFile.length()];
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(myFile));
OutputStream os = s.getOutputStream();
PrintStream ps = new PrintStream(s.getOutputStream());
String dlugoscPliku = Long.toString(myFile.length());
ps.println(dlugoscPliku);
Thread.sleep(500);
ps.println(jfc.getSelectedFile().getName());
Thread.sleep(500);
bis.read(mybytearray,0,mybytearray.length);
os.write(mybytearray,0,mybytearray.length);
JOptionPane.showMessageDialog(null, "Wyslano plik na serwer");
os.flush();
s.close();
fragment serwera:
Socket s = null;
int bytesRead;
int current = 0;
ServerSocket ss = new ServerSocket(6666);
while (true) {
s = ss.accept();
if (s != null) {
System.out.println("Serwer uruchomiony.");
InputStream is = s.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
String dlugoscPliku = br.readLine();
int dlugoscPliku2 = Integer.parseInt(dlugoscPliku);
byte [] mybytearray = new byte [dlugoscPliku2+100];
String nazwaPliku = br.readLine();
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("kopia-"+nazwaPliku));
bytesRead = is.read(mybytearray,0,mybytearray.length);
current = bytesRead;
do {
bytesRead = is.read(mybytearray, current, (mybytearray.length-current));
if(bytesRead >= 0) current += bytesRead;
} while(bytesRead > -1);
bos.write(mybytearray, 0 , current);
bos.flush();
bos.close();
s.close();
}
}