Вход и выход в следующем коде представляют сообщение от одного и того же компьютера:
DataInputStream in = new DataInputStream(socket.getInputStream());
DataOutputStream out = new DataOutputStream(socket.getOutputStream());
поэтому, когда вы читаете и пишете, все, что вы делаете, это создаете эхо-сервис.
message = in.readUTF();
out.writeUTF(message);
Для прокси вы хотите читать с клиента и писать на сервер, и наоборот.
Кажется, вы хотите что-то ближе к этому:
client = server.accept();
clientsocket = new Socket(InetAddress.getLocalHost(), 6780);
Thread t1 = new ProxyHandler(client, clientsocket );
t1.start();
Thread t2 = new ProxyHandler(clientsocket, client);
t2.start();
, где задание первого потока - отправка данных с клиента на сервер, а задание второго - отправка с сервера клиенту.