/**
*
*/
package de.tutorials;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* @author Tom
*
*/
public class TCPFileExchange {
/**
* @param args
*/
public static void main(String[] args) {
File file = new File("c:/bigfile-1.0.0.tgz");
FileProvider fileProvider = new FileProvider(file, 4711);
FileFetcher fileFetcher = new FileFetcher("localhost", 4711, file
.getName());
ExecutorService executorService = Executors.newFixedThreadPool(2);
executorService.execute(fileProvider);
executorService.execute(fileFetcher);
executorService.shutdown();
}
static class FileProvider implements Runnable {
final File file;
final int port;
public FileProvider(File file, int port) {
this.file = file;
this.port = port;
}
public void run() {
try {
System.out.println(getClass() + " Providing file...");
ServerSocket serverSocket = new ServerSocket(this.port);
Socket socket = serverSocket.accept();
System.out.println(getClass() + " sending file to: "
+ socket.getRemoteSocketAddress());
byte[] buffer = new byte[16384];
InputStream inputStream = new FileInputStream(this.file);
OutputStream outputStream = socket.getOutputStream();
int len = 0;
while ((len = inputStream.read(buffer)) > 0) {
outputStream.write(buffer, 0, len);
}
System.out.println(getClass() + " sending completed");
inputStream.close();
outputStream.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
static class FileFetcher implements Runnable {
String serverName;
int port;
String fileName;
public FileFetcher(String serverName, int port, String fileName) {
this.serverName = serverName;
this.port = port;
this.fileName = fileName;
}
public void run() {
try {
Socket socket = new Socket(this.serverName, this.port);
File file = new File(
System.getProperty("java.io.tmpdir"),
fileName);
System.out.println(getClass() + " Fetching file... " + file);
OutputStream outputStream = new FileOutputStream(file);
InputStream inputStream = socket.getInputStream();
byte[] buffer = new byte[16384];
int len = 0;
while ((len = inputStream.read(buffer)) > 0) {
outputStream.write(buffer, 0, len);
}
System.out.println(getClass() + " Fetching complete.");
outputStream.close();
inputStream.close();
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}