비트 컴퓨터 [Java] - ⑥

ex87)


static 안의 함수는 static이어야한다!!


Swing이랑 충돌이 일어날 수 있기 때문에 import 전에 확인하기





//ex87 Q&A)
//Application >> launch(static) {start()}
//		       >> abstract start()
abstract class MyApp {
	static void launch() {
		// Hello3 h = new Hello3(); 성립은 되는데 쓸 수 없음
		// h.start();
		try {
			Class<?> cls = Class.forName("Pack01.Hello01");	
			Constructor<?> constructor = cls.getConstructor();
			Object obj = constructor.newInstance();
			Method start = cls.getMethod("start", String.class);
			System.out.println(start);
			
			// start 함수 호출
			start.invoke(obj, "호랑이");
			
		} catch (Exception e) {
			// TODO: handle exception
		}
		//start();
	}
	abstract void start(String s);
}
public class Hello01 extends MyApp {
	@Override
//	public void start(Stage arg0) throws Exception {
//		arg0.show();
//	}
	public void start(String s) {
		System.out.println(s);
	}
	public static void main(String[] args) {
		System.out.println(1);
		// static이냐? 당연히 static임
		launch(); // 내부적으로 start 호출
	}
}



ex88 - 1)



//ex88 - 1)


public class Hello01 extends Application{

	@Override
	public void start(Stage arg0) throws Exception {
		// TODO Auto-generated method stub
		
		System.out.println(2);
		arg0.show();//다이얼 로그 창 보여주는 역할
		System.out.println(3);
	}
	
	public static void main(String[] args) {
		System.out.println(1);
		launch(); //블로킹 함수
		System.out.println("Exit"); //창 종료후 실행된다. 
	}

	

}



1. Layout


VBox & HBox


  • Root: 빈 화면

  • VBox (Vertical)

    • 세로로 배치

  • HBox (Horizontal)

    • 가로로 배치



ex88 - 2) 배치


가급적이면 코드 자체같지 않은 UI가 좋다!

  • Drag & Drop 같은거

//ex88 - 2)


public class Hello01 extends Application{

	@Override
	public void start(Stage arg0) throws Exception {
		VBox root = new VBox();
		
		//크기 설정 (적용 전) - 초기화 역할
		root.setPrefSize(400, 300);
		//-------------------------
		
		//배치
		

		//실제로 보여질 클래스 안에 눈에 보이지 않는 배치를 등록
		
		//-------------------------
		
		Scene scene = new Scene(root);
		arg0.setScene(scene);
		arg0.setTitle("🐯호랑이🐯");
		//scene으로 등록된 것을 화면에 보여준다.
		arg0.show();//다이얼 로그 창 보여주는 역할
	}
	
	public static void main(String[] args) {
		System.out.println("Start");
		launch(); //블로킹 함수
		System.out.println("Exit"); //창 종료후 실행된다. 
	}

	

}

ex88 - 3) 버튼



//ex88 - 3)


public class Hello01 extends Application{

	@Override
	public void start(Stage arg0) throws Exception {
		//VBox root = new VBox(); //세로 배치
		HBox root = new HBox(); //가로 배치
		
		//크기 설정 (적용 전) - 초기화 역할
		root.setPrefSize(400, 300);
		root.setSpacing(10); //객체 사이에 공간 두기
		//-------------------------
		//배치
//		//방법 1
//		Button btn1 = new Button("버튼1");
//		root.getChildren().add(btn1);
//		Button btn2 = new Button("버튼2");
//		root.getChildren().add(btn2);
//		
		//-------------------------
		//방법 2
		
		Button btn1 = new Button("버튼1");
		Button btn2 = new Button("버튼2");
		Button btn3 = new Button("버튼3");
		root.getChildren().addAll(btn1, btn2, btn3);
		

		//실제로 보여질 클래스 안에 눈에 보이지 않는 배치를 등록
		
		//-------------------------
		
		Scene scene = new Scene(root);
		arg0.setScene(scene);
		arg0.setTitle("🐾");
		//scene으로 등록된 것을 화면에 보여준다.
		arg0.show();//다이얼 로그 창 보여주는 역할
	}
	
