티스토리 뷰

Chapter 15. Java Newtwork Programming

 

▶ 학습 목표

: 스레드가 무엇인지 설명할 수 있고 스레드를 생성하고 구현할 수 있다.

 

 

 

 

 

 

15-1. Network Programming

: 네트워크 프로그래밍은 다른 컴퓨터와 통신할 수 있는 프로그램을 작성하는 것

 

 

- 네트워크와 네트워크 프로그래밍

네트워크는 분산되어 있는 두 개 이상의 컴퓨터를 통신망으로 연결한 것을 말한다.

그러므로 네트워크 프로그래밍은 다른 컴퓨터와 송수신할 수 있는 프로그램을 만드는 것이다.

(서버(주는것)와 클라이언트(받는 것) 사이에서 주고 받을때 네트워크를 통해 주고 받는다)

 

 

 

 

 

 

 

 

15-2. 클라이언트(Client) / 서버(Server)

: 클라이언트는 서비스를 요청하는 프로그램이고 서버는 그 요청에 응답하는 프로그램이다.

 

- 클라이언트

서비스를 사용하는 컴퓨터

 

 

- 서버

서비스를 제공하는 컴퓨터

(웹 서버는 웹을 주는 것)

 

 

서버와 클라이언트는 데이터를 주고 받으며 네트워킹한다.

 

 

 

 

 

 

 

15-3. IP 주소

: 컴퓨터마다 부여되는 고유한 주소이다.

컴퓨터와 네트워크에서 장치들이 서로 인식하고 통신 하기 위해 사용된다.

 

 

 

- IP주소

 

 

네트워크에서 장치들이 서로를 인식하고 통신하기 위한 특수한 번호이다.

인터넷에 연결된 모든 컴퓨터는 4byte의 정수로 구성된 IP주소를 가진다.

자신의 IP 주소를 알아보기 위해서는 cmd를 실행하여 'ipconfig' 를 입력하면 콘솔에 여러 결과 값이 표시된다.

그 중 IPv4 주소가 자신의 IP주소이다.

 

 

위의 콘솔 창을 보면 이 컴퓨터의 IP 주소는 192.168.0.137 인 것을 알 수 있다.

 

 

 

IP 주소는 반으로 나눠서 공통으로 사용하는 네트워크 주소와 개인별로 할당되는 호스트 주소로 이루어져 있다.

 

IP 주소 = 네트워크주소 + 호스트 주소

 

예를 들어 네트워크 주소는 창원시 성산구 이고 호스트 주소는 도로와 정확한 지번이라고 예시를 들 수 있다.

 

 

 

자바는 IP 주소를 다루는데 이용하는 InetAddress 클래스가 있다.

 

InetAddress 클래스의 메서드 종류

메서드 설명
byte[] getAddress() IP주소를 byte 배열로 반환한다.
static InetAddress[]
getAllByName(String host)
도메인명에 지정된 모든 호스트의 IP주소를 배열에 담아 반환한다.
static InetAddress
getByName(String host)
도메인명을 통해 IP 주소를 얻는다.
String getHostAddress() 호스트의 IP주소를 반환한다.
String getHostName() 호스트의 이름을 반환한다.
boolean isMulticastAddress() IP주소가 멀티캐스트 주소인지 확인한다.
boolean isLoopbackAddress() IP주소가 loopback 주소인지 알려준다.

 

 

 

 

 

exam-108

InetAddress클래스의 메서드를 이용하여 현재 컴퓨터의 IP 주소와 이름을 확인하는 예시

package chapter15;

import java.net.InetAddress;
import java.net.UnknownHostException;

public class IP 
{
	
	public static void main(String[] args) 
	{
		InetAddress ip = null;  //객체생성(static 이라 new 안됨 아래의 코드보면 클래스명.함수())
		try {
			
			ip=InetAddress.getLocalHost();  //초기화
			
			System.out.println("getHostName() : "+ip.getHostName());  //호스트이름 반환
			System.out.println("getHostAddress() : "+ip.getHostAddress());  //호스트 IP주소 반환

		} catch (UnknownHostException e) 
		{
			
			e.printStackTrace();
		}
	
	}

}

 

getHostName() : DESKTOP-MQJVP8M
getHostAddress() : 192.168.0.137

 

 

'String getHostAddress()' 메서드를 이용하여 코드를 작성한 후 출력한 출력값을 살펴보면 

cmd에서 확인한 IP 주소와 같다는 것을 알 수 있다.

 

 

 

 

 

15-4. 소켓 프로그래밍 TCP 와 UDP

 

 

- 소켓 프로그래밍

 

소켓을 이용하여 프로그램을 작성한 것을 소켓 프로그래밍이라고 한다.

 

여기서 소켓이란 프로세스간의 통신에 사용되는 양쪽 끝단을 의미한다.

