안녕하세요 알통몬입니다. 공감 및 댓글은 포스팅 하는데 아주아주 큰 힘이 됩니다!! 포스팅 내용이 찾아주신 분들께 도움이 되길 바라며 더 깔끔하고 좋은 포스팅을 만들어 나가겠습니다^^
|
2017/04/12 - [자바] - 자바 TCP 채팅 서버 만들기 - 서버 클래스의 구조 및 startServer(), stopServer(),
지난 포스팅에 이어 이번에는 채팅 클라이언트를 만들어보겠습니다~
먼저 클라이언트 클래스의 구조입니다.
public class ExampleClient extends Application { Socket socket;
void startClient() { ... } void stopClient() { ... } void receive() { ... } void send(String data) { ... } // UI 생성 코드 |
1. startClient()
void startClient() { Thread thread = new Thread() { 스레드 생성합니다. @Override public void run() { try { socket = new Socket(); socket.connect(new InetSocketAddress("localhost", 5001)); Platform.runLater(()->{ displayText("[연결 완료: " + socket.getRemoteSocketAddress() + "]"); btnConn.setText("stop"); btnSend.setDisable(false); }); } catch(Exception e) { Platform.runLater(()->displayText("[서버 통신 안됨]")); if(!socket.isClosed()) { stopClient(); } return; } receive(); // 서버에서 보낸 데이터 받기기 위한 메소드입니다. } }; thread.start(); } |
2. stopClient()
void stopClient() { try { Platform.runLater(()->{ displayText("[연결 끊음]"); btnConn.setText("start"); btnSend.setDisable(true); }); if(socket!=null && !socket.isClosed()) { socket.close(); // 연결 끊음. } } catch (IOException e) {} } |
3. receive()
void receive() { while(true) { try { byte[] byteArr = new byte[100]; InputStream inputStream = socket.getInputStream();
//서버가 비정상적으로 종료했을 경우 IOException 발생합니다. int readByteCount = inputStream.read(byteArr);
//서버가 정상적으로 Socket의 close()를 호출했을 경우 if(readByteCount == -1) { throw new IOException(); }
String data = new String(byteArr, 0, readByteCount, "UTF-8");
Platform.runLater(()->displayText("[받기 완료] " + data)); } catch (Exception e) { Platform.runLater(()->displayText("[서버 통신 안됨]")); stopClient(); break; } }
} |
4. send(String msg)
void send(String data) { Thread thread = new Thread() { @Override public void run() { try { byte[] byteArr = data.getBytes("UTF-8"); OutputStream outputStream = socket.getOutputStream(); outputStream.write(byteArr); outputStream.flush(); Platform.runLater(()->displayText("[보내기 완료]")); } catch(Exception e) { Platform.runLater(()->displayText("[서버 통신 안됨]")); stopClient(); } } }; thread.start();
} |
5. UI 생성
TextArea txtDisplay; TextField txtInput; Button btnConn, btnSend;
@Override public void start(Stage primaryStage) throws Exception { BorderPane root = new BorderPane(); root.setPrefSize(500, 300);
txtDisplay = new TextArea(); txtDisplay.setEditable(false); BorderPane.setMargin(txtDisplay, new Insets(0,0,2,0)); root.setCenter(txtDisplay);
BorderPane bottom = new BorderPane(); txtInput = new TextField(); txtInput.setPrefSize(60, 30); BorderPane.setMargin(txtInput, new Insets(0,1,1,1));
btnConn = new Button("start"); btnConn.setPrefSize(60, 30); btnConn.setOnAction(e->{ if(btnConn.getText().equals("start")) { startClient(); } else if(btnConn.getText().equals("stop")){ stopClient(); } });
btnSend = new Button("send"); btnSend.setPrefSize(60, 30); btnSend.setDisable(true); btnSend.setOnAction(e->send(txtInput.getText()));
bottom.setCenter(txtInput); bottom.setLeft(btnConn); bottom.setRight(btnSend); root.setBottom(bottom);
Scene scene = new Scene(root); scene.getStylesheets().add(getClass().getResource("app.css").toString()); primaryStage.setScene(scene); primaryStage.setTitle("Client"); primaryStage.setOnCloseRequest(event->stopClient()); primaryStage.show(); }
void displayText(String text) { txtDisplay.appendText(text + "\n"); }
public static void main(String[] args) { launch(args); } |
JavaFX 코드를 통해 만든 UI는 아래 사진과 같아요
이상입니다.
다음 포스팅에서는 UDP 네트워킹에 대해 공부하겠습니다.
'자바' 카테고리의 다른 글
자바 IO 와 NIO 의 차이점과 선택 (0) | 2017.04.14 |
---|---|
자바 UDP 네트워킹 - 발신자와 수신자 (0) | 2017.04.13 |
자바 TCP 채팅 서버 만들기 - 서버 클래스의 구조 및 startServer(), stopServer(), (0) | 2017.04.12 |
자바 Socket 데이터 통신과 스레드 병렬 처리 (0) | 2017.04.11 |
자바 TCP 네트워킹, ServerSocket과 Socket / ServerSocet의 생성 및 연결 수락 (0) | 2017.04.11 |