//This is the code that uploads the file - is most of the run function of a thread. Checksum cksum = new CRC32(); if (VERBOSE) { System.out.println("Sending file " + fileToSend.getName() + " to " + remoteAddress); } try { transferSocket = serverSock.accept(); os = new DataOutputStream(new CheckedOutputStream(transferSocket.getOutputStream(), cksum)); is = new DataInputStream(new FileInputStream(fileToSend)); byte[] buffer = new byte[sendBufferSize]; int i = 0; while (running && (i = is.read(buffer)) > 0) { for (int j = 0; j < i; ++j) { os.write(buffer[j]); } } if (is != null) { is.close(); } if (os != null) { os.close(); } if (transferSocket != null) { transferSocket.close(); } Thread.sleep(200); } catch (Exception ex) { ex.printStackTrace(); } //This is the downloadFile function of the client which recieves and outputs the file. //returns the cksum as a String private static String downloadFile(File outputFile) { Checksum cksum = new CRC32(); if (TCPSocket == null) { return null; } try { DataInputStream is = new DataInputStream(new CheckedInputStream(TCPSocket.getInputStream(), cksum)); FileOutputStream os = new FileOutputStream(outputFile); byte[] buffer = new byte[recieveBufferSize]; int i = 0; while ((i = is.read(buffer)) > 0) { for (int j = 0; j < i; ++j) { os.write(buffer[j]); } } os.close(); is.close(); } catch (IOException e) { e.printStackTrace(); return null; } return ((Long) cksum.getValue()).toString(); }