ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java] 소켓 통신(socket)
    프로그래밍/JAVA 2022. 8. 15. 14:20
    728x90

     

     

    들어가기 앞서 관련 용어 정리

    네트워크(Network) : 컴퓨터들이 통신 기술을 이용하여 그물망처럼 연결된 통신 이용형태

    인터넷(Internet) : 컴퓨터로 연결하여 TCP/IP 프로토콜을 이용하여 정보를 주고 받는 네트워크

    IP(internet protocol) : 인터넷의 연결되어있는 모든 장치를 식별할 수 있도록 장비에게 부여되는 고유주소

    포트(Port) : 컴퓨터나 통신장비에서 다른 장치에 물리적으로 접속되는 특정한 통로

    소켓(socket) : 두 호스트 사이 연결, 어떠한 방식으로 통신을 할지 정해주는 것

    버퍼(buffer) : 입출력을 수행하는데 있어 속도차이를 극복하기 위해 사용하는 임시 저장 공간. 프로그래밍이나 운영체제에서 CPU와 보조기억장치 사이에서 사용되는 임시 저장 공간을 뜻함

     

     


     

     

    Socket 통신 일련의 절차

    1. server 측에서 port를 열고 client의 접속을 기다한다.
    2. client 측에서 server의 ip 주소와 port 번호를 통해 server 소켓에 접근한다.
    3. server 소켓은 client 가 접속을 했는지 체크하는 용도로만 사용한다.
        client         접속          server
     서버 ip, port     ----->       서버 소켓

     

     

     

    소켓 생성 방법

    서버 소켓 생성
    ServerSocket 참조변수 = new ServerSocket(포트번호);
    
    클라이언트 소켓 생성
    Socket 참조변수 = new Socket("아이피주소", 포트번호)

     

     

    client가 server로 접근하는 코드를 작성해보면,

    // server
    import java.io.IOException;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    public class Server1 {
        public static void main(String[] args) {
            int port = 9999;
            try{
                ServerSocket serverSocket = new ServerSocket(port);
                System.out.println("클라이언트를 기다리고 있습니다.");
                while(true){
                    // 새로운 클라이언트가 접속시 클라이언트 소켓을 생성
                    Socket socket = serverSocket.accept();
                    System.out.println("클라이언트가 접속했습니다.");
                    System.out.println("Client ip : " + socket.getInetAddress());
                }
            }catch (IOException e){
                e.printStackTrace();
            }
        }
    }

    먼저 server가 server소켓을 생성하여 client의 접근을 기다리게된다. while 문을 통해 client의 접근을 확인한다.

    접근 확인이 되면 Socket을 생성한다.

     

    // client
    import java.io.IOException;
    import java.net.Socket;
    
    public class Client1 {
        public static void main(String[] args) {
            try{
                Socket socket = new Socket("127.0.0.1", 9999);
                // 서버 포트번호와 일치하면 연결
                
                System.out.println("서버와 접속이 되었습니다.");
            }catch (IOException e){
                e.printStackTrace();
            }
        }
    }

    client는 server의 ip과 port 번호를 이용하여 연결이 확인되면 소켓을 생성한다. 그렇지 않다면 예외처리된다.

    // 실행결과(server)
    클라이언트를 기다리고 있습니다.
    클라이언트가 접속했습니다.
    Client ip : /127.0.0.1
    // 실행결과(client)
    서버와 접속이 되었습니다.

     

     

     


     

     

     

    client - server 간 메세지 보내기

    import java.io.*;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    public class Server2 {
        public static void main(String[] args) {
            try{
                ServerSocket serverSocket= new ServerSocket(9999); 
                System.out.println("서버 소켓 생성됨");
                Socket socket = serverSocket.accept(); 
                System.out.println("클라이언트가 접속 했습니다.");
                System.out.println("Client ip : " + socket.getInetAddress());
    
                // client로 부터 전송받은 데이터을 저장
                BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    
                while(true){
                    String data = br.readLine();  // client로 전송받은 데이터를 읽어 data에 저장
                    if(data.equals("Q") || data.equals("q")){ // 전송받은 데이터 중 Q,q 가 있을 시 프로그램 종료
                        System.out.println("프로그램 종료");
                        break;
                    }
                    System.out.println("Client 메시지 : " + data); // 클라이언트가 보낸 데이터 출력
                }
    
                br.close();
                socket.close();
            }catch (IOException e){
                e.printStackTrace();
            }
        }
    }
    import java.io.*;
    import java.net.Socket;
    
    public class Client2 {
        public static void main(String[] args) {
            try {
                Socket socket = new Socket("127.0.0.1" , 9999);
    
    			// 서버로 보내는 역할
                PrintWriter pw = new PrintWriter(new OutputStreamWriter(socket.getOutputStream())); 
    			// 키보드로 읽어들임
                BufferedReader key = new BufferedReader(new InputStreamReader(System.in)); 
                
                while(true){
                    System.out.print("메시지 입력 : ");
                    String data = key.readLine(); // 키보드로 입력 받은 값을 읽어 data에 저장
                    if(data.equals("Q")|| data.equals("q")){
                        System.out.println("채팅 종료");
                        break;
                    }
                    pw.println(data); // 서버로 data 값 보내기
                    pw.flush(); // 항상 Writer 는 flush()로 버퍼 내 데이터 비우기
                }
                pw.close();
                socket.close();
                key.close();
            }catch (IOException e){
                e.printStackTrace();
            }
        }
    }
    // 실행결과(server)
    서버 소켓 생성됨
    클라이언트가 접속 했습니다.
    Client ip : /127.0.0.1
    Client 메시지 : 안녕하세요
    Client 메시지 : 반갑습니다.
    // 실행결과(client)
    메시지 입력 : 안녕하세요
    메시지 입력 : 반갑습니다.
    메시지 입력 : q
    채팅 종료

     

     

     

     

     

    728x90

    '프로그래밍 > JAVA' 카테고리의 다른 글

    [Java] LocalDateTime  (0) 2022.08.16
    [Java] swing  (0) 2022.08.16
    [Java] 람다 표현식(lambda expression)  (0) 2022.08.15
    [Java] 스레드 동기화(Thread Synchronization)  (0) 2022.08.14
    [Java] 스레드(thread)  (0) 2022.08.14

    댓글

Designed by Tistory.