본문 바로가기
Category/JAVA

[JAVA] 네트워크, Server와 socket

by developer__Y 2023. 11. 15.
TCP/IP 프로토콜

 

  • TCP(Transmission Control Protocol)
    : 두 시스템 간에 신뢰성 있는 데이터 전송을 관장하는 프로토콜, TCP에서 동작하는 응용프로그램 ex)
    e-mail,FTP,HTTP등
  • IP(Internet Protocol)

: 패킷 교환 네트워크에서 송신 호스트와 수신 호스트가 데이터를 주고 받는것을 관장하는 프로토콜

TCP보다 하위 계층 프로토콜

: 네트워크 상에서 유일하게 식별될 수 있는 컴퓨터의 주소로 숫자로된 주소를 문자열로 구성된 도메인 이름(www.naver.com)으로 바꿔서 사용. 

 

포트(PORT)

 

할단된 IP 주소의 네트워크 안에서 통신할 응용 프로그램을 식별하는 번호. (0~65535)

모든 응용프로그램은 하나 이상의 포트 생성 가능.

well-known-ports는 시스템이 사용하는 잘 알려진 포트번호 (0~1023) 

ex) SSH : 22 , HTTP : 80 , FTP: 21, DBMS: 1521 등..

같은 IP내에서 다른 포트끼리 통신을 주고 받을수도있고, 다른 IP의 특정 포트끼리도 통신을 주고 받을수 있다.

 

소켓(socket)

 

TCP/IP 네트워크를 이용하여 쉽게 통신 프로그램을 작성하도록 지원하는 기반 기술

두 응용프로그램간의 양방향 통신 링크를 통해 데이터를 주고받기위해 소켓은 특정 IP포트 번호와 결합한다.

소켓을 이용한 서버 클라이언트 통신 프로그램의 전형적인 구조

소켓을 이용한 서버 클라이언트 통신 프로그램의 전형적인 구조

 

 

ServerSocket 클래스

: java.net 패키지에 포함된 서버 소켓에 사용되는 클래스로 생성자로 포트번호를 받아

특정 포트에서 주고받을수있는 소켓이 생성된다.

 

Socket 클래스

: 클라이언트 소켓에 사용되는 소켓.

 

소켓으로부터 데이터를 전송하는 하나의 방식으로 입출력 스트림을 통해 데이터를 주고받을수 있다.

해당 내용을 바탕으로 간단히 서버와 클라이언트가 소켓을 통해 통신하는 예제를 짜보았다.

 

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

// 서버쪽 클래스 
public class ServerEx {
	public static void main(String[] args) {
		ServerSocket listener = null; // 서버 소켓 선언
		Socket socket = null; //클라이언트 소켓 선언
		BufferedReader in =null; //입력 : 클라이언트에서 들어오는 데이터
		BufferedWriter out = null; // 출력 : 서버에서 클라이언트로 보내는 데이터
		Scanner scanner = new Scanner(System.in); // 서버에서 클라이언트로 데이터를 출력하는 상황을 위해 스캐너 객체 사용
		
		try {
			listener = new ServerSocket(9997); // 9999번 포트에 서버소켓 객체 생성
			System.out.println("연결을 기다리고 있습니다..");
			socket = listener.accept(); // accept 메소드를 통해 클라이언트가 접속하기를 기다다가, 접속하는 socket 객체로 데이터를 주고받는다.
//			클라이언트에서 들어오는 데이터를 받기위해 inputstream을 이용한 하나의 방식
			in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
//			서버에서 보내는 데이터
			out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
//			계속해서 메세지를 주고받기위해 while반복
			while(true) {
				String inputMessage = in.readLine(); // 한 행(\n)의 문자열을 읽는 BufferedReader 메소드
				if(inputMessage.equals("bye")) { // 클라이언트의 메시지가 bye 일때,접속 종료
					System.out.println("클라이언트에서 bye를 입력하여 연결을 종료하였음.");
					break;
				}
				System.out.println("클라이언트 : "+inputMessage);
				System.out.print("보내기>>");
				String outputMessage = scanner.nextLine(); // 서버에서 클라이언트에게 보내는 메시지 입력
				out.write(outputMessage+"\n"); // 클라이언트로 메시지 보내기
				out.flush(); // 비정상적인 종료일때 메시지 재전송(남은 버퍼 전부다 내보내는 메소드)
				
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally { // 접속 종료시 자원 반납 ++객체 반납은 주로 만든순서 반대로 반납함.
			try {
				scanner.close(); 
				socket.close();
				listener.close();
			} catch (Exception e2) { // 서버와 클라이언트 간 입출력시 예외 발생
				System.out.println("클라이언트와 채팅중 오류가 발생했습니다.");
			}
		}
	}
}
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.util.Scanner;

public class ClientEx {
	public static void main(String[] args) {
		Socket socket = null;
		BufferedReader in =null; //입력 : 클라이언트에서 들어오는 데이터
		BufferedWriter out = null; // 출력 : 서버에서 클라이언트로 보내는 데이터
		Scanner scanner = new Scanner(System.in); // 서버에서 클라이언트로 데이터를 출력하는 상황을 위해 스캐너 객체 사용
	
	try {
//		접속할 ip와 포트로 클라이언트 소켓 객체 생성
		socket = new Socket("localhost", 9997);
		in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
//		서버에서 보내는 데이터
		out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
		while(true) {
			System.out.println("보내기>>");
//			클라이언트에서 보내는 메시지
			String outputMessage = scanner.nextLine();
			if(outputMessage.equals("bye")) { // 
				out.write(outputMessage+"\n"); //'bye'라도 메시지는 보내야함. 서버로 메시지 보내기
				out.flush();
				break;
			}
			out.write(outputMessage+"\n"); //'bye'아니면 서버로 메시지 보내기
			out.flush();
			String inputMessage = in.readLine(); //한 행의 문자열을 읽는다.
			System.out.println("서버 : "+inputMessage); //서버에서 온 메시지
		}
	
	}catch (Exception e) {
		e.printStackTrace();
	
	
	
	}
	finally {
		try {
			//자원반납
			scanner.close();
			socket.close();
		} catch (Exception e2) {
			// TODO: handle exception
		}


}
}
}

'Category > JAVA' 카테고리의 다른 글

logback을 사용하여 log관리하기  (0) 2024.05.10
Apache Commons Library  (0) 2024.05.09
[JAVA] thread란?  (0) 2023.11.15
[JAVA] Collection FrameWork  (0) 2023.11.13
[JAVA] Object클래스& ==연산자와 equals메소드  (0) 2023.11.10