728x90
Socket : 프로세스간 통신에 사용되는 양 끝단 영역

 

소켓을 사용하는 통신

 

java.net 안에 소켓이 있다. tcp/udp를 사용하는 소켓프로그래밍이 대표

  • tcp : 전화
    데이터를 전송하기 전에 먼저 상대편과 연결한 후 데이터 전송
    전송되어있는지 확인후, 실패라면 재전송 한다.

  • udp : 전보
    연결하지 않고 데이터를 전송
    전송 확인하지 않는다.
    데이터를 순서대로 수신한다는 보장이 없다.

서버 클라이언트의 1:1통신
서버가 먼저 실행되어 클라이언트의 연결 요청을 기다린다.


socket : 프로세스간 통신을 담당. inputSteam, OutputStream을 가지고 있음.
두 스트림을 통해 프로세스간 통신이 이뤄진다.
  
server socket : 포트와 연결되어 외부 연결 오청을 기다리다 연결이 들어오면
socket을 생성하여 소켓과 소켓간 통신을 한다.

하나의 포트에는 하나의 소켓이 연결된다.(프로토콜이 다르면 다른 포트로)

  1. 서버는 서버소켓을 사용해서 서버 컴퓨터의 특정 포트에서
    클라이언트 요청을 처리

  2. 클라이언트는 접속할 서버의 IP주소와 포트정보로 소켓을 생성해서
    서버에 연결을 요청
      
  3. 서버 소켓은 클라이언트의 요청을 받으며 서버에 새로운 소켓을 생성해서
    클라이언트와 연결
      
  4. 클라이언트의 소켓과 서버 소켓은 1:1 통신을 한다.

 

'JAVA' 카테고리의 다른 글

JSTL 연결하기  (0) 2021.08.10
jQuery 연결하기  (0) 2021.08.09
Net  (0) 2021.08.03
GUI  (0) 2021.08.01
스레드 (Thread)  (0) 2021.08.01
728x90
java.net

 

서버와 클라이언트

  • 서버 : 서비스를 제공하는 컴퓨터
  • 클라이언트 : 서버가 제공한 서비스를 받는 컴퓨터
      
  • 서버 모델 : 전용 서버를 두고 그 서버의 서비스를 받는다.
  • P2P 모델 : 클라이언트가 서버의 역할을 동시에 수행하는 것.
      

네트워크

  • 네트워크 : 두대 이상의 컴퓨터를 케이블로 연결하여 네트워크를 구성 

  • IP : 네트워크 상에서 고유한 자신의 주소
    • 공인 : 어디에서던지 접속할 수 있는 주소
    • 내부 : 내부에서만 통용되는 주소. (192.168.0.10)
  • 포트 : 
    ex)
    • ftp 21
    • web 80
    • mariadb 3306
    • mail 25

예제 1. 

<NetStream>

네이버 서버 프로그램 구현

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;