	public static void main(String[] args) {
		System.out.println("Start");
		launch(); //블로킹 함수
		System.out.println("Exit"); //창 종료후 실행된다. 
	}

	

}





2. Control


  • Radio Button, Scroll, Text Box ,,,

  • 속성

    • Control 하나 당 20가지 정도의 속성을 가진다.

      • 폰트 크기, 색상, 배경 색상 ....
  • 이벤트

    • Action, Message, Event ,,,

    • click, dbclick, hover, input, moving ....



ex88 - 4) 버튼 이벤트


[인터페이스 분리 원칙]

  • 인터페이스 분리 원칙은 클라이언트가 자신이 이용하지 않는 메서드에 의존하지 않아야 한다는 원칙이다.
  • 인터페이스 분리 원칙은 큰 덩어리의 인터페이스들을 구체적이고 작은 단위들로 분리시킴으로써 클라이언트들이 꼭 필요한 메서드들만 이용할 수 있게 한다. 이와 같은 작은 단위들을 역할 인터페이스라고도 부른다.



//ex88 - 4)

//interface A<T>{
//	void f1();
//	
//}
//
//class Tiger{
//	void f100(A<Integer> tt) {
//		
//	}
//}


public class Hello01 extends Application{

	@Override
	public void start(Stage arg0) throws Exception {
//		//즉시 실행 함수 (익명 객체)
//		A<Integer> t = new A<Integer>() {
//
//			@Override
//			public void f1() {
//				// TODO Auto-generated method stub
//				System.out.println("test");
//			}
//			
//		};
//		
//		Tiger tiger = new Tiger();
//		tiger.f100(t);
//		
		HBox root = new HBox();
		root.setPrefSize(400, 300);
		root.setSpacing(10); 
		//-------------------------
		Button btn1 = new Button("버튼1");
		
		btn1.setOnAction(new EventHandler<ActionEvent>() {
			
			@Override
			public void handle(ActionEvent arg0) {
				// TODO Auto-generated method stub
				System.out.println("클릭됨..!");
				
			}
		});

		Button btn2 = new Button("버튼2");
		
		btn2.setOnAction(new EventHandler<ActionEvent>() {
			
			@Override
			public void handle(ActionEvent arg0) {
				// TODO Auto-generated method stub
				System.out.println("끝..!");
				
			}
		});
		root.getChildren().addAll(btn1,btn2);
		
		
		//-------------------------
		
		Scene scene = new Scene(root);
		arg0.setScene(scene);
		arg0.setTitle("🐾");
		arg0.show();
	}
	
	public static void main(String[] args) {
		System.out.println("Start");
		launch(); //블로킹 함수
		System.out.println("Exit"); //창 종료후 실행된다. 
	}

	

}



ex88 - 5) Text


  • TextArea

  • TextField





//ex88 - 5)



public class Hello01 extends Application{

	@Override
	public void start(Stage arg0) throws Exception {

		VBox root = new VBox();
		root.setPrefSize(400, 300);
		root.setSpacing(10); 
		//-------------------------
		Button btn1 = new Button("버튼1");
		
		btn1.setOnAction(new EventHandler<ActionEvent>() {
			
			@Override
			public void handle(ActionEvent arg0) {
				// TODO Auto-generated method stub
				System.out.println("클릭");
				
			}
		});
		
		TextArea textArea = new TextArea();
		
		TextField textField = new TextField();
		textField.setOnAction(new EventHandler<ActionEvent>() {

			@Override
			public void handle(ActionEvent arg0) {
				// TODO Auto-generated method stub
				//System.out.println("앵무새"); //Enter를 칠 때 발생
				String s = textField.getText();
				textField.setText("");
				//System.out.println(s);
				textArea.appendText(s +"\n");
				
			}
			
		
		});
		root.getChildren().addAll(btn1, textField, textArea);
		
		
		//-------------------------
		
		Scene scene = new Scene(root);
		arg0.setScene(scene);
		arg0.setTitle("🐾");
		arg0.show();
	}
	
