3주차 12/12(월)

하이·2022년 12월 12일
0

수업

목록 보기
6/41
post-custom-banner

1주/2주차
Java 객체지향
Java 기본 class
Java Thread
Java IO

3주차
Java Network ~ chatting + JavaFx
방 1개짜리
방 여러개 짜리
귓속말, 전체 공지 (부가 기능)

①②③④⑤⑥

Java Network

① Network

다수의 computer들 간에 Data를 주고받기 위해 여러개의 computer를 연결(유선, 무선)해 놓은 물리적인 데이터 통신망
일반적으로 크기를 기준으로 여러가지 Network을 구성

PAN(Personal Area Network)...
LAN(Local Area Network)...
Network fo Network : Internet

② Service

email/ www/ ftp/ torrent

Network을 통해 두개의 computer가 Data통신을 하려면?

Network에 참여하고 있는 각 computer에게 논리적인 주소(IP Address)를 부여

④ protocol

: 데이터를 주고 받기 위해 통신을 하기 위한 규칙
: 정해져 있는 protocal이 이미 많이 있음

⑤ Port

: 하나의 숫자 (16bit 짜리 숫자 : 0~65535 사이값을 이용)
: 일반적으로 0~1023 은 well known-reserved port (강력 권장)

  • port는 하나의 computer에서 실행되는 program에 할당할 수 있는 번호unique
    • port번호는 유니크값 - 특별한 경우가 아니면 겹쳐서 사용하지 않음
    • ip와 port번호가 있어야 데이터 통신 가능

⑥ IP address & Port를 이용해 상대방 process를 식별

: 프로그램 작성 -> 너무 어려움
: BSD계열의 Unix체계에서 -> socket
=> Network program을 하니 할만 하더라 !
=> Java에서도 socket 통신을 지원하기 위해 socket class를 제공함

프로그램을 연결할 수 있는 양끝 단위
socket : 연결을 나타내는 논리적인 단위

Java Fx

: Java의 표준 GUI 라이브러리인 Swing을 대체하는 library
: library를 다운로드해서 설치 https://gluonhq.com/products/javafx/

JavaNetwork연습 프로젝트 생성
윈도우 - program files- java에 javafx 폴더 옮기기
properties- java buld path- libraries

event handling
사용자가 발생한 event를 처리하려면 어떻게 하나요?
Event Delegation model
Event 처리 방식의 개념

① Event Source
현재 event가 발생한 객체

② Event명
Event는 이미 Java에서 정의되어 있음
: event명을 이용해 class가 제공

③ Listener 객체
: event가 발생되었을 때 처리를 담당하는 객체

①②③④⑤⑥

④ event 객체

package javafxexam;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

//import java.awt.Button;
//
//import javafx.application.Application;
//import javafx.scene.layout.StackPane;
//import javafx.stage.Stage;
//public class JavaFXExample extends Application {
//	
//	@Override
//	public void start(Stage primaryStage) throws Exception {
//		// 화면 구성하는 작업을 여기서 함
//		Button btn = new Button();
//		btn.setText("안녕 !!");
//
//		
//		// button에 이벤트 처리를 해야 함
//		// Java는 delegation model을 이용함 => Web JavaScript도 이 방식을 이용
//		// Layout을 설정해요 (컴포넌트가 붙는 방식을 결정하는 객체)
//		//  StackPane => Layout 중 추가되는 순서대로 덧붙여서 시각화하는 Layout
//		StackPane root = new StackPane();
//		
//		root.getChildren().add(btn);
//		
//		
//	}
//	
//	public static void main(String[] args) {
//		launch();	//method 호출 - static . 내부적으로 static이 GUI라는 thread를 호출..
//		//GUI Thread가 실행되고 화면에 창이 뜸, main 종료
//		
//	}
//	
//}//

	public class JavaFXExample extends Application {
		@Override
		public void start(Stage primaryStage) throws Exception {
			// 화면 구성하는 작업을 여기서 함
			Button btn = new Button();
			btn.setText("안녕 !!");
			
			// button에 이벤트 처리를 해야 함
			// Scene객체를 생성
			// Java는 delegation model을 이용함 => Web JavaScript도 이 방식을 이용
			// Layout을 설정해요 (컴포넌트가 붙는 방식을 결정하는 객체)
			//  StackPane => Layout 중 추가되는 순서대로 덧붙여서 시각화하는 Layout

			StackPane root = new StackPane();
			root.getChildren().add(btn);
			
			Scene scene = new Scene(root, 300, 150);
			
			primaryStage.setTitle("연습입니다.");
			
			primaryStage.setScene(scene);
			
			primaryStage.show();
			
		}
	
	
	
	
	public static void main(String[] args) {
		launch();	//method 호출 - static . 내부적으로 static이 GUI라는 thread를 호출..
		//GUI Thread가 실행되고 화면에 창이 뜸, main 종료
		
	}
}


