개발자 성장 일지

2022.03.23 채팅 IO

NEWDODORIPYO 2022. 3. 23. 20:19

3번 정도의 채팅 로직을 만들었고 이려 시행착오가 있었는데 오늘의 코드가 깔끔한 것 같아 정리 한번 해보려 합니다 

이번 로직은 다중채팅은 아니고 소켓통신을 응용한 1:1 채팅입니다 

 

Server

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

public class OneToOneServer {
    //bad code
    public static void main(String[] args) throws Exception {
        //서버 생성
        ServerSocket serverSocket =new ServerSocket(5555);

        //1:1채팅 이라 연결을 한번만 받는다

        System.out.println("ready.....");
        //서버 열기
        Socket client =serverSocket.accept();

        DataInputStream din = new DataInputStream(client.getInputStream());
        DataOutputStream dos = new DataOutputStream(client.getOutputStream());
        //채팅할 Scanner
        Scanner scanner =new Scanner(System.in);

        new Thread(()-> {
            while (true) {
                try {
                    //메시지 읽어오기
                    String clientMsg = din.readUTF();
                    //읽어온 메시지 화면에 보여주기
                    System.out.println(clientMsg);
                } catch (Exception e) {
                }
            }
    }).start();

        while (true){
            System.out.println("답장을 입력하세요");
            //답장 입력하기
            String myMsg = scanner.nextLine();
            // 메시지 보내주기
            dos.writeUTF(myMsg);
        }//end while
    }
}

오늘 새로배운 DataInputStream / DataOutPutStream을 사용했고 람다식을 적용한 Thread 도 사용했습니다 

새로 배운 개념들은 개념정리에서 따로 설명하겠습니다 

Client

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.Socket;
import java.util.Scanner;

public class OneToOneClient {
    //bad code
    public static void main(String[] args)  throws  Exception{

        Socket socket =new Socket("192.168.0.74" ,5555);

        DataInputStream din = new DataInputStream(socket.getInputStream());
        DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
        //채팅할 Scanner
        Scanner scanner =new Scanner(System.in);

       //Thread 사용으로 병렬실행됨
        new Thread(()-> {
            while (true) {
                try {      //읽어오기
                    String clientMsg = din.readUTF();
                    System.out.println(clientMsg);
                } catch (Exception e) {
                }
            }
        }).start();

        while (true){
            //메시지 보내기
            System.out.println("메시지를 입력하세요");
            String myMsg = scanner.nextLine();
            dos.writeUTF(myMsg);
        }//end while
    }
}

Client 부분은 Server 과 코드가 거의 동일합니다 이렇게 1:1 소켓통신이 가능한 로직이 완성되었습니다!!

 

오늘은 사실 개념 정리 부분이 중요해서 그 부분을 정리해서 찾아뵙겠습니다