Cześć piszę program do przesyłania plików pomiędzy klientem a serwerem. Aplikacja kliencka ma obserwować zmiany w folderze klienta i gdy takowe wystąpią wysyła te pliki na serwer, który tworzy kopię tych plików. Wszystko działało sprawnie dopóki nie dodałem wielowątkowości. Rozumiem że jest problem z synchronizacją jednak za bardzo nie wiem jak sobie z tym poradzić.
Kod Clienta.
import java.net.*;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Client {
File file=null;
public static void main(String[] args) throws IOException
{
InetAddress ip = InetAddress.getByName("localhost");
List<String> user_files = new ArrayList<String>();
String directory = "C:\\Users\\andrze\\Desktop\\uzytkownik1";
Socket socket = new Socket(ip, 1342);
BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());
DataOutputStream dos = new DataOutputStream(bos);
while (true)
{
String f=File_Handler.check_changes_in_folder(directory,user_files);
if(!f.equals("new_files_not_found"))
{
Thread watek = new Send_File(socket,dos,f,directory);
watek.start();
}
}
}
}
class File_Handler
{
static String check_changes_in_folder(String user_directory,List<String>user_files )
{
File[] in = new File(user_directory).listFiles();
for(int i=0;i< in.length;i++)
{
String curr_f = in[i].getName();
if(!user_files.contains(curr_f))
{
user_files.add(curr_f);
return curr_f;
}
}
return "new_files_not_found";
}
}
class Send_File extends Thread {
final Socket s;
final DataOutputStream dos;
final String directory;
final String f;
public Send_File(Socket s, DataOutputStream o,String f,String directory)
{
this.s = s;
this.dos = o;
this.directory= directory;
this.f=f;
}
public void run()
{
System.out.println("NOWY WATEK "+ Thread.currentThread().getName());
try {
BufferedOutputStream bos = new BufferedOutputStream(s.getOutputStream());
File file = new File(directory + "\\" + f);
long length = file.length();
dos.writeLong(length);
String name = file.getName();
System.out.println(name);
dos.writeUTF(name);
FileInputStream fis = new FileInputStream(file);
BufferedInputStream bis = new BufferedInputStream(fis);
int theByte = 0;
while ((theByte = bis.read()) != -1) bos.write(theByte);
bis.close();
}catch(Exception e)
{
getStackTrace();
}
}
}
Kod Serwera
import java.net.*;
import java.io.*;
public class Serwer
{
public static void main (String[] args ) throws IOException {
int bytesRead;
int current = 0;
ServerSocket serverSocket = null;
serverSocket = new ServerSocket(1342);
while(true) {
String dirPath ="C:\\Users\\andrze\\Desktop\\Serwer1" ;
Socket socket = serverSocket.accept();
Thread watek = new File_Download(socket,dirPath);
watek.start();
}
}
}
class File_Download extends Thread
{
final Socket socket;
final String dirPath;
public File_Download(Socket s,String Directory)
{
this.socket=s;
this.dirPath=Directory;
}
public void run()
{
try {
BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());
DataInputStream dis = new DataInputStream(bis);
long fileLength = dis.readLong();
String fileName = dis.readUTF();
System.out.println(fileName);
File file = new File(dirPath + "/" + fileName);
FileOutputStream fos = new FileOutputStream(file);
BufferedOutputStream bos = new BufferedOutputStream(fos);
for (int j = 0; j < fileLength; j++) bos.write(bis.read());
bos.close();
}catch(Exception e)
{
getStackTrace();
}
}
}