6-1.(2) 네트워킹_TCP Socket ServerSocket

zhyun·2020년 10월 14일
0

HighJava

목록 보기
50/67
post-custom-banner

TCP vs UDP

TCP/UDP 포트 목록

  • TCP/IP의 전송계층에서 사용되는 프로토콜
  • 전송계층은 IP에 의해 전달되는 패킷의 오류를 검사하고 재전송 요구 등의 제어를 담당
  • 신뢰성이 요구되는 애플리케이션은 TCP를 사용
  • 간단한 데이터를 빠른 속도로 전송(UDP는 비연결지향형이라서) 하고자 하는 애플리케이션에서는 UDP를 사용

TCP

  • 자바는 TCP 네트워킹을 위해 Socket & ServerSocket 클래스를 제공
  • 연결 지향형 프로토콜

TCP 구현을 위한 클래스들

  • InetAddress클래스
  • URL, URLConnection 클래스
  • Socket & ServerSocket 클래스

Socket / SeverSocket클래스

Socket클래스

  • Client가 Server로 연결요청을 한다.
  • 커뮤니케이션을 위해 사용하는 양 끝단을 Socket (ex. 대화창, 파일전송)
  • 데이터 전송을 담당
  • 인터넷 연결

Socket클래스 주요생성자

생성자설명
Socket(InetAddress address, int prot)InetAdress 객체와 port를 이용하여 Socket객체를 생성
Socket(String host, int port)host와 port를 이용하여 Socket 객체를 생성

Socket클래스 주요메서드

반환형메서드설명
voidclose()소켓 객체를 담는다
InetAdressgetInetAdress()소켓 객체를 InetAdress객체로 반환
InputStreamgetInputStream()소켓 객체로부터 입력할 수 있는 InputStream객체를 반환
InetAdressgetLocalAddress()소켓 객체의 로컬 주소를 반환
intgetPort()소켓 객체의 포트를 반환한다
booleanisClosed()소켓 객체가 닫혀있으면 true를 반환, 열려있으면 false를 반환
booleanisConnection()소켓객체가 연결되어 있으면 true, 연결되어 있지 않으면 false를 반환

ServerSocket 클래스

  • 서버 프로그램에서 사용하는 소켓
  • 포트를 통해 연결 요청이 오길 대기
  • 요청이 오면 클라이언트와 연결을 맺고 또 다른 소켓을 만드는 일을 한다.
  • 새로 만들어진 소켓은 클라이언트 소켓과 데이터를 주고 받는다.

ServerSocket 클래스 주요 생성자

생성자설명
ServerSocket(int port)port를 이용하여 ServerSocket객체를 생성

ServerSocket 클래스 주요 메서드

반환형메서드
Socketaccept()
voidclose()
intgetLocalPort()
intgetSoTimeout()
booleanisClosed()
booleansetSoTimeout(int timeout)

TCP 소켓 서버(Server) 프로그래밍

  • 동작과정
    • TCP 소켓통신을 하기 위해 ServerSocket객체 생성 : port번호를 갖고 생성
    • ServerSocket객체accept()메서드를 호출하여 Client로부터 연결요청이 올 때까지 계속 기다린다
    • 연결 요청이 들어오면 새로운 Socket객체를 생성하여 Client의 Socket과 연결
    • Socket객체Stream객체(InputStream,OuputStream)을 이용하여 메세지를 주고 받는다.
    • 사용이 완료된 소켓close()메서드를 이용하여 종료 처리한다
  • 예제 6.JavaNetworkTest / T01_TcpServer
public class T01_TcpServer {
	public static void main(String[] args) throws IOException {
		//20.10.13
		//1. TCP소켓 통신을 하기 위한 ServerSocket객체 생성
		//ServerSocket을 생성할 때 포트번호 하나를 지정해야 한다.
		ServerSocket server = new ServerSocket(7777); // (port번호 ~ 1024번까지 쓰면안됨)
		System.out.println("서버가 접속을 기다립니다...");
		
		//accept()메서드 Client에서 연결요청이 올때까지 계속 기다린다.
		//연결 요쳥이 오면 Socket객체를 생성해서 Client의 Socket과 연결한다.
		Socket socket = server.accept(); // accept() : 블락상태 -> 쓰레드로 치면 wait 상태
		                                 // 클라이언트가 포트번호 7777로 연결요청이 올때가지 대기
										 // ServerSocket이 Socket을 만듦	
		//--------------------------------------------
		//이 이후는 클라이언트와 연결된 후의 작업을 진행하면 된다.
		//>>>>main쓰레드 시작
		System.out.println("접속한 클라이언트 정보");
		System.out.println("주소 : "+ socket.getInetAddress()); //해당 객체 정보 (인터넷 주소) to String() 호출
		
		//Client에 메시지 보내기
		
		//OutputStream객체를 구성하여 전송한다.
		//접속한 Socket의 goOutputStream()메서드를 이용하여 구한다.
		OutputStream out = socket.getOutputStream(); 
		DataOutputStream dos = new DataOutputStream(out); //outputstream 객체 'out' 담음
		dos.writeUTF("어서 오세요...");//메시지 보내기
		System.out.println("메시지를 보냈습니다.");
		
		dos.close(); //스트림 객체 닫아줌
		server.close(); //소켓도 닫아줌 >> 자원반납
		
	}//main
}//class

TCP 소켓 클라이언트(Client) 프로그래밍

  • 동작과정
    • Socket 객체를 생성하여 서버에 연결 요청을 하다 : 자신의 IP주소와 Port번호를 갖고!
    • 연결이 정상적으로 이루어 지면 생성된 Socket객체를 이용하여 서버와 메세지를 주고 받는다.
    • 생성된 Socket 객체로부터 스트림(InputStream, OutputStream)객체를 가져와 이용함
    • 사용이 완료된 소켓은 close()메서드를 이용하여 종료처리한다.
public class T02_TcpClient {
	public static void main(String[] args) throws IOException {

		String serverIp = "127.0.0.1"; // 루프백 주소?
		//자기 자신 컴퓨터를 나타내는 방법
		//IP : 127.0.0.1
		//컴이름 : localhost
		
		System.out.println(serverIp + " 서버에 접속 중입니다.");
		
		//'소켓을 생성'해서 서버에 연결을 요청한다.
		Socket socket = new Socket(serverIp, 7777); //다른 서버로 접속 시도
		                                            //객체가 만들어질때까지 대기상태
		
		//연결이 되면 이후의 명령이 실행된다.
		System.out.println("연결되었습니다.");
		
		//서버에 보내온 메시지 받기
		//메시지를 받기 위해 InputStream객체를 생성한다.
		//Socket의 getInputStream()메서드 이용
		InputStream is = socket.getInputStream();
		DataInputStream dis = new DataInputStream(is);
		
		//서버로부터 받은 메시지 출력하기
		System.out.println("받은 메시지 : "+ dis.readUTF());
		
		System.out.println("연결종료.");
		//T01_TcpServer 클래스 Console창 켜놓고 지금 창 Console창 실행해야댐
		
		dis.close();
		socket.close();
		
	}
}
profile
HI :)
post-custom-banner

0개의 댓글