자바

자바 Socket 채팅 클라이언트 만들기

알통몬_ 2017. 4. 13. 09:20
반응형


안녕하세요 알통몬입니다.

공감 및 댓글은 포스팅 하는데 아주아주 큰 힘이 됩니다!!

포스팅 내용이 찾아주신 분들께 도움이 되길 바라며

더 깔끔하고 좋은 포스팅을 만들어 나가겠습니다^^

 

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 네트워킹에 대해 공부하겠습니다.

반응형