	public static void main(String[] args) {
		System.out.println("Start");
		launch(); //블로킹 함수
		System.out.println("Exit"); //창 종료후 실행된다. 
	}

	

}



ex88 - 6) 속성 제어




//ex88 - 6)

public class Hello01 extends Application{

	@Override
	public void start(Stage arg0) throws Exception {
		
		HBox root = new HBox();
		root.setPrefSize(400, 300);
		root.setSpacing(10); 
		//-------------------------
		Button btn1 = new Button("이름");
		Button btn2 = new Button("버튼");
		
		btn1.setOnAction(new EventHandler<ActionEvent>() {
			@Override
			public void handle(ActionEvent arg0) {
				btn2.setText("아현");
				
			}
		});

		
		btn2.setOnAction(new EventHandler<ActionEvent>() {
			@Override
			public void handle(ActionEvent arg0) {
				//btn1.setVisible(false); //숨기기
				//btn1.setVisible(!btn1.isVisible()); 
				
				//btn1.setDisable(true); //비활성화
				btn1.setDisable(!btn1.isDisable()); 
				
			}
		});
		root.getChildren().addAll(btn1,btn2);
		
		
		//-------------------------
		
		Scene scene = new Scene(root);
		arg0.setScene(scene);
		arg0.setTitle("🐾");
		arg0.show();
	}
	
	public static void main(String[] args) {
		System.out.println("Start");
		launch(); //블로킹 함수
		System.out.println("Exit"); //창 종료후 실행된다. 
	}

	

}



ex88 - 7) Event with Thread




//ex88 - 6)

public class Hello01 extends Application{

	@Override
	public void start(Stage arg0) throws Exception {
		
		HBox root = new HBox();
		root.setPrefSize(400, 300);
		root.setSpacing(10); 
		//-------------------------
		Button btn1 = new Button("Test");
		btn1.setOnAction(new EventHandler<ActionEvent>() {
			@Override
			public void handle(ActionEvent arg0) {
				System.out.println("Test");
//				방법1)
//				Thread t = new Thread() {};
//				t.start();
				
//				방법2)
				new Thread() {
					@Override
					public void run() {
						System.out.println("스레드 시작");
						Platform.runLater(() -> {
							btn1.setText("호랑이");
						});
						System.out.println("스레드 종료");
						
					}
				}.start();
			}
		});

		root.getChildren().addAll(btn1);
		
		//-------------------------
		
		Scene scene = new Scene(root);
		arg0.setScene(scene);
		arg0.setTitle("🐾");
		arg0.show();
	}
	
	public static void main(String[] args) {
		System.out.println("Start");
		launch(); //블로킹 함수
		System.out.println("Exit"); //창 종료후 실행된다. 
	}

	

}



ex88 - 8) 나를 너에게로 넘긴다


  • 주입 방식으로 실행을 하게 되면 인수로 객체를 전달해야해서 개수가 많아지면 비효율적이다.

    • 클래스 전체를 넘기자!!

//ex88 - 8)

class Tiger extends Thread{
	Button btn;
	public Tiger(Button btn) {
		this.btn = btn;
	}
	
	@Override
	public void run() {
		System.out.println("스레드 시작");
		System.out.println("스레드 끝");
		
		//btn1.setText("호랑이") //바깥에 있기 때문에 사용 불가 
		
		Platform.runLater(() -> {
			//주입방식으로 사용
			btn.setText("호랭이"); 
			
		});
	
		
	}
}

public class Hello01 extends Application{

