본문 바로가기
JAVA SE/이론 및 개념

[20.08.04/Day_19] Java SE / Network 네트워크 ( Protocol 프로토콜 - TCP-IP & Port | Socket 소켓 )

by 파프리카_ 2020. 8. 4.
728x90
반응형

[ Network 네트워크 ]

java 기반의 TCP-IP Network Programming

java.net  패키지에 주요 class들이 있다.


Protocol 프로토콜

: 통신 규약(약속)

 

TCP/IP : 인터넷 상의 통신 규약

  • TCP (Transmission Control Protocol) : 전송 제어 프로토콜
    데이터 전달 보증 → 신뢰성이 높다.
  • IP (Internet Protocol) : ip  address(전화번호와 유사)로 호스트 주소 지정
    * 자신의 ip는 cmd창에서 igconfig로 확인할 수 있다.
    ex)  나의 IP 주소
    192.168.0.115

  • 참고) DNS (Domain Name Service) 
    : www.daum.net  → ip와 연결되는 Domain name이다.   

 

Port 포트

: 가상의 연결 단위, 서버의 서비스 번호(입구)

 

  http://127.0.0.1:8080

  http:// → protocol

  127.0.0.1 → ip

  8080 → port

 


Socket 소켓

: 네트워크 연결의 양 끝 단위 (end-point)로서, 통신을 하기 위한 인터페이스를 제공한다(ex. 전화기)

socket.getInputStream(), socket.getOutputStream() 등을 제공

 

 

> ServerSocket : 서버를 구현하기 위한 필수 객체
1. 생성 시, 서비스 포트를 지정하고
2. accept() 를 명시해야 한다.  (**주요기능**)
   * accept() method는 클라이언트 접속을 대기하다가,
      클라이언트가 접속하면 실행되고,
      실행 후 반환되는 일반 Socket 객체는 접속한 해당 클라이언트와 통신을 위해 제공된다. 

     (메세지가 들어올때마다 새로 생성된다)

 

 

step1.

서버는 클라이언트의 접속을 대기하다 접속하면 클라이언트에게 메세지를 전송하고,

전송한 메세지를 클라이언트는 입력받아 자신의 콘솔에 출력하는 예제

Server

ServerSocket을 생성 (대표전화)
accept() : Socket (고객과 통신할 객체)
socket.getOutputStream() < PrintWriter
pw.println(메세지);
close()
Client

Socket(serverIp, port) 생성
socket.getInputStream() < InputStreamReader < BufferedReader
br.readLine(); //서버의 메세지를 입력받는다

 

예제

 

/ IP 

package common;

public interface IP {
	//public static final
	String LOCAL = "192.168.0.115";
	String FREIND = "192.168.0.160";
	String INST ="192.168.0.109";
}

 

/ Client

package step1;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Socket;
import java.net.UnknownHostException;

import common.IP;

public class NetClient {
	public void go() throws UnknownHostException, IOException {
		Socket socket = null;
		BufferedReader br = null;
		try {
			socket = new Socket(IP.LOCAL, 5432);
			System.out.println("***NetClient가 서버에 접속***");
			
			//서버로부터 정보를 입력받기 위해 스트림을 소켓으로부터 받는다 - node stream
			InputStream is = socket.getInputStream();
			
			// InputStreamReader : 8bit stream -> 16bit stream으로 변경하는 process stream
			InputStreamReader ir = new InputStreamReader(is);
			
			// BufferedReader & readLine() : 한 라인씩 읽는 기능을 제공하는 process stream 
			br = new BufferedReader(ir);
			System.out.println("서버가 보낸 메시지: "+ br.readLine());
			
		} finally {
			if (socket != null)
				socket.close();
			if (br!= null)
				br.close();
		}
	}
	
	public static void main(String[] args) {
		try {
			new NetClient().go();
		} 
		
		catch(IOException e) {
			e.printStackTrace();
		}
	}
}

 

/ Server

package step1;

import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class NetServer {
	public void go() throws IOException {
		ServerSocket serverSocket = null;
		Socket socket = null;
		PrintWriter pw = null;
		try {
			serverSocket = new ServerSocket(5432); //대표전화
			System.out.println("**서버실행**");
			
			while(true) 
			{	
				try
				{
					//accept() : 클라이언트 접속 대기 중, 접속되면 실행하고 일반소켓 반환
					socket = serverSocket.accept();
					
					// 접속한 Client IP 반환
					System.out.println("**" + socket.getInetAddress() + " Client 접속됨**");
					
					//getOutputStream : 클라이언트에게 데이터를 전송하기 위해 노트스트림을 반환
					OutputStream os = socket.getOutputStream();
					
					pw = new PrintWriter(os);
					pw.println("HELLO");
				} 
				finally //메세지 보내줄 때마다 끊어주기
				{
					if (pw != null)
						pw.close();
					if (socket != null)
						socket.close();
				}
			}
			
		} finally {
			if (pw != null)
				pw.close();
			if (socket != null)
				socket.close();
			if (serverSocket != null)
				serverSocket.close();
		}
	}
	
	public static void main(String[] args) {
		try{
			new NetServer().go();
		} catch(IOException e) {
			e.printStackTrace();
		}
	}
}

1. 왼쪽 cmd창에 java step1.NetServer 입력

→ **서버실행**

2. 오른쪽 cmd창에 java step1.NetClient 입력

→ **NetClient가 서버에 접속**

→ 서버가 보낸 메시지 : HELLO

3. 왼쪽 cmd창에 

→ **Client 접속됨**


 

step2.

