package resa.migrate; import java.io.*; import java.net.Socket; /** * Created by ding on 14-7-31. */ public class FileClient { private static Socket sock; private static String fileName; private static BufferedReader stdin; private static DataOutputStream os; public static void main(String[] args) throws IOException, IOException { try { sock = new Socket("localhost", Integer.parseInt(args[0])); stdin = new BufferedReader(new InputStreamReader(System.in)); } catch (Exception e) { System.err.println("Cannot connect to the server, try again later."); System.exit(1); } os = new DataOutputStream(sock.getOutputStream()); try { switch (Integer.parseInt(selectAction())) { case 1: os.writeUTF("write"); sendFile(); break; case 2: os.writeUTF("read"); System.err.print("Enter file name: "); fileName = stdin.readLine(); os.writeUTF(fileName); receiveFile(fileName); break; } } catch (Exception e) { System.err.println("not valid input"); } sock.close(); } private static String selectAction() throws IOException { System.out.println("1. Send file."); System.out.println("2. Recieve file."); System.out.print("\nMake selection: "); return stdin.readLine(); } private static void sendFile() { try { System.err.print("Enter file name: "); fileName = stdin.readLine(); File myFile = new File(fileName); 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 = sock.getOutputStream(); //Sending file name and file size to the server DataOutputStream dos = new DataOutputStream(os); dos.writeUTF(myFile.getName()); dos.write(mybytearray, 0, mybytearray.length); dos.flush(); System.out.println("File " + fileName + " sent to Server."); } catch (Exception e) { System.err.println("File does not exist!"); } } private static void receiveFile(String fileName) { try { int bytesRead; InputStream in = sock.getInputStream(); DataInputStream clientData = new DataInputStream(in); fileName = clientData.readUTF(); OutputStream output = new FileOutputStream(("received_from_server_" + fileName)); long size = clientData.readLong(); byte[] buffer = new byte[1024]; while (size > 0 && (bytesRead = clientData.read(buffer, 0, (int) Math.min(buffer.length, size))) != -1) { output.write(buffer, 0, bytesRead); size -= bytesRead; } output.close(); in.close(); System.out.println("File " + fileName + " received from Server."); } catch (IOException ex) { ex.printStackTrace(); } } public static InputStream openInputStream(String host, int port, String fileName) throws IOException { Socket socket = new Socket(host, port); DataOutputStream out = new DataOutputStream(socket.getOutputStream()); out.writeUTF("read"); out.writeUTF(fileName); DataInputStream in = new DataInputStream(socket.getInputStream()); if (in.readLong() < 0) { throw new FileNotFoundException(fileName); } return in; } }