--module-path "C:\Program Files\Java\jdk-11.0.17\javafx-sdk-11\lib" --add-modules javafx.controls,javafx.fxml

event 처리

① event source
: 객체 -> class

② event 명
: class 제공 -> ActionEvent

③ Listener 객체
: 이벤트 처리 객체
: class / interface

④ event 객체
: event 상세 정보

⑤⑥


public class InterfaceTest{
	
    public static void main(String[] args) {
    	myInterface a = new myInterface(){
        
        @Override
        public void
        
        }
    
    }

}
package javafxexam;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

//import java.awt.Button;
//
//import javafx.application.Application;
//import javafx.scene.layout.StackPane;
//import javafx.stage.Stage;
//public class JavaFXExample extends Application {
//	
//	@Override
//	public void start(Stage primaryStage) throws Exception {
//		// 화면 구성하는 작업을 여기서 함
//		Button btn = new Button();
//		btn.setText("안녕 !!");
//
//		
//		// button에 이벤트 처리를 해야 함
//		// Java는 delegation model을 이용함 => Web JavaScript도 이 방식을 이용
//		// Layout을 설정해요 (컴포넌트가 붙는 방식을 결정하는 객체)
//		//  StackPane => Layout 중 추가되는 순서대로 덧붙여서 시각화하는 Layout
//		StackPane root = new StackPane();
//		
//		root.getChildren().add(btn);
//		
//		
//	}
//	
//	public static void main(String[] args) {
//		launch();	//method 호출 - static . 내부적으로 static이 GUI라는 thread를 호출..
//		//GUI Thread가 실행되고 화면에 창이 뜸, main 종료
//		
//	}
//	
//}//

	public class JavaFXExample extends Application {
		@Override
		public void start(Stage primaryStage) throws Exception {
			// 화면 구성하는 작업을 여기서 함
			Button btn = new Button();
			btn.setText("안녕 !!");
			
			// button에 이벤트 처리를 해야 함
			// Scene객체를 생성
			// Java는 delegation model을 이용함 => Web JavaScript도 이 방식을 이용
            
            // button에 Action이라는 Event를 처리할 수 있는 Listenr객체를 붙인다
            
            btn.setOnAction(new EventHandler<ActionEvent>(){
            @Override
            public void handle(AcitonEvent arg0) {
            	// event가 발생하면 자동으로 호출되는군요!
                system.out.println("안녕하세요!!");
            }
         });
            
            
            
            
			// Layout을 설정해요 (컴포넌트가 붙는 방식을 결정하는 객체)
			//  StackPane => Layout 중 추가되는 순서대로 덧붙여서 시각화하는 Layout

			StackPane root = new StackPane();
			root.getChildren().add(btn);
			
			Scene scene = new Scene(root, 300, 150);
			
			primaryStage.setTitle("연습입니다.");
			
			primaryStage.setScene(scene);
			
			primaryStage.show();
			
		}
	
	
	
	
	public static void main(String[] args) {
		launch();	//method 호출 - static . 내부적으로 static이 GUI라는 thread를 호출..
		//GUI Thread가 실행되고 화면에 창이 뜸, main 종료
		
	}
}

sample 패키지에 ExampleTest.java 생성

package sample;

public class ExampleTest{
	public static void main(String[] args){
    	// 우리프로그램을 실행시키려면
        // javac ExampleTest.java => compile
        // 결과로 bytecode인 ExamleTest.class 파일이 생성됨
        // java ExamleTest 엔터 눌러서 실행
        // java ExamleTest 10 20
        system.out.println(args[0] + "," + args);
        
    }

}

Network program

C/S(Client/Service)구조
① Server process 는 client가 접속하기를 기다리다가 접속이 들어오면 응답!
② client를 능동적으로 서버에 접속하는 process
③ server와 client가 데이터 통신을 하려면 socket객체에 양단에 존재해야 함
④ server를 client의 접속을 기다려야 하고 만약에 접속이 들어오면 연결해야 함
⑤ 데이터를 주고 받으려면 어떻게 해야 하나요?