서버는 접속을 대기하다가 클라이언트가 접속하여 메세지를 보내면,

그 메세지를 입력받아 자신의 콘솔창에 출력하고 다시 대기한다.

클라이언트는 서버에 접속하여 메세지를 전송하고 종료한다.

Server

ServerSocket(port)
accept() : Socket
socket.getInputStream()

close()
Client

Socket(serverIp, port)

soket.getOutputStream()

close()

 

/Client

: 서버에 접속하여, 데이터를 전송하고 종료한다.

  Scanner 적용해서 콘솔에서 서버에 보낼 메세지를 입력받아, 서버로 출력한다.

package step2;

import java.io.IOException;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

import common.IP;

/*
 * Client : 서버에 접속하여, 데이터를 전송하고 종료한다.
 * Scanner 적용해서 콘솔에서 서버에 보낼 메세지를 입력받아, 서버로 출력한다.
 */
public class NetClient {
	public void go() throws UnknownHostException, IOException {
		Socket socket = null;
		PrintWriter pw = null;
		Scanner scanner = null;
		try {
			scanner = new Scanner(System.in);
			socket = new Socket(IP.INST, 5432);
			//true:autoflush
			pw = new PrintWriter(socket.getOutputStream(), true); 
			
			String message = scanner.nextLine();
			pw.println(message);
			
			System.out.println("***서버에 접속해서 메세지 전송***\n"+ message);
			
		} finally {
			if (scanner != null)
				scanner.close();
			if (pw != null)
				pw.close();
			if (socket != null)
				socket.close();
		}
	}
	
	public static void main(String[] args) {
		try {
			new NetClient().go();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

 

/Server 

: 클라이언트의 접속을 대기 하다가, 클라이언트가 접속하여 메세지를 전송하면

  그 메세지를 자신의 콘설에 ip와 함께 출력하고 다시 대기한다.

package step2;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

/*
 * Server : 클라이언트의 접속을 대기 하다가, 클라이언트가 접속하여 메세지를 전송하면
 * 그 메세지를 자신의 콘설에 ip와 함께 출력하고 다시 대기한다.
 */
public class NetServer {
	public void go() throws IOException {
		ServerSocket serversocket = null;
		try 
		{
			serversocket = new ServerSocket(5432);
			System.out.println("**step2.NetServer 실행**");
			while(true) 
			{	
				Socket socket = null;
				BufferedReader br = null;
				try 
				{
				socket = serversocket.accept();
				br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
				
				String info = socket.getInetAddress() + "님의 메세지 : " + br.readLine();
				System.out.println(info);
				} 
				
				finally 
				{
					if (socket != null)
						socket.close();
					if (br != null)
						br.close();
				}
			}//while
			
		}//try
		
		finally 
		{
			if (serversocket != null)
				serversocket.close();
		}//finally
		
	}// go method
	
	public static void main(String[] args) {
		try {
			new NetServer().go();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

 

[ 결과 ] 

 

[ 결과 / Scanner 사용 시]

Scanner를 통해 메세지 입력
Client 실행
Server에서 메세지 받음


* step 3 : 서버 = 클라이언트 : 1 : 1 통신

* step 4 : 서버 = 클라이언트 : 1 : 多 통신, 서버에 multi threading

* step 5 : 서버 = 클라이언트 : 1 : 多 통신, 서버, 클라이언트 모두 multi threading

 

 

step3 (메아리 서버 클라이언트) 는 CODE 카테고리에 있습니다 

→ https://creamilk88.tistory.com/47 

 

CODE [20.08.04/Day_19] Java SE / Network 네트워크 | 메아리 서버, 클라이언트 프로그램 구현

step3 메아리 서버, 클라이언트 구성 서버는 클라이언트가 보낸 메세지를 입력받아 자신의 콘솔에 출력하고, 다시 그 메세지를 클라이언트로 보내는 역할을 지속적으로 한다. 클라이언트는 스캐�

creamilk88.tistory.com

 https://creamilk88.tistory.com/48

 

CODE REVIEW [20.08.05/Day_20] Java SE / Network 네트워크 | 메아리 서버/클라이언트 구현 복습

[ Review 복습 ] 서버 클라이언트 ServerSocket(port) → 대표 전화 역할 try 영역 try 영역 ServerSocket.accept() → 대기 상태 Socket socket = ServerSocket.accept(); → 직원 전화 역할 → Socket이 만들어..

creamilk88.tistory.com

 

step4(메아리 one 서버  multi 클라이언트) 는 CODE 카테고리에 있습니다 https://creamilk88.tistory.com/49

 

CODE [20.08.05/Day_20] Java SE / Network 네트워크 | 다수의 클라이언트에서 메아리 서비스 구현 (멀티 스��

step4 다수의 클라이언트에게 지속적으로 메아리 서비스하는 서버 구축 다수의 클라이언트에게 지속적으로 서비스하기 위해서는 서버측에 멀티 스레드가 필요하다. 클라이언트가 접속할 때, 서

creamilk88.tistory.com

 

step5(채팅 프로그램 + GUI) 는 CODE 카테고리에 있습니다 → https://creamilk88.tistory.com/51

 

CODE [20.08.06/Day_21] Java SE / Chatting 서버, 클라이언트 구현 (IO, Thread, GUI)

step5  채팅 서버 클라이언트 구현 (GUI 활용) Chatting Program의 UML < Server > 다수에 클라이언트에게 동시에 서비스(통신)를 제공해야 하기 때문에, 한 서버에서 Thread를 여러 개 생성해준다. → multi-Th..

creamilk88.tistory.com

 

728x90
반응형