[TIL] 2월 2일

yeon·2021년 2월 2일
0
post-custom-banner

자바의 정석 16장 네트워킹 학습

InetAddress(949p)

자바에서는 IP주소를 다루기 위한 클래스로 InetAddress를 제공한다.

소켓 프로그래밍

소켓을 이용한 통신 프로그래밍

  • 소켓(socket) : 프로세스간의 통신에 사용되는 양쪽 끝단(endpoint)
  • 자바에서 java.net 패키지를 통해 소켓 프로그래밍 지원, 소켓통신에 사용되는 프로토콜에 따라 다른 종류으 소켓을 구현하여 제공

TCP 소켓 프로그래밍(960p)

TCP/IP 프로토콜은 통신을 위한 표준 프로토콜로 프로토콜의 집합이다.

클라이언트와 서버간의 일대일 통신

  • 입출력 스트림 : 소켓들이 데이터를 주고받는 연결통로

  • 소켓은 두개의 스트림(입력스트림, 출력스트림)을 갖고 있다.

    • 이 스트림들은 연결된 상대편 소켓의 스트림들과 교차연결된다.
    • 이 두 스트림을 통해 프로세스간의 통신(입출력)이 이루어진다.
  • 서버소켓(ServerSocket) : 포트와 연결되어 외부의 연결요청을 기다리다가, 연결 요청이 들어오면,

    Socket을 생성해서 소켓과 소켓간의 통신이 이루어지도록 한다.

    • 한 포트에 하나의 서버소켓만 연결할 수 있다. (프로토콜이 다르면 같은 포트를 공유할 수 있다.)
  • TCPIP 서버 그리고 TCPIP서버와 통신하기 위한 클라이언트 프로그램 예제

