Я пишу программу, в которой клиент должен отслеживать создание файлов в определенной папке и отправлять их по мере их создания на сервер. Сервер всегда должен находиться в режиме прослушивания и сохранять эти файлы с тем же именем в указанномпапка на сервере. На данный момент я пытаюсь добиться этого на том же м / с. Как я могу добиться этого через сокет?
Я смог контролировать создание файлов в папке на клиентеи отправьте их. На приемнике я смог получить только один файл. После этого я получал исключение FileNotFoundException на сервере.
Код клиента
Socket sock = new Socket("localhost", 5991);
System.out.println("Connecting.........");
Path faxFolder = Paths.get("C:\\Users\\Tushar Yadav\\Music\\src\\");
WatchService watchService = FileSystems.getDefault().newWatchService();
faxFolder.register(watchService, StandardWatchEventKinds.ENTRY_CREATE);
boolean valid = true;
do {
WatchKey watchKey = watchService.take();
for (WatchEvent event : watchKey.pollEvents()) {
WatchEvent.Kind kind = event.kind();
if (StandardWatchEventKinds.ENTRY_CREATE.equals(event.kind())) {
String fileName = event.context().toString();
System.out.println("File Created:" + fileName);
File myFile = new File("C:\\Users\\Tushar Yadav\\Music\\src\\"+fileName);
OutputStream os = sock.getOutputStream();
DataOutputStream dos = new DataOutputStream(os);
dos.writeUTF(fileName);
dos.writeInt((int) myFile.length());
int filesize = (int) myFile.length();
byte [] buffer = new byte [filesize];
Thread.sleep(10000);
FileInputStream fis = new FileInputStream(myFile.toString());
BufferedInputStream bis = new BufferedInputStream(fis);
int count;
while ((count = fis.read(buffer)) > 0) {
dos.write(buffer, 0, count);
}
dos.flush();
}
}
valid = watchKey.reset();
}while (valid);
Код сервера
ServerSocket serverSocket = new ServerSocket(5991);
Socket clientSocket = null;
clientSocket = serverSocket.accept();
in = clientSocket.getInputStream();
clientData = new DataInputStream(in);
clientBuff = new BufferedInputStream(in);
while(true){
System.out.println("Starting...");
String fileName = clientData.readUTF();
System.out.println("filename : "+fileName);
int fileSize = clientData.read();
System.out.println("filesize is "+fileSize);
len=fileSize;
System.out.println("C:\\Users\\Tushar Yadav\\Music\\dest\\"+fileName);
output = new FileOutputStream("C:\\Users\\Tushar Yadav\\Music\\dest\\"+fileName);
dos=new DataOutputStream(output);
bos=new BufferedOutputStream(output);
byte[] buffer = new byte[1024];
bos.write(buffer, 0, buffer.length);
while (len > 0 && (smblen = clientData.read(buffer)) > 0) {
dos.write(buffer, 0, smblen);
len = len - smblen;
dos.flush();
}
dos.close();
}
Я ожидаю, что сервер подождет, пока клиент отправит другой файл, как только он будет создан на стороне клиента, но я получаю исключение filenotfound вскоре после того, как получатель получит и сохранит первый файл.
Кроме того, одно наблюдение состоит в том, что на стороне сервера я видел эту строку System.out.println("filename : "+fileName);
, и последующие строки выполнялись дважды доxception выскакивает, несмотря на то, что на клиенте создается и отправляется только один файл.
Ниже приведены журналы кода сервера: -
Starting...
filename : New Text Document.txt
filesize is 0
C:\Users\Tushar Yadav\Music\dest\New Text Document.txt
Starting...
filename :
filesize is 0
C:\Users\Tushar Yadav\Music\dest\
Exception in thread "main" java.io.FileNotFoundException: C:\Users\Tushar Yadav\Music\dest (Access is denied)
at java.io.FileOutputStream.open0(Native Method)
at java.io.FileOutputStream.open(Unknown Source)
at java.io.FileOutputStream.<init>(Unknown Source)
at java.io.FileOutputStream.<init>(Unknown Source)
at test.Server.main(Server.java:55)