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 |