public class TcpIpServer {
    public static void main(String[] args) {
        ServerSocket serverSocket = null;

        try {
            serverSocket = new ServerSocket(7777);
            System.out.println(getTime() + "서버가 준비되었습니다.");
        } catch (IOException e) {
            e.printStackTrace();
        }
        while (true){
            System.out.println(getTime() + "연결요청을 기다립니다.");
            // 서버소켓은 클라이언트의 연결요청이 올 때까지 실행을 멈추고 기다린다.
            // 클라이언트의 연결요청이 오면 클라이언트 소켓과 통실할 새로운 소켓을 생성한다.
            try {
                // serverSocket이 accept 하면 새로운 socket을 반환
                Socket socket = serverSocket.accept();
                System.out.println(getTime()+socket.getInetAddress() + "로부터 연결요청이 들어왔습니다.");

                // 소켓의 출력 스트림을 얻는다.
                OutputStream out = socket.getOutputStream();
                DataOutputStream dos = new DataOutputStream(out);

                // 원격 소켓에 데이터를 보낸다.
                dos.writeUTF("[Notice] Test Message1 from Server.");
                System.out.println(getTime()+"데이터를 전송했습니다.");

                dos.close();
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
    }

    private static String getTime() {
        SimpleDateFormat f = new SimpleDateFormat("[hh:mm:ss]");
        return f.format(new Date());

    }
}
  • 간단한 TCP/IP 서버를 구현한 것
  • serverSocket이 7777번 포트에서 클라이언트의 연결요청을 기다린다.
  • 아래의 TcpIpClient를 실행하면 클라이언트의 소켓을 생성하여 서버에 연결을 요청한다.
  • 서버소켓을 새로운 소켓을 생성해서 클라이언트의 소켓과 연결한다.
    • getInetAdress() : 소켓과 연결된 클라이언트의 IP주소를 리턴한다.
  • 새로 생성된 소켓은 "[Notice] Test Message1 from Server." 라는 데이터를 클라이언트의 소켓에 전송하고 연결을 종료한다.
  • 다시 서버소켓은 클라이언트의 요청을 기다린다.
public class TcpIpClient {
    public static void main(String[] args) {
        try {
            String serverIp = "127.0.0.1";

            System.out.println("서버에 연결중입니다. 서버IP : " + serverIp);
            // 소켓을 생성하여 연결을 요청한다.
            Socket socket = new Socket(serverIp, 7777);

            InputStream in = socket.getInputStream();
            DataInputStream dis = new DataInputStream(in);

            // 소켓으로부터 받은 데이터를 출력한다.
            System.out.println("서버로부터 받은 메시지 : " + dis.readUTF());
            System.out.println("연결을 종료합니다.");

            dis.close();
            socket.close();
            System.out.println("연결이 종료되었습니다.");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
  • 위에 구현된 TcpIpServer와 통신하기 위한 클라이언트 프로그램
  • 연결하고자하는 서버 IP와 포트번호를 가지고 소켓을 생성한다.
    • 소켓을 생성하면 자동적으로 서버에 연결요청을 한다.

자바의정석 11장 컬렉션 프레임워크 iterator부터 정리

Iterator, ListIterator, Enumeration(614p)

Iterator, ListIterator, Enumeration 모두 컬렉션에 저장된 요소에 접근하는데 사용되는 인터페이스

Enumeration : Iterator의 구버전

ListIterator : Iterator의 기능을 향상시킨 것, 양방향으로 이동 가능 (필요하면 617p 찾아서 보기)

Iterator

  • 컬렉션에 저장된 요소들을 읽어오는 방법을 표준화 함

  • 일회용이라서 다 쓰고나면 다시 얻어와야한다.

  • iterator()는 Collecton인터페이스에 정의된 메서드

    • List와 Set에도 포함
    • iterator()가 각 컬렉션의 특징에 맞게 구현되어 있음
  • Map은 Collection 인터페이스의 자손이 아니다.

    Map인터페이스를 구현한 컬렉션 클래스는 iterator()를 직접 호출할 수 없고, keySet()이나 entrySet()과 같은 메서드를 통해서 키와 값을 따로 Set 형태로 얻어온 후에 iterator()를 호출해야 한다.

Collection c = new ArrayList();
Iterator it = c.iterator();

while(it.hasNext()){
		System.out.println(it.next());
}

위와 같이 컬렉션 클래스의 요소들을 읽어올 수 있다.

Arrays

Arryas클래스에 정의된 메서드는 모두 static 메서드이다.

  • 배열의 복사 : copyOf(), copyRange()

    int[] arr = {0, 1, 2, 3, 4};
    
    // copyOf(int[] original, int newLength) 두번째 인자로 길이를 지정해줘야함
    int[] arr2 = Arrays.copyOf(arr, arr.length);
    int[] arr3 = Arrays.copyOf(arr, 3);
    
    // copyOfRange(int[] original, int from, int to) from과 to 범위를 지정해줘야함
    int[] arr4 = Arrays.copyOfRange(arr, 2, 4);
    int[] arr5 = Arrays.copyOfRange(arr, 2, 7);
    
    System.out.println(Arrays.toString(arr));
    System.out.println(Arrays.toString(arr2));
    System.out.println(Arrays.toString(arr3));
    System.out.println(Arrays.toString(arr4));
    System.out.println(Arrays.toString(arr5));
    
    </> 실행 결과
    [0, 1, 2, 3, 4]
    [0, 1, 2, 3, 4]
    [0, 1, 2]
    [2, 3]
    [2, 3, 4, 0, 0]
    • copyOf(int[] original, int newLength) : 두번째 인자로 길이를 지정해줘야함
    • copyOfRange(int[] original, int from, int to) : from과 to 범위를 지정해줘야함
  • 배열 채우기 : fill(), setAll()

    int[] arr = new int[5];
    Arrays.fill(arr, 9);
    System.out.println(Arrays.toString(arr));
    
    Arrays.setAll(arr, i -> (int) (Math.random() * 5 + 1));
    System.out.println(Arrays.toString(arr));
    
    </> 실행 결과
    [9, 9, 9, 9, 9]
    [3, 5, 4, 3, 4]
    • fill(int[] a, int val) : 모든 요소를 val로 채운다.
    • setAll(int[] array, intUnaryOperator generator) : 람다식을 이용해서 요소를 채운다.
  • 배열 정렬과 검색 - sort(), binarySearch()

    int[] arr = {3, 2, 0, 1, 4};
    Arrays.sort(arr);
    System.out.println(Arrays.toString(arr));
    
    int idx = Arrays.binarySearch(arr, 2);
    System.out.println(idx);
    
    </> 실행 결과
    [0, 1, 2, 3, 4]
    2
    • sort() : 배열 정렬
    • binarySearch(int[] arr, int key) : key의 값이 저장된 위치(index) 반환
      • 이진탐색, 정렬된 배열에만 가능
  • 배열의 비교와 출력 - equals(), toString()

    • deepToString, deepEquals() : 다차원 배열의 출력과 비교 가능
  • 배열을 List로 변환 - asList(Object... a) (626p)

    • 배열을 List에 담아서 변환

    • asList()가 반환한 list의 크기를 변경할 수 없어서 추가와 삭제가 불가능

      List list = new ArrayList(Arrays.asList(1,2,3,4,5)); 와 같이 해주면 크기를 변경할 수 있는 list가 된다.


Todo

  • 인프런 HTTP 수강하고 정리하기
  • 스트림, io 학습
  • 내일
    • 이코테
    • 자바의 정석 Comparator와 Comparable 학습한 거 정리

Reminder

  • java API문서 보는 습관 들이기
post-custom-banner

2개의 댓글

comment-user-thumbnail
2021년 2월 2일

연 저도 구현을 잘 못하겠어서, 먼저하신 다른 분들 코드 보는데만 하루종일 시간 투자했어요 ㅜㅜ
같이 화이팅 합시다🤲

1개의 답글