본문 바로가기

Java_ 소켓

TCP & UDP

  • TCP
    • 1:1 통신방식
    • 연결지향
    • 상대방이 데이터를 잘 전달받았는지 확인하는 과정을 거침 -> 데이터 전송에 신뢰성 보장
    • 스트림 방식으로 데이터를 주고받음
    • 서버를 먼저 실행한 후 클라이언트를 실행
    • 통화에 비유할 수 있음 -> 실시간 대화 방식
  • Server
public class Server {
    public static void main(String[] args) {
        try {
            //서버 소켓 생성
            ServerSocket serverSocket = new ServerSocket(6789); //포트 번호 지정
            System.out.println("[====서버 6789포트에서 시작====]");

            while (true) {
                Socket s = serverSocket.accept();

                //수신 코드
                InputStream is = s.getInputStream();
                Scanner sc = new Scanner(is); //Scanner: 2Byte 처리
                System.out.println("[클라이언트 메세지 : " + sc.nextLine() + "]");

                //클라이언트로 응답 전송
                OutputStream os = s.getOutputStream();
                PrintStream ps = new PrintStream(os);
                ps.print("클라이언트 어서오고~\n"); //보낼 메세지
                ps.flush(); //버퍼의 데이터를 한번에 보냄

                //클라이언트 간 연결만 해제, 서버는 살아있음
                s.close();
                System.out.println("[===서버-클라이언트 연결 해제===]");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

 

  • Client
public class Client {
    public static void main(String[] args) throws Exception{
        //서버 접속
        Socket s = new Socket("localhost", 6789);
        System.out.println("[===클라이언트-서버 접속===]");

        //송신 코드
        OutputStream os = s.getOutputStream();
        PrintStream ps = new PrintStream(os);
        ps.print("서버 어서오고~\n");
        ps.flush();

        //수신 코드
        InputStream is = s.getInputStream();
        Scanner sc = new Scanner(is);
        System.out.println("[서버의 메세지 : " + sc.nextLine() + "]");

        //서버와 연결 해제
        s.close();
        System.out.println("[===서버-클라이언트 접속 해제===]");
    }
}

 

(좌) 클라이언트, (우) 서버

 

 

  • UDP
    • 1:1, 1:다, 다:다 통신방식
    • 내용만 보내는 것이 아닌 보내는 사람, 받는 사람을 명시하여 통신
    • 비연결지향
    • 데이터 전송에 신뢰성이 없음 -> 데이터를 순서대로 보낸다는 보장이 없음
    • DatagramPacket, DatagramSocket을 사용
  • Server
public class Server {
    public void start() throws IOException{
        // 6789번을 사용하는 소켓 생성
        DatagramSocket socket = new DatagramSocket(6789);
        DatagramPacket inPacket, outPacket;

        byte[] inMessage = new byte[10];
        byte[] outMessage;

        while(true) {
            //데이터 수신을 위한 패킷 생성
            inPacket = new DatagramPacket(inMessage, inMessage.length);
            socket.receive(inPacket); //패키을 통해 데이터 수신

            //수신한 패킷에서 클라이언트의 IP 주소와 Port 를 얻음
            InetAddress address = inPacket.getAddress();
            int port = inPacket.getPort();

            //서버의 현재 시간 포맷을 설정 및 반환
            SimpleDateFormat simple = new SimpleDateFormat("[hh:mm:ss]");
            String time = simple.format(new Date());
            outMessage = time.getBytes();

            //패킷 생성 후 클라이언트에게 송신
            outPacket = new DatagramPacket(outMessage, outMessage.length, address, port);
            socket.send(outPacket);
        }
    }

    public static void main(String[] args) {
        try {
            //UDP 서버 시작
            new Server().start();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

 

  • Client
public class Client {
    public void start() throws IOException, UnknownHostException {
        DatagramSocket datagramSocket = new DatagramSocket();
        InetAddress serverAddr = InetAddress.getByName("127.0.0.1");

        //데이터가 저장될 공간으로 임의로 지정한 크기의 byte 배열을 생성
        byte[] message = new byte[200];

        DatagramPacket outPacket = new DatagramPacket(message, 1, serverAddr, 6789);
        DatagramPacket inPacket = new DatagramPacket(message, message.length);

        //데이터그램패킷 송신
        datagramSocket.send(outPacket);
        //데이터그램패킷 수신
        datagramSocket.receive(inPacket);

        System.out.println("현재 시간 : " + new String(inPacket.getData()));

        datagramSocket.close();
    }

    public static void main(String[] args) {
        try {
            new Client().start();
        } catch (IOException e){
            e.printStackTrace();
        }
    }
}

 

클라이언트 실행 화면

 

 

 

GitHub - Pearlmoon997/Socket: 자바 소켓 프로그래밍

자바 소켓 프로그래밍. Contribute to Pearlmoon997/Socket development by creating an account on GitHub.

github.com

 

'Java_ 소켓' 카테고리의 다른 글

Java_ 채팅, 스레드  (0) 2022.10.20
소켓 프로그래밍_ 기초  (0) 2022.10.01
소켓 프로그래밍  (0) 2022.09.29