	@Override
	public void start(Stage arg0) throws Exception {
		
		HBox root = new HBox();
		root.setPrefSize(400, 300);
		root.setSpacing(10); 
		//-------------------------
		Button btn1 = new Button("Test");
		btn1.setOnAction(new EventHandler<ActionEvent>() {
			@Override
			public void handle(ActionEvent arg0) {
				Tiger t = new Tiger(btn1);
				t.start();
				
			}
		});

		root.getChildren().addAll(btn1);
		
		//-------------------------
		
		Scene scene = new Scene(root);
		arg0.setScene(scene);
		arg0.setTitle("🐾");
		arg0.show();
	}
	
	public static void main(String[] args) {
		System.out.println("Start");
		launch(); //블로킹 함수
		System.out.println("Exit"); //창 종료후 실행된다. 
	}

	

}





//ex88 - 8)

class Tiger extends Thread{
	Hello01 Hello;
	public Tiger(Hello01 Hello) {
		this.Hello = Hello;
	}
	
	@Override
	public void run() {
		System.out.println("스레드 시작");
		System.out.println("스레드 끝");
		
		//btn1.setText("호랑이") //바깥에 있기 때문에 사용 불가 
		
		Platform.runLater(() -> {
			//주입방식으로 사용
			Hello.btn1.setText("호랭이"); 
			Hello.btn2.setText("사자"); 
		});
	
		
	}
}

public class Hello01 extends Application{
	
	//멤버변수
	Button btn1 = new Button("Test"); 
	Button btn2 = new Button("Test"); 
	@Override
	public void start(Stage stage) throws Exception {
		
		HBox root = new HBox();
		root.setPrefSize(400, 300);
		root.setSpacing(10); 
		//-------------------------
		
		btn1.setOnAction(new EventHandler<ActionEvent>() {
			@Override
			public void handle(ActionEvent arg0) {
				Tiger t = new Tiger(Hello01.this); //전체 던지기
				t.start();
				
			}
		});
		
		btn2.setOnAction(new EventHandler<ActionEvent>() {
			@Override
			public void handle(ActionEvent arg0) {
				Tiger t = new Tiger(Hello01.this); //전체 던지기
				t.start();
				
			}
		});

		root.getChildren().addAll(btn1, btn2);
		
		//-------------------------
		
		Scene scene = new Scene(root);
		stage.setScene(scene);
		stage.setTitle("🐾");
		stage.show();
	}
	
	public static void main(String[] args) {
		System.out.println("Start");
		launch(); //블로킹 함수
		System.out.println("Exit"); //창 종료후 실행된다. 
	}

}



ex89) Console 여러개 고정하기




//ex89))


public class Hello01 {

	public static void main(String[] args) {
		System.out.println("여기는 헬로우");
		Scanner sc = new Scanner(System.in);
		sc.nextInt();
		System.out.println("헬로우 종료");
	}

}



package Pack01;

import java.util.Scanner;

public class World {
	
	public static void main(String[] args) {
		System.out.println("여기는 월드");
		Scanner sc = new Scanner(System.in);
		sc.nextInt();
		System.out.println("월드 종료");

	}

}




3. 네트워크

참고

ip 확인하기: ipconfig


  • 클라이언트와 서버 모두 Socket이 있어야 한다.

  • Socket

    • 통신만 전문적으로 해주는 객체

    • TCP/IP로 통신을 행하는 컴퓨터가 가지는 네트워크 내에서의 주소에 해당하는 IP어드레스와, IP어드레스의 서브(보조)어드레스인 포트 번호를 조합한 네트워크 어드레스를 말한다

    • 소켓(Socket)이란 네트워크상에서 서버와 클라이언트 두개의 프로그램이 특정 포트를 통해 양방향 통신이 가능하도록 만들어주는 소프트웨어 장치라 말할수 있다.

  • 접속을 위한 클라이언트, 서버의 소켓 번호 / 통신을 위한 소켓 번호 총 3개


  • 통신이 시작되면 새로운 통신 Socket이 생성된다.

    • 이 번호는 서로 중복되지 않는다.

    • 소켓의 소유주는 서버이다.

  • 서버는 LinkedList로 소켓 번호를 관리한다.

    • 접속된 사용자에게 데이터를 반환한다.

    • 누군가에게 줄지는 선택의 문제