①②③④⑤⑥

연습문제1

클라이언트가 1.서버에 접속하면 2.서버가 클라이언트에게 현재 날짜를 전송한다 -> 3.클라이언트가 화면에 출력 -> 4.서버와의 연결 통로

borderPane(5개의 영역으로 화면을 분할)
| |left |center|right|
|----|:----|:----:|----:|
||l1 | c1 | r1
|row2|l2 | c2 | r2
|row3|l3 | c3 | r3

//package exam01;
//
//import java.awt.Button;
//import java.awt.TextArea;
//import java.awt.event.ActionEvent;
//import java.beans.EventHandler;
//
//public class Exam01_DateClient extends Application {
//	
//	// filed
//	TextArea textArea;
//	Button connBtn;
//
//	@Override
//	private void start(Stage primaryStage) throws Exception {
//		// 화면구성을 해보아요
//		// 일단 레이아웃부터 하나 만들어요
//		BorderPane root = new BorderPane();
//		root.setPrefSize(700,500);
//		
//		// component 생성
//		textarea = new TextArea();
//		root.setCenter(textarea);
//		
//		connBtn = new Button("Date 서버 접속");
//		connBtn.setPrefSize(150,40);
//		connBtn.setOnAction(new EventHandler<ActionEvent>() {
//			
//		}
//		
//		@Override
//		public void handel(ActionEvent arg0) {
//			// 접속 버튼을 클릭하면 하는 일을 여기에 작성
//			// 서버와 접속하는 코드를 만들어 주면 됨
//			System.out.println("서버에 접속해요!");
//		}
//		
//		
//	});
//		
//		
//		FlowPane flowpane = new FlowPane();	// 아래쪽 영역에 붙는 layout
//		// 여백 좀 잡아서 그나마 좀 보기 좋게 만들어 보자
//		flowpane.setPadding(new Insets(10, 10, 10, 10));
//		flowpane.setColumnHalignment(HPos.CENTER);
//		flowpane.setPrefSize(700, 40);
//		flowpane.setHgap(10);
//		
//		// 버튼을 flowpane에 붙여요
//		flowpane.getChildren().add(connBtn);
//		
//		// 이렇게 만든 flowpane(판때기)를 borderlayout의 아래쪽에 붙여야 함	
//		root.setBottom
//		
//		
//	public static void main(String[] args) {
//		launch();
//		
//	}
//}//
package exam01;

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.HPos;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TextArea;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.FlowPane;
import javafx.stage.Stage;

public class Exam01_DateClient extends Application {

	//field
	TextArea textarea;
	Button connBtn;
	
	@Override
	public void start(Stage primaryStage) throws Exception {
		// 화면 구성을 해 보아요!
		// 일단 레이아웃부터 만들어보아요
		BorderPane root = new BorderPane();
		root.setPrefSize(700, 500);
		
		//component 생성
		textarea = new TextArea();
		root.setCenter(textarea);
		
		//버튼 생성
		connBtn = new Button("Date 서버 접속");
		connBtn.setPrefSize(150, 40);
		connBtn.setOnAction(new EventHandler<ActionEvent>() {
			
			@Override
			public void handle(ActionEvent arg0) {
				//접속버튼을 클릭하면 하는일을 여기에 작성
				//서버와 접속하는 코드를 만들어주면 돼요
				System.out.println("서버에 접속해요");
			}
		});
		FlowPane flowpane = new FlowPane(); //아래쪽 영역에 붙는 layout
		//여백 잡아서 보기 좋게 만들자!
		flowpane.setPadding(new Insets(10, 10, 10, 10));
		flowpane.setColumnHalignment(HPos.CENTER); 
		flowpane.setPrefSize(700, 40);			
		flowpane.setHgap(10);
		
		//버튼을 flowpane에 판떼기 붙이자
		flowpane.getChildren().add(connBtn);
		
		//이렇게 만든 flowpane은 borderlayout의 아래쪽에 붙여야 해요
		root.setBottom(flowpane);
		
		Scene scene = new Scene(root); 
		primaryStage.setScene(scene);
		primaryStage.show();
		
	}
	
	public static void main(String[] args) {
		launch();
		
	}
	
}

server socket은 클라이언트의 접속을 기다리는 역할

profile
기록의 즐거움 😆💻
post-custom-banner

0개의 댓글