public class Net02 {
	public static void main(String[] args) {
		
		URL url = null;
		BufferedReader br = null;
		String addr = "https://www.naver.com";
		
		try {
			url = new URL(addr);
			InputStream is = url.openStream();
			br = new BufferedReader(new InputStreamReader(is));
			String line = "";
			while (    (line = br.readLine()) != null    ) {
				System.out.println(line);
			}
			
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

 

예제 2.

<InetAddress>

호스트명, 호스트주소 받아오기

import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Arrays;

public class Net03 {
	public static void main(String[] args) {

		InetAddress ip = null;
		InetAddress[] ipArr = null;

		try {
			// https:// 없이 작성
			ip = InetAddress.getByName("www.naver.com");
			System.out.println("getHostName : " + ip.getHostName());
			System.out.println("getHostAddr : " + ip.getHostAddress());
			System.out.println("ip를 문자열로 반환 : " + ip.toString());

			byte[] ipAddr = ip.getAddress();
			System.out.println("getAddress : " + Arrays.toString(ipAddr));
			// ip : 0 ~ 255
			String result = "";
			for (int i = 0; i < ipAddr.length; i++) {
//				if (ipAddr[i] < 0) {
//					result += ipAddr[i] + 256;
//				} else {
//					result += ipAddr[i];
//				}
//				result += ".";
				// 위의 방식을 간략히 표현한것이 아래방식
				result += (ipAddr[i] < 0 ? ipAddr[i] + 256 : ipAddr[i]);
				result += ".";
			}
			System.out.println("변경된 IP : " + result);

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

		// 내 IP 출력하기
		try {
			ip = InetAddress.getLocalHost();
			System.out.println("getHostName : " + ip.getHostName());
			System.out.println("getHostAddr : " + ip.getHostAddress());
			System.out.println("ip를 문자열로 반환: " + ip.toString());
		} catch (UnknownHostException e) {
			e.printStackTrace();
		}
		
		try {
			ipArr = InetAddress.getAllByName("www.naver.com");
			for (int i = 0; i < ipArr.length; i++) {
				System.out.println("ipArr[" + i + "] : " + ipArr[i]);
			}
		} catch (Exception e) {

		}

	}
}

[실행결과]

getHostName : www.naver.com
getHostAddr : 125.209.222.141
ip를 문자열로 반환 : www.naver.com/125.209.222.141
getAddress : [125, -47, -34, -115]
변경된 IP : 125.209.222.141.
getHostName : DESKTOP-6I8DHJ9
getHostAddr : 192.168.56.1
ip를 문자열로 반환 : DESKTOP-6I8DHJ9/192.168.56.1
ipArr[0] : www.naver.com/125.209.222.141
ipArr[1] : www.naver.com/125.209.222.142

예제 3.

<URLConnection>

URLConnection 객체의 속성들을 .get( ) 메소드를 이용해 불러올 수 있다.

import java.net.URL;
import java.net.URLConnection;

public class Net04 {
	public static void main(String[] args) {
		
		URL url = null;
		
		try {
			url = new URL("https://www.clien.net/service/board/news/16278279?od=T31&po=1&category=0&groupCd=");
			URLConnection conn = url.openConnection();
			System.out.println("conn : " + conn);
			System.out.println("getAllowUserInteraction : " + conn.getAllowUserInteraction());
			System.out.println("getConnectTimeOut() : " + conn.getConnectTimeout());
			System.out.println("getContent : " + conn.getContent() );
			System.out.println("getContentEncoding : " + conn.getContentEncoding());
			System.out.println("getDate() : " + conn.getDate());
			System.out.println("getDefaultUserCaches : " + conn.getUseCaches());
			System.out.println("getContentType : " + conn.getContentType());
			System.out.println("getDoInput(): "+ conn.getDoInput());
			System.out.println("getExpiration : " + conn.getExpiration() );
			System.out.println("getHeaderField : " + conn.getHeaderFields());
			System.out.println("getIfModifiedSince : " + conn.getIfModifiedSince());
			System.out.println("getLastModified : " + conn.getLastModified());
			System.out.println("getURL : " + conn.getURL());
			System.out.println("getUserCache : " + conn.getUseCaches());
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

[실행결과]

conn : sun.net.www.protocol.https.DelegateHttpsURLConnection:https://www.clien.net/service/board/news/16278279?od=T31&po=1&category=0&groupCd=
getAllowUserInteraction : false
getConnectTimeOut() : 0
getContent : sun.net.www.protocol.http.HttpURLConnection$HttpInputStream@40005471
getContentEncoding : null
getDate() : 1627955209000
getDefaultUserCaches : true
getContentType : text/html;charset=UTF-8
getDoInput(): true
getExpiration : 0
getHeaderField : {Transfer-Encoding=[chunked], null=[HTTP/1.1 200 OK], Server=[Apache], X-Content-Type-Options=[nosniff, nosniff], Date=[Tue, 03 Aug 2021 01:46:49 GMT], X-Frame-Options=[DENY, DENY], Strict-Transport-Security=[max-age=63072000; includeSubDomains; preload], Cache-Control=[no-transform, private, max-age=0], Vary=[Accept-Encoding], Set-Cookie=[SESSION=ec5943f9-1ab5-44fd-a94f-6d28d671af4d; Path=/service/; HttpOnly, SCOUTER=xqku1kkokp7c6; Expires=Sun, 21-Aug-2089 05:00:56 GMT; Path=/, SCOUTER=x2s1b4s51lcu7s; Expires=Sun, 21-Aug-2089 05:00:56 GMT; Path=/], X-XSS-Protection=[1; mode=block], Content-Language=[ko-KR], Content-Type=[text/html;charset=UTF-8]}
getIfModifiedSince : 0
getLastModified : 0
getURL : https://www.clien.net/service/board/news/16278279?od=T31&po=1&category=0&groupCd=
getUserCache : true

예제 4.

<URL>

import java.net.MalformedURLException;
import java.net.URL;

public class Net05 {
	public static void main(String[] args) {
		try {
//			/URL url = new URL("https://docs.oracle.com/en/java/javase/11/docs/api/index.html");
			URL url = new URL("https://www.clien.net/service/board/news/16281434?od=T31&po=0&category=0&groupCd=");
			System.out.println("urlgetAuthority" + url.getAuthority());
			System.out.println("getContent :" + url.getContent());
			System.out.println("getDefaultPort :" + url.getDefaultPort());
			System.out.println("getFile :" + url.getFile());
			System.out.println("getHost :" + url.getHost());
			System.out.println("getPath :" + url.getPath());
			System.out.println("getProtocol:" + url.getProtocol());
			System.out.println("getQuery :" + url.getQuery());
			System.out.println("getRef :" + url.getRef());
			System.out.println("getUserInfo :" + url.getUserInfo());
			System.out.println("toExternalForm :" + url.toExternalForm());
			System.out.println("toURI :" + url.toURI());
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}
}

[실행결과]

urlgetAuthoritywww.clien.net
getContent :sun.net.www.protocol.http.HttpURLConnection$HttpInputStream@40005471
getDefaultPort :443
getFile :/service/board/news/16281434?od=T31&po=0&category=0&groupCd=
getHost :www.clien.net
getPath :/service/board/news/16281434
getProtocol:https
getQuery :od=T31&po=0&category=0&groupCd=
getRef :null
getUserInfo :null
toExternalForm :https://www.clien.net/service/board/news/16281434?od=T31&po=0&category=0&groupCd=
toURI :https://www.clien.net/service/board/news/16281434?od=T31&po=0&category=0&groupCd=

'JAVA' 카테고리의 다른 글

jQuery 연결하기  (0) 2021.08.09
소켓 (Socket)  (0) 2021.08.03
GUI  (0) 2021.08.01
스레드 (Thread)  (0) 2021.08.01
한글깨짐 오류  (0) 2021.07.30
728x90
GUI : 사용자가 컴퓨터와 정보를 교환할 때, 그래픽을 통해 작업할 수 있는 환경

 

자바의 GUI 종류

  1. awt :
    해당 운영체제의 특징을 따라 화면을 구성한다.
    (운영체제에 따라 다른 화면이 나온다)
    ex) 전통적인 그래픽 출력 Button

  2. swing :
    자바 영역에서 사용하는 look and feel을 적용해서 모든 운영체제가 같은 모습을 보이게 한다.
    ex) JButton

  3. javaFX :
    RIA(Rich Internet Application)를 디자인하고 만들어 테스트, 디버그, 배포까지 가능한
    일련의 그래픽과 미디어의 통합패키지
    더 가벼워지고 강력한 기능을 가지고 있다.

용어 정리

  • 컨테이너 :
    자바에서 창 역할을 한다.
    한개 이상의 컨테이너 위에 컨테이너들이 올라간다.
    컴포넌트보다 더 작은 개념
    ex) frame, window, panel, dialog, applet

  • 컴포넌트 :
    실제로 컨테이너 위에 올려저서 화면을 구성을 담당
    ex) button, textField, textArea, list

  • 레이아웃 :
    컨테이너 위에 컴포넌트들이 올려질 때 자리 배치 방법
    ex) flowLayout, boardLayout, gridLayout, cardLayout

※ 컨테이너 위에 컴포넌트 추가하는 방법

프레임.add(컴포넌트);

프레임.setSize(); 		//크기지정

프레임setVisible(boolean); 	//보여주기

 

ex)

import javax.swing.JButton;
import javax.swing.JFrame;

public class GUI02 {
	JFrame frame = new JFrame("스윙입니다");
	JButton button = new JButton("Click me.");
	
	public void createFrame() {
		frame.add(button); 					//버튼을 프레임에 넣기
		frame.setSize(300, 600);				//보여줄 크기
		frame.setVisible(true);					//보여주기 여부
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);	//닫기버튼 명령 처리
	}
	public static void main(String[] args) {
		GUI02 g02 = new GUI02();
		g02.createFrame();
	}
}

[실행결과]

'JAVA' 카테고리의 다른 글

소켓 (Socket)  (0) 2021.08.03
Net  (0) 2021.08.03
스레드 (Thread)  (0) 2021.08.01
한글깨짐 오류  (0) 2021.07.30
DAO와 DTO  (0) 2021.07.29
728x90
Thread : 프로세스보다 작은 실행 흐름의 최소 단위

 

