본문 바로가기
Java/Java

JAVA (TCP/IP, 서버 클라이언트)

by code2772 2022. 10. 20.

[ 목차 ]

    728x90
    반응형
    2. TCP/IP 네트워킹
    
    소켓(socket)
    - 두 호스트 사이 연결
    - 어떠한 방식으로 통신을 할지도 정해주는 것
    - 원격 장비에 연결, 데이터 전송(보내기, 받기), 포트 지정, 수신 대기(서버와 클라이언트 관계(c/s), p2p)
    
    ServerSocket 클래스
    - 클라이언트의 연결 요청을 기다리면서 연결 수락을 담당하는 클래스
    (대기하다가, 일반소켓을 만들고 일반 소켓끼리 통신할 수 있도록 만들어 연결을 해주는 역할)
    -> 서버부터 실행을 해야한다.(대기상태에서)
    
    Socket 클래스
    - 연결된 클라이언트와 통신을 담당하는 클래스(사용자가 접속할 수 있는)
    
    문제. 에코서버를 만들어보자.
                 데이터
        클라이언트 -----> 서버
                 <-----
                 데이터
    
    
    문제. 구구단서버를 만들어보자.
    
        클라이언트
        단을 입력하세요 5 ----------> 5
                       <----------
                        5단을 리턴
    

    예제1

    import java.io.IOException;
    import java.net.Socket;
    
    public class Client1 {
        public static void main(String[] args) {
            System.out.println("클라이언트가 실행되었습니다.");
            Socket socket = null;
    
            try{
                System.out.println("서버와 연결을 시도중입니다");
                socket = new Socket("192.168.6.13",3579);//접속이 잘되면 소켓생성
                System.out.println("연결되었습니다");
    
            }catch (IOException e){
                e.printStackTrace();
            }finally {
                if(socket != null) try{socket.close();} catch (IOException e){}
            }
            System.out.println("프로그램이 종료되었습니다");
        }
    }
    
    import java.net.InetAddress;
    import java.net.UnknownHostException;
    
    public class Network1 {
        public static void main(String[] args) {
            try {
    //            InetAddress inetAddress = InetAddress.getByName("www.naver.com");
    //              도메인 내임을 겟 네임에 주면 아이피 어드레스를 얻을 수 있다/}
    //            System.out.println(inetAddress.getHostName());
    //              도메인을 츨력한다. www.naver.com
    //            System.out.println(inetAddress.getHostAddress());
    //              IP주소 223.130.200.107
    
                InetAddress[] inetAddress = InetAddress.getAllByName("www.naver.com");
                // 배열로 모든 도메인 네임에 있는 아이피 어드레스를 가저온다
         for(InetAddress iAdd : inetAddress){
             System.out.println(iAdd.getHostAddress());
             // 공개 IP 전부 찍힘 223.130.195.200
                              //223.130.195.95
         }
            } catch (UnknownHostException e) {//강제
                e.printStackTrace();
            }
        }
    }

    예제2

    import java.net.MalformedURLException;
    import java.net.URL;
    
    public class Network2 {
        public static void main(String[] args) {
            try {
                URL url = new URL("https://search.naver.com/search.naver?sm=tab_hty.top&where=nexearch&query=c4i&oquery=" +
                        "%EB%82%B4+ip&tqi=h09aCsprvxZssLrqXLwssssssB8-375298");
    
                System.out.println(url.getProtocol());// 프로토콜을 출력 https:와 같은것
                System.out.println(url.getHost()); // 호스트(도메인)
                System.out.println(url.getPort()); // 기본값 -1(80)
                System.out.println(url.getPath()); // https 같은것(도메인) 뒤에 나오는 리소스
                System.out.println(url.getQuery()); // 값 (응답) - 내가 보내는(검색) 값을 전달해준다.
    
            } catch (MalformedURLException e) {
                e.printStackTrace();
            }
        }
    }
    
    import java.io.BufferedWriter;
    import java.io.IOException;
    import java.io.OutputStreamWriter;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    public class Server2 {
        public static void main(String[] args) {
            System.out.println("서버가 실행되었습니다.");
    
            ServerSocket serverSocket = null;
            Socket socket = null;
    
            BufferedWriter bw = null;
    
            try{// 프로그램이 지정하는 포트번호를 알아야 한다. 동일한 포트번호가 있으면 충돌이 일어나 작동을 하지 않는다.
                serverSocket = new ServerSocket(3579);//클라이언트가 아이피 주소와 포트번호까지 써줘야 이 문장으로 들어올 수 있다.
                System.out.println("서버가 준비되었습니다.");
                socket = serverSocket.accept(); // 서버가 사용자가 들어올 때까지 대기하고 있는 장소로 들어오면 일반 소켓을 만들어지게 된다.
                System.out.println("클라이언트가 접속되었습니다.");
    
                bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
                // 소켓에서 밖으로 보넬것을 만들고 -> 밖으로 보넬 아웃풋 스트림을 통해 나갈거 만들고 -> 버퍼에다 담을거기 떄문에 만든다.
                bw.write("Server Message!!");
                bw.flush();//벌퍼를 비우면서 내보냄
            }catch (IOException e){
                e.printStackTrace();
            }finally {// 포트가 열려있으면 그 포트는 사용불가하기 때문에
                if(bw != null) try{bw.close();}catch (IOException e){}
                if(socket != null) try{socket.close();}catch (IOException e){}
                if(serverSocket != null) try{serverSocket.close();}catch (IOException e){}
            }
            System.out.println("프로그램이 종료되었습니다.");
        }
    }
    

    예제3

    import java.io.IOException;
    import java.net.MalformedURLException;
    import java.net.URL;
    import java.net.URLConnection;
    
    public class Network3 {
        public static void main(String[] args) {
            try {
                URL url = new URL("https://www.koreaisacademy.com/");
                URLConnection conn = url.openConnection();
    
                System.out.println(conn);
                //sun.net.www.protocol.https.DelegateHttpsURLConnection:https://www.koreaisacademy.com/
                // 데이터를 보여줌
                System.out.println(conn.getContent());
                //sun.net.www.protocol.http.HttpURLConnection$HttpInputStream@be35cd9
                System.out.println(conn.getDate());// 1666142580000 -> timestamp를 알 수 있다. 접속시간 확인
                System.out.println(conn.getURL());
    
            } catch (MalformedURLException e) {
                e.printStackTrace();
            }catch (IOException e){
                e.printStackTrace();
            }
        }
    }
    
    import java.io.*;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    public class Server3 {
        public static void main(String[] args) {
            System.out.println("서버가 실행되었습니다.");
    
            ServerSocket serverSocket = null;
            Socket socket = null;
    
            BufferedReader br = null;
            BufferedWriter bw = null;
    
            try{// 프로그램이 지정하는 포트번호를 알아야 한다. 동일한 포트번호가 있으면 충돌이 일어나 작동을 하지 않는다.
                serverSocket = new ServerSocket(3579);//클라이언트가 아이피 주소와 포트번호까지 써줘야 이 문장으로 들어올 수 있다.
                System.out.println("서버가 준비되었습니다.");
                socket = serverSocket.accept(); // 서버가 사용자가 들어올 때까지 대기하고 있는 장소로 들어오면 일반 소켓을 만들어지게 된다.
                System.out.println("클라이언트가 접속되었습니다.");
    
                br = new BufferedReader((new InputStreamReader(socket.getInputStream())));
                bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
                // 소켓에서 밖으로 보넬것을 만들고 -> 밖으로 보넬 아웃풋 스트림을 통해 나갈거 만들고 -> 버퍼에다 담을거기 떄문에 만든다.
    
                String msg = br.readLine();
                System.out.println("클라이언트 메시지 : " + msg);
                bw.write(msg+"\n"); // 한 번 읽고 다음줄을 읽기위해
                bw.flush();//벌퍼를 비우면서 내보냄
                System.out.println("전송디었습니다.");
                bw.write("Server Message!!");
                bw.flush();//벌퍼를 비우면서 내보냄
    
            }catch (IOException e){
                e.printStackTrace();
            }finally {// 포트가 열려있으면 그 포트는 사용불가하기 때문에
                if(br != null) try{br.close();}catch (IOException e){}
                if(bw != null) try{bw.close();}catch (IOException e){}
                if(socket != null) try{socket.close();}catch (IOException e){}
                if(serverSocket != null) try{serverSocket.close();}catch (IOException e){}
            }
            System.out.println("프로그램이 종료되었습니다.");
        }
    }
    

    예제4

     

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.net.MalformedURLException;
    import java.net.URL;
    import java.net.URLConnection;
    // buffer 이를 통해 크롤링은 가능하지만 자바로 하는것은 추천하지는 않는다. 파이썬으로 하는게 편하다 크롤링의 경우
    public class Network4 {
        public static void main(String[] args) {
            BufferedReader br =null;
    
            try {
                URL url = new URL("https://www.koreaisacademy.com/");
               // InputStream isr = new InputStreamReader(url.openStream());
                // br = new BufferedReader(isr); 이렇게 해도 괜찮지만 밑에 방식이 더 편하다.
                br = new BufferedReader(new InputStreamReader(url.openStream()));
                // 버퍼리더 임시저장
                //url.openStream() url을 열어 데이터를 가저온다. 스트림을 통해 가저와야하고 인풋스트림이 있어야한다.
                String data = null;
                while((data = br.readLine()) != null ){//읽을게 있으면
                    System.out.println(data);
                }
    
            } catch (MalformedURLException e) {
                e.printStackTrace();
            }catch (IOException e){
                e.printStackTrace();
            }finally {// 무조건 들림 파이널리는
                {
                    if(br != null){ // 버퍼가 존재한다면 없에라
                        try {
                            br.close();
                        }catch (IOException e){
                            e.printStackTrace();
                        }
                    }
                }
            }
        }
    }
    
    
    import java.io.*;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    public class Server4 {
        public static void main(String[] args) {
            System.out.println("서버가 실행되었습니다.");
    
            ServerSocket serverSocket = null;
            Socket socket = null;
    
            BufferedReader br = null;
            BufferedWriter bw = null;
    
            try{// 프로그램이 지정하는 포트번호를 알아야 한다. 동일한 포트번호가 있으면 충돌이 일어나 작동을 하지 않는다.
                serverSocket = new ServerSocket(3579);//클라이언트가 아이피 주소와 포트번호까지 써줘야 이 문장으로 들어올 수 있다.
                System.out.println("서버가 준비되었습니다.");
                socket = serverSocket.accept(); // 서버가 사용자가 들어올 때까지 대기하고 있는 장소로 들어오면 일반 소켓을 만들어지게 된다.
                System.out.println("클라이언트가 접속되었습니다.");
    
                br = new BufferedReader((new InputStreamReader(socket.getInputStream())));
                bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
                // 소켓에서 밖으로 보넬것을 만들고 -> 밖으로 보넬 아웃풋 스트림을 통해 나갈거 만들고 -> 버퍼에다 담을거기 떄문에 만든다.
    
                String dan = br.readLine();
                int intdan = Integer.parseInt(dan);
    
                        for(int i=1; i<=9; i++){
                            bw.write(intdan + "*"+i+"="+(intdan *i)+"\n");
                        }
    
                bw.flush();
                System.out.println("전송되었습니다.");
    
            }catch (IOException e){
                e.printStackTrace();
            }finally {// 포트가 열려있으면 그 포트는 사용불가하기 때문에
                if(br != null) try{br.close();}catch (IOException e){}
                if(bw != null) try{bw.close();}catch (IOException e){}
                if(socket != null) try{socket.close();}catch (IOException e){}
                if(serverSocket != null) try{serverSocket.close();}catch (IOException e){}
            }
            System.out.println("프로그램이 종료되었습니다.");
        }
    }
    
    
    반응형

    'Java > Java' 카테고리의 다른 글

    Java 음성 소켓 통신(서버, 클라이언트) 기초  (0) 2023.04.21
    JAVA 채팅 프로그램  (0) 2022.10.20
    JAVA 네트워크  (0) 2022.10.20
    자바 제네릭(Generic)  (0) 2022.10.12
    자바 스레드  (0) 2022.10.07