채팅 프로그램 만들기 ①


  • 바인딩

    • 정보를 기억해두는 것
  • 서버는 클라이언트에서 들어오는 주소에 대한 바인딩이 필요하다.



Server


package Pack;

import java.net.*;
import java.util.*;

public class Server {

	public static void main(String[] args) {
		System.out.println("Server Start");
		try {
			ServerSocket ss = new ServerSocket();
//			if(ss == null) { //방어용
//				System.out.println("소켓을 생성할 수 없습니다.");
//				exit(0)	
//			}
			System.out.println("메인서버 소켓 생성");
//			ss.bind("ip주소" ,포트 번호);
//			ss.bind(new InetSocketAddress("192.168.0.22",5001));
			ss.bind(new InetSocketAddress("localhost",5001));
			System.out.println("바인딩 완료");
			ss.accept(); //블로킹 함수
			System.out.println("접속 시도");
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		System.out.println("숫자를 입력하면 서버를 종료합니다.");
		new Scanner(System.in).nextInt();
		System.out.println("Server End");
	}

}



Client


package Pack;

import java.net.InetSocketAddress;
import java.net.Socket;
import java.util.Scanner;

public class Client {

	public static void main(String[] args) {
		System.out.println("Client Start");
		
		Socket cs = new Socket();
		try {
			System.out.println("숫자를 입력하면 접속을 시도합니다.");
			new Scanner(System.in).nextInt();
			cs.connect(new InetSocketAddress("localhost",5001));
		} catch (Exception e) {
			// TODO: handle exception
		}
		
		System.out.println("숫자를 입력하면 클라이언트를 종료합니다.");
		new Scanner(System.in).nextInt();
		System.out.println("Client End");
	}

}



채팅 프로그램 만들기 ②


Server


