Java/Java

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

code2772 2022. 10. 20. 16:06
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