반응형
To do List.
1. Client GUI Design
Chat Client 프로젝트의 Main 클래스
package application;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import javafx.application.Application;
import javafx.application.Platform;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TextArea;
import javafx.scene.control.TextField;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Priority;
import javafx.stage.Stage;
public class Main extends Application {
Socket socket;
TextArea textArea;
// 클라이언트 프로그램 동작 메소드 (어떤 IP로 , 어떤 port로 접속할지 정해줌)
public void startClient(String IP, int port) {
// 스레드 객체 생성!
Thread thread = new Thread() {
public void run() {
try {
// socket 초기화
socket = new Socket(IP, port);
receive();
} catch (Exception e) {
// 오류가 생긴다면
if (!socket.isClosed()) {
stopClient();
System.out.println("[서버 접속 실패]");
Platform.exit();
}
}
}
};
thread.start();
}
// 클라이언트 프로그램 종료 메소드
public void stopClient() {
try {
if(socket != null && !socket.isClosed()) {
socket.close();
}
}catch(Exception e){
e.printStackTrace();
}
}
// 서버로부터 메시지를 전달받는 메소드
public void receive() {
// 서버 프로그램으로부터 메시지를 계속 전달 받을 수 있도록
while (true) {
try {
// 서버로부터 메시지를 전달 받을 수 있도록
InputStream in = socket.getInputStream();
byte[] buffer = new byte[512];
int length = in.read(buffer);
if (length == -1)
throw new IOException();
String message = new String(buffer, 0, length, "UTF-8");
Platform.runLater(() -> {
// textArea는 GUI요소중 하나로 화면에 어떠한 메시지를 주고 받았는지 출력해 주는 요소.
textArea.appendText(message);
});
} catch (Exception e) {
stopClient();
break;
}
}
}
// 서버로 메시지를 전송하는 메소드
public void send(String message) {
Thread thread = new Thread() {
public void run() {
try {
OutputStream out = socket.getOutputStream();
byte[] buffer = message.getBytes("UTF-8");
out.write(buffer);
out.flush();
} catch (Exception e) {
stopClient();
}
}
};
thread.start();
}
// 실제로 프로그램을 동작시키는 메서드
@Override
public void start(Stage primaryStage) {
BorderPane root = new BorderPane();
root.setPadding(new Insets(5));
HBox hbox = new HBox();
hbox.setSpacing(5);
TextField userName = new TextField();
userName.setPrefWidth(150);
userName.setPromptText("닉네임을 입력하세요.");
HBox.setHgrow(userName, Priority.ALWAYS);
//서버에 ip주소가 들어갈 수 있도록.
TextField IPText = new TextField("127.0.0.1");
TextField portText = new TextField("9876");
portText.setPrefWidth(80);
hbox.getChildren().addAll(userName, IPText, portText);
root.setTop(hbox);
textArea = new TextArea();
textArea.setEditable(false);
root.setCenter(textArea);
TextField input = new TextField();
input.setPrefWidth(Double.MAX_VALUE);
input.setDisable(true);
input.setOnAction(event -> {
send(userName.getText() + ": " + input.getText() + "\n");
input.setText("");
input.requestFocus();
});
Button sendButton = new Button("보내기");
sendButton.setDisable(true);
sendButton.setOnAction(event ->{
send(userName.getText() + " : " + input.getText() + "\n");
input.setText("");
input.requestFocus();
});
Button connectionButton = new Button("접속하기");
connectionButton.setOnAction(event -> {
if(connectionButton.getText().equals("접속하기")) {
int port = 9876;
try {
port = Integer.parseInt(portText.getText());
}catch(Exception e) {
e.printStackTrace();
}
startClient(IPText.getText(), port);
Platform.runLater(() -> {
textArea.appendText("[채팅방접속]\n");
});
connectionButton.setText("종료하기");
input.setDisable(false);
input.requestFocus();
}else {
stopClient();
Platform.runLater(() ->{
textArea.appendText("[채팅방 퇴장]");
});
connectionButton.setText("접속하기");
input.setDisable(true);
sendButton.setDisable(true);
}
});
BorderPane pane = new BorderPane();
pane.setLeft(connectionButton);
pane.setCenter(input);
pane.setRight(sendButton);
root.setBottom(pane);
Scene scene = new Scene(root, 500, 500);
primaryStage.setTitle(" [채팅 클라이언트] ");
primaryStage.setScene(scene);
primaryStage.setOnCloseRequest(event -> stopClient());
primaryStage.show();
connectionButton.requestFocus();
}
// 프로그램의 진입점.
public static void main(String[] args) {
launch(args);
}
}
chat server 프로젝트에서 Main 을 실행하고
chat client 프로젝트에서 Main을 실행합니다.
server 에서 접속하기를 누른후
client 여러개를 실행하여 접속하기를 누릅니다.
그러면 접속이 되고 실시간으로 채팅을 주고 받을 수 있습니다.
반응형
'2020 > JAVAFX 채팅 프로그램 만들기' 카테고리의 다른 글
JavaFx 채팅프로그램 만들기 #4 (0) | 2020.03.15 |
---|---|
JavaFx 채팅프로그램 만들기 #3 (0) | 2020.03.15 |
javafx 채팅 프로그램 만들기 #2 (0) | 2020.03.15 |
JAVA FX를 이용하여 채팅프로그램 만들기 #1 (0) | 2020.03.15 |