  • 어떤 프로세스든지 하나 이상의 쓰레드가 수행된다.
    (프로세스 : 프로그램을 실행시켜서 동작하게 만든것.)
  • web에는 기본적으로 쓰레드가 적용되어 있다.
  • 스레드를 이용하여 하나의 프로세스에서 여러개의 처리 루틴을 가질 수 있다.
    (시간을 절약할 수 있다)
  • 자바에서는 스레드도 하나의 인스턴스로 정의한다.
  • 스레드는 스레드만의 main메소드를 지닌다
    (단 메소드명은 main이 아닌 run으로 사용한다)

스레드를 생성하는 방법

  1. Thread 클래스를 상속받아 사용 (확장)
  2. Runnable 인터페이스를 사용 (구현)

Runnable은 run( )이라는 단 하나의 메소드를 제공한다. 이에 반해 스레드 클래스는 많은 메소드를 포함하고 있다.

 

스레드 클래스를 상속받아 사용할 경우에는, 상위 클래스(스레드 클래스)로부터 run메소드를 오버라이딩 하여 사용한다.

스레드 클래스 내부에는 sleep라는 메소드가 있는데, 이는 static 메소드로서 실행흐름을 일시적으로 멈추는 역할을 한다.

 

Runnable 인터페이스로 구현한 클래스를 스레드로 바로 시작할 수는 없다. 스레드 클래스의 생성자에 해당 객체를 추가하여 시작해 주어야만 한다. 하지만 스레드 클래스를 상속하여 만든 클래스는 strat( )메소드를 바로 호출할 수 있다. 스레드를 시작하는 메소드는 start( )이며, 스레드가 시작하면 수행되는 메소드는 run( ) 이다.

 

ex)

public class Thread01 extends Thread{
	public void run() {
		System.out.println("스래드 시작");
	}

	public static void main(String[] args) {
		Thread01 t01 = new Thread01();
		t01.start();
	}
}

 

public class Thread02 extends Thread{
	int seq;
	public Thread02(int seq) {
		this.seq = seq;
	}

	@Override
	public void run() {
		System.out.println(this.seq + " 스래드 시작");
		try {
			Thread.sleep(1000);//1000 = 1초
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println(this.seq + " 스래드 끝");
	}
	
	public static void main(String[] args) {
		System.out.println("메인 시작");
		for (int i = 0; i < 10; i++) {
			Thread02 t02 = new Thread02(i);
			t02.start();
		}
		System.out.println("메인 끝");
		
	}
}
  • Thread.sleep( ) : 정해진 시간만큼 멈추기

'JAVA' 카테고리의 다른 글

Net  (0) 2021.08.03
GUI  (0) 2021.08.01
한글깨짐 오류  (0) 2021.07.30
DAO와 DTO  (0) 2021.07.29
clean  (0) 2021.07.28

+ Recent posts