반응형
Notice
Recent Posts
Recent Comments
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Archives
Today
Total
관리 메뉴

Do Something IT

자바 TCP 네트워크 본문

OtherLanguage/JAVA

자바 TCP 네트워크

아낙시만더 2010. 7. 10. 22:02
반응형

자바의 TCP 네트워크는 java.net 클래스 에서 지원해주는 ServerSocket클래스, Socket 클래스의 상호 연결로 이루어 지는 네트워크이다. 자바의 네트워크에는 이외에도 UDP라는 네트워크가 있다

TCP와 UDP
TCP는 연결형으로 전화기 처럼 송신자와 수신자를 연결한뒤 안전하게 정보를 주고 받는 방식이다. 이는 유일한 경로를 이용하게 됨으로 신뢰성이 보장된다. 이는 중요한 통신이 필요할때 주로 이용한다. 이는 유일한 경로로 연결이 끊킬때 까지 패킷을 주고 받을수 있다.

UDP는 비연결형으로 영화나 음악같은 파일을 주고 받을때 사용된다. 이는 패킷하나하나를 보낼 때마다 각각의 패킷에 목적지 주소를 반드시 가져야한다. 상대 컴퓨터의 상태를 점검하기위해 사용하는 PING이 적당한 예이다.

소캣(Socket)
소캣은 상호 연결된 응용프로그램들 사이의 안정된 정보 교환을 제공하고 있는 매체라 할 수 있다.

포트(Port)
컴퓨터들은 하나의 통신선을 이용하지만 논리적은 개념으로 그 통로를 나누어 여러개의 통신 프로그램을 동시에 사용 할 수 있다. 그 통로를 포트라고 한다.

TCP 네트워크 방식의 연결
위에서 말한 것처럼 TCP 네트워크는 상호 연결로 이루어진다. 즉, 한번 연결하면 연결을 어느 한쪽이 끝날때까지 계속해서 패킷 정보를 주고 받을 수 있다. 이것은 ServerSocket 클래스와 Socket 클래스로 이루어진다. Socket 클래스는 앞서 말했다 싶이 정보교환을 제공하는 매체가 되는 객체인데. 두컴퓨터의 소켓과 소켓을 통로로 연결하여 통신을 할수 있겠금 해준다. 
ServerSocket은 서버측에서 대기를 하다가 클라이언트쪽의 요청이 도착하게되면 자신의 소켓을 반환하여 준다.
클라이언트에서 서버측으로 Socket을 이용하여 요청을 보내기 위해서는 서버측의 IP와 포트 번호가 필요하다. 그래서 Socket
객체를 선언 생성 할때는 임의로 IP와 포트번호를 적어준다. 하지만 서버는 어떻게 상대편의 IP를 알고 포트번호를 알수 있을까? 간단하게 생각해보니 알수 있었다. 클라이언트쪽에서 요청을 보낼시에 자신의 IP와 포트정보를 포함해서 보내면 서버측에서 이를 받아 생성할때 그정보를 자신의 소켓에 저장하는 것이다. 이로써 둘은 서로의 IP와 포트 정보를 알게되고 그  ServerSocket이 닫히게되면 그 서로의 소켓 연결은 끝나게 된다. 

이를 그림으로 알아보겠다.

후우 디자인이 정말 안습하지만 설명하겟다.  

일단은 Server가 되는 컴퓨터와 Client가 되는 컴퓨터가 있어야 하기 때문에 서버가 되는 컴퓨터에 ServerSocket이 생성되어 있어야 한다. 그 ServerSocket에 .accept()메소드를 이용하여 Client에서 서버로 요청이 올때까지 대기시켜 놓는다. 요청이 오게되면 상대방의 IP와 포트 정보를 가지는 Socket을 생성하여 두 소켓을 연결상태로 유지한다.
생성된 Socket 객체의 InputStream과 OutputStream을 이용하여 요청과 응답을 방복하며 계속 정보를 주고 받을 수 있다.
그리고 모든 정보를 주고 받고 나면 Socket과 ServerSocket을 .Close()하여 종료 시키면 모든 작업이 끝난다.

간단한 소스를 보겠다.

Server
class Server extends JFrame{

 try{
 serversocket= new ServerSocket(9001); //서버 소캣 생성시 들어올 포트를 지정해준다.
 System.out.println("소캣생성완료 대기중");
 socket= serversocket.accept();
 System.out.println("대기후소캣생성");
//BufferedReader은 요청온 정보가 바이트 스트림이 때문에 이를 문자열스트림으로 바꾼다.
 reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
// PrintWriter또한 문자열로 바꿔준다.
 writer =new PrintWriter(socket.getOutputStream(),true);
 System.out.println("버퍼 생성완료");
 
 while((mng=reader.readLine())!=null){ // 요청온 정보가 있게되면 응답을 보낸다.
  System.out.println(mng);
  System.out.println("출력");
  str="서버철님이시다.";
  writer.println(str);// 보낼때에는 꼭 println으로 보내야 한다. 상대방이 라인으로 검사하기 때문이다.
  System.out.println("메세지 전송");
 }
 
 }catch(Exception e){
  e.getStackTrace();
 }finally{
   try{
   if(socket!=null)socket.close();
   if(reader!=null)reader.close();
   if(writer!=null)writer.close();
   }catch(IOException e){
    e.getStackTrace();
   }
  }
 
 String mng="";
 ServerSocket serversocket=null;//서버소켓선언
 String str =null;
 PrintWriter writer=null;
 BufferedReader reader=null;
 Socket socket=null;// 소켓선언
 Board bod= new Board(20,30);
}

Client
class Client extends JFrame{
  try{
   socket= new Socket("127.0.0.1",9001);// 서버측의 주소와 포트 번호를 지정해준다.
   System.out.println("소캣생성완료");
   reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
   writer =new PrintWriter(socket.getOutputStream(),true);
   System.out.println("버퍼 생성완료");
   wprint(); // 요청메소드 호출
   
   while((mng=reader.readLine())!=null){
    System.out.println(mng);
    System.out.println("출력");
   }
  }catch(Exception e){
   e.getStackTrace();
  }finally{
   try{
   if(socket!=null)socket.close(); // 소켓 종료
   if(reader!=null)reader.close();
   if(writer!=null)writer.close();
   }catch(IOException e){
    e.getStackTrace();
   }
  }

 
 public void wprint(){
  str="클라이언트철님이시다.";
  writer.println(str);//println로 해야 readLine()으로 읽을 수있다.
  System.out.println("메세지 전송완료");
 }
 String str =null;
 String mng ="";
 PrintWriter writer=null;
 BufferedReader reader=null;
 Socket socket=null;
 Board bod= new Board(20,30);
}

writer.println과 readLine() 부분에서 많이 해메게 되었는데
reader.readLine()하게되면 한 문장을 받아오게 되는데 나는 writer.print()로 메세지를 보냈더니.
한문장으로 인식 하지 못하는거 같다. 그래서 writer.println()으로 했더니 reader.readLine()이 제대로 읽어왔다.
참 쉬운부분인데 바보같다 앞으로는 이런 간단한 부분을 실수 하지않도록 신경 쓰도록 하여야겠다.
반응형
Comments