  • accept()에서 블록킹이 잡혀 프로그램이 죽어버리기 때문에 Thread를 사용해서 종료시켜 주어야한다.


package Pack;

import java.net.*;
import java.util.*;

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.*;
import javafx.scene.control.Button;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class Server extends Application {
	
	@Override
	public void start(Stage stage) throws Exception {
		// TODO Auto-generated method stub
		VBox root = new VBox();
		root.setPrefSize(400, 300);
		root.setSpacing(10); 
	
		//-------------------
		
		Button btn1 = new Button("서버 오픈");
		btn1.setOnAction(new EventHandler<ActionEvent>() {
			
			@Override
			public void handle(ActionEvent arg0) {

				new Thread() {
					@Override
					public void run() {
						try {
							ServerSocket ss = new ServerSocket();
							System.out.println("메인서버 소켓 생성");
							ss.bind(new InetSocketAddress("localhost",5001));
							System.out.println("바인딩 완료");
							ss.accept(); //블로킹 함수 - UI는 무한 반복으로 인식
							System.out.println("접속 시도");
						} catch (Exception e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}

					}
				}.start();
				
				
				
			}
		});
		
		root.getChildren().add(btn1);
		
		//-------------------
		Scene scene = new Scene(root);
		stage.setScene(scene);
		stage.setTitle("Server");
		stage.show();
	}
	
	

	public static void main(String[] args) {
		launch();
	}



}



Client


package Pack;

import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class Client extends Application{

	@Override
	public void start(Stage stage) throws Exception {
		// TODO Auto-generated method stub
		VBox root = new VBox();
		root.setPrefSize(400, 300);
		root.setSpacing(10); 
	
		//-------------------
		
		Button btn1 = new Button("접속 버튼");
		btn1.setOnAction(new EventHandler<ActionEvent>() {
			
			@Override
			public void handle(ActionEvent arg0) {

				new Thread() {
					@Override
					public void run() {
						Socket cs = new Socket();
						try {
							cs.connect(new InetSocketAddress("localhost",5001));
						} catch (Exception e) {
							e.printStackTrace();
						}

					}
				}.start();
				
				
				
			}
		});
		
		root.getChildren().add(btn1);
		
		//-------------------
		Scene scene = new Scene(root);
		stage.setScene(scene);
		stage.setTitle("Client");
		stage.show();
	}
	
	public static void main(String[] args) {
		
		launch();

	}

	

}







채팅 프로그램 만들기 ③

데이터는 무조건 byte 단위이다!!!!


Server



package Pack;

import java.io.IOException;
import java.io.InputStream;
import java.net.*;
import java.util.*;

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.*;
import javafx.scene.control.Button;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class Server extends Application {
	
	@Override
	public void start(Stage stage) throws Exception {
		// TODO Auto-generated method stub
		VBox root = new VBox();
		root.setPrefSize(400, 300);
		root.setSpacing(10); 
	
		//-------------------
		
		Button btn1 = new Button("서버 오픈");
		btn1.setOnAction(new EventHandler<ActionEvent>() {
			
			@Override
			public void handle(ActionEvent arg0) {

				new Thread() {
					@Override
					public void run() {
						try {
							ServerSocket ss = new ServerSocket();
							System.out.println("메인서버 소켓 생성");
							ss.bind(new InetSocketAddress("localhost",5001));
							System.out.println("바인딩 완료");
							//ss.accept(); //블로킹 함수 - UI는 무한 반복으로 인식
							Socket socket = ss.accept();
							System.out.println("접속 시도");
							
							new Thread() {
								public void run() {
									
									try {
										InputStream is = socket.getInputStream();
										byte[] recvData = new byte[512];
										//블로킹 함수 - 여기서 진행 X
										int size = is.read(recvData);
										String s = new String(recvData, 0, size);
										System.out.println(s);
									} catch (IOException e) {
										// TODO Auto-generated catch block
										e.printStackTrace();
									}
									
								};
							}.start();
							
						} catch (Exception e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}

					}
				}.start();
				
				
				
			}
		});
		
		root.getChildren().add(btn1);
		
		//-------------------
		Scene scene = new Scene(root);
		stage.setScene(scene);
		stage.setTitle("Server");
		stage.show();
	}
	
	

	public static void main(String[] args) {
		launch();
	}



}



Client





package Pack;

import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class Client extends Application{
	Socket cs; //모든 메소드에서 사용 가능
	@Override
	public void start(Stage stage) throws Exception {
		// TODO Auto-generated method stub
		VBox root = new VBox();
		root.setPrefSize(400, 300);
		root.setSpacing(10); 
	
		//-------------------
		
		Button btn1 = new Button("접속 버튼");
		btn1.setOnAction(new EventHandler<ActionEvent>() {
			
			@Override
			public void handle(ActionEvent arg0) {

				cs = new Socket();
				try {
					cs.connect(new InetSocketAddress("localhost",5001));
				} catch (Exception e) {
					e.printStackTrace();
				}

				
				
			}
		});
		
		Button btn2 = new Button("데이터 전송");
		btn2.setOnAction(new EventHandler<ActionEvent>() {
			
			@Override
			public void handle(ActionEvent arg0) {
				try {
					OutputStream os = cs.getOutputStream();
					String s = "apple";
					byte[] data = s.getBytes(); //생략된 건 보류
					os.write(data);
					System.out.println("데이터 보냄");
					
				} catch (Exception e) { e.printStackTrace(); }
							
				
			}
		
		});
		root.getChildren().addAll(btn1, btn2);
		
		//-------------------
		Scene scene = new Scene(root);
		stage.setScene(scene);
		stage.setTitle("Client");
		stage.show();
	}
	
	public static void main(String[] args) {
		
		launch();

	}

	

}





채팅 프로그램 만들기 ④


Server


package Pack;

import java.io.IOException;
import java.io.InputStream;
import java.net.*;
import java.util.*;

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.*;
import javafx.scene.control.Button;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

class ClientThread extends Thread{
	Socket socket;
	public ClientThread(Socket socket) {
		this.socket = socket;
	}
	
