0713 java Network

onnbi·2022년 7월 26일
0

java-tutorial

목록 보기
13/13
post-thumbnail

네트워크

여러 대의 컴퓨터를 데이터 교환을 목적으로 통신 회선으로 연결한 것

서버와 클라이언트

네트워크로 연결된 컴퓨터 간의 관계를 역할로 구분

  • 서버 : 서비스를 제공하는 컴퓨터 또는 프로그램
  • 클라이언트 : 서비스를 요청하여 사용하는(제공받는) 컴퓨터 ex)크롬
  • IP주소 : 통신기기들이 서로 인식하고 통신하기 위해 사용하는 고유의 주소
  • port : 같은 컴퓨터 내에서 프르그램을 식별하는 번호
    클라이언트는 서버 연결 요청 시 ip주소와 port번호를 알아야 요청 가능

프로토콜

컴퓨터 간의 정보를 주고 받을 때 통신방법에 대한 규약

TCP

신뢰성을 최대한 보장하기 위한 방식
연결지향형 (3-way handshake)
순차적으로 데이터를 전송하고 확인
오류 시 재전송
HTTP, FTP 등에 사용

UDP

빠른 전달을 보장하기 위해 사용
비연결지향형
확인 및 재전송 작업 없음
실시간 스트리밍 서비스 등에 사용

Socket 프로그래밍

서버와 클라이언트가 통신하기 위한 매개체, 소켓을 이용한 통신 프로그래밍

java.net 패키지를 통해 소켓 프로그래밍 지원

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

public void tcpServer() {
	Scanner sc = new Scanner(System.in);
	// 1. 서버에서 사용할 포트 번호 지정
	// 	  0~65535 중 1개 사용
	//	  0~1000 사용중인 포트 번호가 많기 때문에
	//	  1000 이후의 번호를 사용
	int port = 7777;
	//	반환할 객체 미리 선언
	//	서버에서 포트를 열기위한 개체
	ServerSocket server = null;
	//	데이터 주고 받기위한 보조 스트림
	DataOutputStream dos = null;
	DataInputStream dis = null;
	
	try {
		// 2. 서버 소켓 객체 생성
		// 생성자 매개변수로 전달한 포트 번호가 열리면서 서버 대기상태
		server = new ServerSocket(port);
       	// 이 시점에서 서버 준비 완료
         
		System.out.println("[서버 준비 완료]");
		System.out.println("클라이언트 접속 요청 대기 중 . . ... ");
			
		// 3. server.accept() : 클라이언트 접속 요청 대기
		// 4. 접속요청이 들어오면 수락해서 통신할 객체를 생성
		Socket client = server.accept();
		System.out.println("클라이언트 접속 완료");
         
    	// 연결을 기다리는 서버는 클라이언트가 소켓에
		// 서버 아이디와 포트넘버를 담아 접속하면
		// accept해서 소켓에 담는다
		// 클라이언트 접속 완료
			
		// 5. 데이터를 주고 받기 위한 스트림 추출
		// (소켓안에 이미 스트림이 존재(양방향))
		OutputStream out = client.getOutputStream();
		InputStream in = client.getInputStream();
			
		// 6. 보조스트림으로 성능개선
		dos = new DataOutputStream(out);
		dis = new DataInputStream(in);
			
		// 7. 스트림을 통한 입력 및 출력
		String clientMsg = dis.readUTF();
		System.out.println(clientMsg);
			
		// -------------------
		System.out.print("클라이언트에게.. : ");
		String serverMsg = sc.next();
		dos.writeUTF(clientMsg);
			
	} catch (IOException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}finally {
		try {
			dis.close();
			dos.close();
			server.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

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

public void tcpClient() {
	Scanner sc = new Scanner(System.in);
	// 1. *서버* 아이피주소, 포트 번호 지정
	String serverIP = "192.168.10.9"; // 자기자신ip호출(루프백)
	int serverPort = 7777; //서버에서 사용하는 포트번호
	// 자원반환에 필요한 객체 미리 선언
	Socket socket = null;
	DataOutputStream dos = null;
	DataInputStream dis = null;
	
	try {
		// 2. 지정한 아이피와 포트로 소켓객체를 생성
		// 서버에 요청을 보냄
		socket = new Socket(serverIP, serverPort);
		System.out.println("서버 접속 완료 !!");
		
		// 3. 데이터를 주고받기 위한 스트림을 추출
		InputStream in = socket.getInputStream();
		OutputStream out = socket.getOutputStream();
		
		// 4. 보조스트림으로 성능개선
		dos = new DataOutputStream(out);
		dis = new DataInputStream(in);
		
		// 5. 스트림을 통한 입력 및 출력
		System.out.print("서버에 전송할 메시지 : ");
		String sendMsg = sc.next();
		dos.writeUTF(sendMsg);
		
		// =================== 기본 송수신 끝
      
		String serverMsg = dis.readUTF();
		System.out.println(serverMsg);
				
	} catch (IOException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}finally {
		try {
			socket.close();
			dis.close();
			dos.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}
profile
aelatte coding journal

0개의 댓글