Salve ragazzi urge il vostro aiuto..
Devo completare un progetto che mi chiede di creare un sensore che comunica con un server e fa le seguenti operazioni:

-CLIENT-SERVER il compito è quello di inviare interamente un file dal lato client al lato server

-Fra CLIENT-SERVER dobbiamo frapporre un Proxy TCP ovvero Dobbiamo interfacciare con esso i lati client e server

Io ho creato il client, il server e il proxy, ma non riesco a collegarli l'uno con l'altro.
Qualcuno può aiutarmi??
Ovviamente se avete qualcosa di pronto è ben accetto!!

CLIENT
codice:
package progettois;

// PutFileClient.java
import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
import java.net.SocketTimeoutException;

public class PutFileClient {

    public static void main(String[] args) throws IOException {
        /*
         * Come argomenti si devono passare un nome di host valido e una porta
         *
         */
        InetAddress addr = null;
        int port = -1;

        /*
         * controllo argomenti
         */
        try {
            if (args.length == 2) {
                addr = InetAddress.getByName(args[0]);
                port = Integer.parseInt(args[1]);
            } else {
                System.out.println("Usage: java PutFileClient serverAddr serverPort");
                System.exit(1);
            }
        } //try
        // Per esercizio si possono dividere le diverse eccezioni
        catch (Exception e) {
            System.out.println("Problemi, i seguenti: ");
            System.out.println("Usage: java PutFileClient serverAddr serverPort");
            System.exit(2);
        }

        // oggetti utilizzati dal client per la comunicazione e la lettura del file
        // locale
        Socket socket = null;
        FileInputStream inFile = null;
        DataInputStream inSock = null;
        DataOutputStream outSock = null;

        /*
         * comunicazione col cliente, da console
         */
        // creazione stream di input da tastiera
        BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
        String nomeFile = "/Users/Elena/Desktop/Prova.rtf";

        try {
            while ((nomeFile = stdIn.readLine()) != null) {

                // se il file esiste creo la socket
                if (new File(nomeFile).exists()) {
                    // creazione socket
                    try {
                        socket = new Socket(addr, port);
                        // setto il timeout per non bloccare indefinitivamente il client
                        socket.setSoTimeout(30000);
                        System.out.println("Creata la socket: " + socket);
                    } catch (Exception e) {
                        System.out.println("Problemi nella creazione della socket: ");
                        continue;
                        // il client continua l'esecuzione riprendendo dall'inizio del ciclo
                    }

                    // creazione stream di input/output su socket
                    try {
                        inSock = new DataInputStream(socket.getInputStream());
                        outSock = new DataOutputStream(socket.getOutputStream());
                    } catch (IOException e) {
                        System.out.println("Problemi nella creazione degli stream su socket: ");
                        continue;
                        // il client continua l'esecuzione riprendendo dall'inizio del ciclo
                    }
                } // se la richiesta non � corretta non proseguo
                else {
                    System.out.println("File non presente nel direttorio corrente");
                    // il client continua l'esecuzione riprendendo dall'inizio del ciclo
                    continue;
                }

                /*
                 * Invio file richiesto e attesa esito dal server
                 */
                // creazione stream di input da file
                try {
                    inFile = new FileInputStream(nomeFile);
                } /*
                 * abbiamo gia' verificato che esiste, a meno di inconvenienti,
                 * es. cancellazione concorrente del file da parte di un altro
                 * processo, non dovremmo mai incorrere in questa eccezione.
                 */ catch (FileNotFoundException e) {
                    System.out.println("Problemi nella creazione dello stream di input da "
                            + nomeFile + ": ");
                    // il client continua l'esecuzione riprendendo dall'inizio del ciclo
                    continue;
                }

                // trasmissione del nome
                try {
                    outSock.writeUTF(nomeFile);
                    System.out.println("Inviato il nome del file " + nomeFile);
                } catch (Exception e) {
                    System.out.println("Problemi nell'invio del nome di " + nomeFile
                            + ": ");
                    // il client continua l'esecuzione riprendendo dall'inizio del ciclo
                    continue;
                }

                System.out.println("Inizio la trasmissione di " + nomeFile);

                // trasferimento file
                try {
                    //FileUtility.trasferisci_a_linee_UTF_e_stampa_a_video(new DataInputStream(inFile), outSock);
                    FileUtility.trasferisci_a_byte_file_binario(new DataInputStream(inFile), outSock);
                    // chiusura della socket e del file
                    inFile.close();
                    // chiudo la socket in upstream, cioe' invio l'EOF al server
                    socket.shutdownOutput();
                    System.out.println("Trasmissione di " + nomeFile + " terminata ");
                } catch (SocketTimeoutException ste) {
                    System.out.println("Timeout scattato: ");
                    socket.close();
                    // il client continua l'esecuzione riprendendo dall'inizio del ciclo
                    continue;
                } catch (Exception e) {
                    System.out.println("Problemi nell'invio di " + nomeFile + ": ");
                    socket.close();
                    // il client continua l'esecuzione riprendendo dall'inizio del ciclo
                    continue;
                }

                // ricezione esito
                String esito;
                try {
                    esito = inSock.readUTF();
                    System.out.println("Esito trasmissione: " + esito);
                    // chiudo la socket in downstream
                    socket.shutdownInput();
                    System.out.println("Terminata la chiusura della socket: " + socket);
                } catch (SocketTimeoutException ste) {
                    System.out.println("Timeout scattato: ");
                    socket.close();
                    // il client continua l'esecuzione riprendendo dall'inizio del ciclo
                    continue;
                } catch (Exception e) {
                    System.out.println("Problemi nella ricezione dell'esito, i seguenti: ");
                    socket.close();
                    continue;
                    // il client continua l'esecuzione riprendendo dall'inizio del ciclo
                }

                // tutto ok, pronto per nuova richiesta

            }// while
            System.out.println("PutFileClient: termino...");
        } // qui catturo le eccezioni non catturate all'interno del while
        // quali per esempio la caduta della connessione con il server
        // in seguito alle quali il client termina l'esecuzione
        catch (Exception e) {
            System.err.println("Errore irreversibile, il seguente: ");
            System.err.println("Chiudo!");
            System.exit(3);
        }

    } // main
} // PutFileClient