	@Override
	public void run() {
	try {
		InputStream is = socket.getInputStream();
		byte[] recvData = new byte[512];
		//블로킹 함수 - 여기서 진행 X
		//계속 읽겠다
		while(true) {
			int size = is.read(recvData);
			
			if(size == -1) { //클라이언트 접속이 끊김
				System.out.println("클라이언트 종료");
				break;
			}
			String s = new String(recvData, 0, size);
			System.out.println(s);
		}
		
	} catch (Exception e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	}
}

class ConnectThread extends Thread{
	@Override
	public void run() {
		try {
			ServerSocket ss = new ServerSocket();
			System.out.println("메인서버 소켓 생성");
			ss.bind(new InetSocketAddress("localhost",5001));
			System.out.println("바인딩 완료");
			//ss.accept(); //블로킹 함수 - UI는 무한 반복으로 인식
			Socket socket = ss.accept();
			System.out.println("접속 시도");
			
			ClientThread ct = new ClientThread(socket);
			ct.start();
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}
}

public class Server extends Application {
	
	@Override
	public void start(Stage stage) throws Exception {
		// TODO Auto-generated method stub
		VBox root = new VBox();
		root.setPrefSize(400, 300);
		root.setSpacing(10); 
	
		//-------------------
		
		Button btn1 = new Button("서버 오픈");
		btn1.setOnAction(new EventHandler<ActionEvent>() {
			
			@Override
			public void handle(ActionEvent arg0) {

				ConnectThread ct = new ConnectThread();
				ct.start();
			}
		});
		
		root.getChildren().add(btn1);
		
		//-------------------
		Scene scene = new Scene(root);
		stage.setScene(scene);
		stage.setTitle("Server");
		stage.show();
	}
	
	

	public static void main(String[] args) {
		launch();
	}



}



Client



package Pack;

import java.io.IOException;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class Client extends Application{
	Socket cs; //모든 메소드에서 사용 가능
	@Override
	public void start(Stage stage) throws Exception {
		// TODO Auto-generated method stub
		VBox root = new VBox();
		root.setPrefSize(400, 300);
		root.setSpacing(10); 
	
		//-------------------
		
		Button btn1 = new Button("접속 버튼");
		btn1.setOnAction(new EventHandler<ActionEvent>() {
			
			@Override
			public void handle(ActionEvent arg0) {

				cs = new Socket();
				try {
					cs.connect(new InetSocketAddress("localhost",5001));
				} catch (Exception e) {
					e.printStackTrace();
				}

				
				
			}
		});
		
		Button btn2 = new Button("데이터 전송");
		btn2.setOnAction(new EventHandler<ActionEvent>() {
			int count = 0;
			
			@Override
			public void handle(ActionEvent arg0) {
				try {
					OutputStream os = cs.getOutputStream();
					String s = "apple" + count++;
					byte[] data = s.getBytes(); //생략된 건 보류
					os.write(data);
					System.out.println("데이터 보냄");
					
				} catch (Exception e) { e.printStackTrace(); }
							
				
			}
		
		});
		
		
		Button btn3 = new Button("접속 종료");
		btn3.setOnAction(new EventHandler<ActionEvent>() {
		
			@Override public void handle(ActionEvent arg0) { 
	 		try { cs.close(); } catch (Exception e) {e.printStackTrace(); }   }
		
		});
		
		root.getChildren().addAll(btn1, btn2, btn3);
		
		//-------------------
		Scene scene = new Scene(root);
		stage.setScene(scene);
		stage.setTitle("Client");
		stage.show();
	}
	
	public static void main(String[] args) {
		
		launch();

	}

	

}





실행해보기



eclipse import


  1. 폴더 옮겨 넣어두기

  2. import

좋은 웹페이지 즐겨찾기