비트 컴퓨터 [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
-
폴더 옮겨 넣어두기
-
import
Author And Source
이 문제에 관하여(비트 컴퓨터 [Java] - ⑥), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@corone_hi/비트-컴퓨터-Java-je4yoyvf저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)