Ok so I have a block of code that is supposed to send multiple files over a socket. The way I am doing this in a for loop I am opening a socket -> transferring a file -> closing socket then repeat for other files. The said code it below:
for (int i = 0; i < fname.size(); i++) {
Socket sok = new Socket("localhost",4444);
PrintStream oos = new PrintStream(sok.getOutputStream());
oos.println("1");
try {
System.out.println(fname.get(i));
File myFile = new File(path+fname.get(i));
byte[] mybytearray = new byte[(int) myFile.length()];
FileInputStream fis = new FileInputStream(myFile);
BufferedInputStream bis = new BufferedInputStream(fis);
// bis.read(mybytearray, 0, mybytearray.length);
DataInputStream dis = new DataInputStream(bis);
dis.readFully(mybytearray, 0, mybytearray.length);
OutputStream os = sok.getOutputStream();
// Sending file name and file size to the server
DataOutputStream doss = new DataOutputStream(os);
doss.writeUTF(myFile.getName());
doss.writeLong(mybytearray.length);
doss.write(mybytearray, 0, mybytearray.length);
doss.flush();
sok.close();
System.out.println("File " + fname.get(i) + " sent to Server.");
} catch (Exception e) {
System.err.println("File does not exist! (May not be true) Generated Error: "+e);
}
//sendFile(path+fname.get(i));
//sock.close();
}
} catch (Exception e) {
System.err.println(e);
}
Now what happens is the client doesn't spit out any errors, matter of fact, it actually says the files were sent to the server. Now the server spits out random errors. Sometimes the server receives some files (never all of them) and sometimes it receives no files and the errors that come out are random as well. The errors are one or a combination of the following:
java.io.EOFException
java.io.FileNotFoundException
java.net.SocketException: Connection reset
java.io.UTFDataFormatException
All those errors are on the Server side while trying to transfer. I am not sure what is going on here =/
SERVER CODE:
public void receiveFile() {
try {
int bytesRead;
DataInputStream clientData = new DataInputStream(
clientSocket.getInputStream());
String fileName = clientData.readUTF();
OutputStream output = new FileOutputStream((fileName));
long size = clientData.readLong();
byte[] buffer = new byte[100000];
while (size > 0
&& (bytesRead = clientData.read(buffer, 0,
(int) Math.min(buffer.length, size))) != -1) {
output.write(buffer, 0, bytesRead);
size -= bytesRead;
}
output.close();
clientData.close();
System.out.println("File " + fileName + " received from client.");
} catch (IOException ex) {
System.err.println("Client error. Connection closed. " +ex);
}
}
Stacktrace:
java.io.EOFException
at java.io.DataInputStream.readUnsignedShort(Unknown Source)
at java.io.DataInputStream.readUTF(Unknown Source)
at java.io.DataInputStream.readUTF(Unknown Source)
at ClientConnection.receiveFile(ClientConnection.java:80)
at ClientConnection.run(ClientConnection.java:46)
at java.lang.Thread.run(Unknown Source)
1
Accepted connection : Socket[addr=/127.0.0.1,port=60653,localport=4444]
File LF-statistikkboka(Myers).pdf received from client.
1
java.io.EOFException
at java.io.DataInputStream.readUnsignedShort(Unknown Source)
at java.io.DataInputStream.readUTF(Unknown Source)
at java.io.DataInputStream.readUTF(Unknown Source)
at ClientConnection.receiveFile(ClientConnection.java:80)
at ClientConnection.run(ClientConnection.java:46)
at java.lang.Thread.run(Unknown Source)
File WHAT IS LEFT TO DO.docx received from client.
As requested the code for receiving commands from the client
in = new BufferedReader(new InputStreamReader(
clientSocket.getInputStream()));
String clientSelection;
clientSelection = in.readLine();
System.out.println(clientSelection);
while ((clientSelection) != null) {
switch (clientSelection) {
case "1":
receiveFile();
break;
case "2":
String outGoingFileName;
while ((outGoingFileName = in.readLine()) != null) {
sendFile(outGoingFileName);
}
break;
case "3":
sync();
break;
default:
System.out.println("Incorrect command received.");
break;
}
//in.close();
break;
}