소켓을 이용하여 서버와 클라이언트 두 개의 프로그램이 특정 포트를 통해 양방향 통신이 가능하도록 만들어준다.

 

포트란 가상의 통신 선로이다.

하나의 컴퓨터 안에는 여러 개의 프로세스가 수행되고 있으므로 특정한 응용 프로그램과 통신하기 위해서는 그 특정한 프로그램으로 통하는 포트번호가 필요하다.

 

포트 번호는 0부터 65535까지의 번호를 사용한다.

하지만 1023아래의 포트는 다른 통신 프로그램이 사용하는 경우가 많기 때문에 1023번 이상의 숫자에서 사용하는 것이 좋다.

 

 

 

 

소켓 프로그래밍에는 TCP와 UDP 두가지의 방식이 있다.

이 두가지는 연결방식과 전송방식에서 차이가 있다.

 

 

항목 TCP UDP
연결방식 연결 후 통신(3way handshake)
1:1 통신 방식
연결하지 않고 통신
1:1 부터 n:n 통신방식
특징 데이터의 전송순서가 보장
데이터의 수신여부 확인(ACK 보냄)
UDP보다 느림(ACK가 와야 다시 전송)
데이터의 전송순서 보장되지 않음
순서가 바뀔 수 있음
데이터의 수신엽 확인안함
TCP보다 속도 빠름(ACK 안하고 그냥 막 보냄)

 

 

 

 

 

 

 

 

- TCP 소켓 프로그래밍

 

서버와 클라이언트의 일대일 통신이기 때문에 서버가 실행되고 클라이언트의 연결을 기다린다.

 

 

TCP 소켓 프로그래밍 통신 과정

1. 서버 쪽에서는 서버소켓을 특정 포트오 ㅏ결합하여 클라이언트의 연결요청을 기다린다.

2. 클라이언트 쪽에서는 소켓을 생성하여 서버의 IP 주소와 연결할 포트를 가지고 서버에 연결을 요청한다.

3. 서버 소켓은 클라이언트로부터 연결 요청을 받으면 서버 쪽에 새로운 소켓을 생성해서 클라이언트의 소켓과 연결한다.

4. 클라이언트와 서버의 소켓이 연결되었으므로 서로간의 통신이 가능해진다.

 

 

 

서버 쪽에는 서버소켓과 일반적인 소켓 두가지가 있다.

 

서버소켓은 단순히 클라이언트의 연결ㄹ요청을 받아서 일바적인 소켓과 클라이언트의 소켓을 연결해주는 역할만 한다.

실제 통신은 서버 쪽의 소켓과 클라이언트의 소켓 사이에서 이루어진다.

 

 

소켓

: 프로세스 간의 통신을 하며 InputStream과 OutPutStream을 가지고 있다.

이 스트림을 통해서 통신이 이루어진다.

 

서버소켓

: 포트와 연결되어 클라이언트의 연결을 기다리다가 연결이 되면 소켓을 생성해서 소켓끼리 연결되게 한다.

 

 

 

 

서버 프로그램

package chapter15;
import java.net.*;
import java.io.*;

public class ServerClass {

	public static void main(String[] args) {
		ServerSocket serverSocket = null;
		try {
			serverSocket = new ServerSocket(8126);
			System.out.println("서버가 준비되었습니다.");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		while(true) {
			System.out.println("연결 요청을 기다리는 중 ...");
			Socket socket;
			try {
				socket = serverSocket.accept();
				System.out.println(socket.getInetAddress()+"연결 요청이 들어왔습니다.");
				OutputStream out = socket.getOutputStream();
				DataOutputStream dos = new DataOutputStream(out);
				dos.writeUTF("TEST 확인");
				System.out.println("메시지를 전송합니다.");
				dos.close();
				socket.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
			
		}
		
	}

}

 

 

 

클라이언트 프로그램

package Chapter15;

import java.io.*;

import java.net.*;

public class Exam_111 {

   public static void main(String[] args) throws Exception 
   {

      String serverIp = "192.168.0.137";
      System.out.println("서버에 연결을 시도하는 중...");
      
      Socket socket = new Socket(serverIp,8126);
      InputStream in = socket.getInputStream();
      DataInputStream dis = new DataInputStream(in);
      System.out.println("서버로부터 받은 메시지 : "+ dis.readUTF());
      dis.close();
      socket.close();
      System.out.println("연결이 종료되었습니다.");
   
   }

}

 

 

클라이언트 프로그램의 serverIP에 서버프로그램을 실행하는 컴퓨터의 IP를 작성해준다.

 

포트가 충돌이 일어나서 제대로 실행되지 않았지만 제대로 실행된다면

 

 

이와 같은 결과가 콘솔에 출력된다.

 

 

 

 

 

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday