서버쪽>>>

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

class Server {
 private ServerSocket ss = null;
 private Socket s =null;
 
 public Server(int port) {
  try {
   ss = new ServerSocket(port);
   System.out.println("@@에코 서버@@");
   System.out.println("클라이언트의 접속 요청이 있을때까지 대기한다");
   
   while(true) {
    s = ss.accept();
    ServerThread st = new ServerThread(s);
    st.start();
   }
  } catch (Exception e) {
   e.printStackTrace();
  } finally {
   try {
    s.close();
    ss.close();
   } catch (Exception e) {
    e.printStackTrace();
   }
  }
 }
}

class ServerThread extends Thread {
 Socket s;
 BufferedReader br = null;
 PrintWriter pw = null;
 
 public ServerThread(Socket s) {
  try {
   this.s = s;
   System.out.println(s.getInetAddress() + "로 부터 연결요청받음");
   pw = new PrintWriter(this.s.getOutputStream());
   br = new BufferedReader(new InputStreamReader(this.s.getInputStream()));
  } catch (Exception e) {
   e.printStackTrace();
  } finally {
   try {
    pw.close();
    br.close();
    this.s.close();
   } catch (Exception e) {
    e.printStackTrace();
   }
  }
 }
 
 @Override
 public void run() {
  String str;
  try {
   while(true) {
    str = br.readLine();
    if (str == null || str.equals("bye"))
     break;
    pw.write(str);
    pw.flush();
    System.out.println(s.getInetAddress() + "의 메세지 : " + str);
   }
  } catch (Exception e) {
   e.printStackTrace();
  } finally {
   try {
    pw.close();
    br.close();
    s.close();
   } catch (Exception e) {
    e.printStackTrace();
   }
  }
 }
}
public class EchoServer1 {
 public static void main(String[] args) {
  new Server(9000);
 }
}



클라이언트쪽>>>

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

class Client {
 private Socket s = null;
 private BufferedReader kbr = null;
 private BufferedReader sbr = null;
 private PrintWriter pw = null;
 
 public Client(String sAddress, int port) {
  String str, message;
  
  try {
   System.out.println("@@에코 클라이언트@@");
   s = new Socket(sAddress, port);
   
   System.out.println("클라이언트가 서버에 연결됨");
   kbr = new BufferedReader(new InputStreamReader(System.in));
   sbr = new BufferedReader(new InputStreamReader(s.getInputStream()));
   pw = new PrintWriter(s.getOutputStream());
   
   while(true) {
    System.out.print("서버로 보낼 메세지 입력 >>");
    str = kbr.readLine();
    if(str.equals("bye"))
     break;
    pw.println(str);
    pw.flush();
    
    message = sbr.readLine();
    System.out.println(s.getInetAddress() + "로 부터 받은 메세지 : " + message);
   }
  } catch (Exception e) {
   e.printStackTrace();
  } finally {
   try {
    pw.close();
    sbr.close();
    kbr.close();
    s.close();
   } catch (Exception e) {
    e.printStackTrace();
   }
  }
 }
}
public class EchoClient1 {
 public static void main(String[] args) {
  new Client("127.0.0.1", 9000);
 }
}