자바의 정석 16장 네트워킹 학습
자바에서는 IP주소를 다루기 위한 클래스로 InetAddress를 제공한다.
소켓을 이용한 통신 프로그래밍
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());
}
}
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();
}
}
}
자바의정석 11장 컬렉션 프레임워크 iterator부터 정리
Iterator, ListIterator, Enumeration 모두 컬렉션에 저장된 요소에 접근하는데 사용되는 인터페이스
Enumeration : Iterator의 구버전
ListIterator : Iterator의 기능을 향상시킨 것, 양방향으로 이동 가능 (필요하면 617p 찾아서 보기)
Iterator
컬렉션에 저장된 요소들을 읽어오는 방법을 표준화 함
일회용이라서 다 쓰고나면 다시 얻어와야한다.
iterator()는 Collecton인터페이스에 정의된 메서드
Map은 Collection 인터페이스의 자손이 아니다.
Map인터페이스를 구현한 컬렉션 클래스는 iterator()를 직접 호출할 수 없고, keySet()이나 entrySet()과 같은 메서드를 통해서 키와 값을 따로 Set 형태로 얻어온 후에 iterator()를 호출해야 한다.
Collection c = new ArrayList();
Iterator it = c.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
위와 같이 컬렉션 클래스의 요소들을 읽어올 수 있다.
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]
배열 채우기 : 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]
배열 정렬과 검색 - 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
배열의 비교와 출력 - equals(), toString()
배열을 List로 변환 - asList(Object... a) (626p)
배열을 List에 담아서 변환
asList()가 반환한 list의 크기를 변경할 수 없어서 추가와 삭제가 불가능
List list = new ArrayList(Arrays.asList(1,2,3,4,5)); 와 같이 해주면 크기를 변경할 수 있는 list가 된다.
연 저도 구현을 잘 못하겠어서, 먼저하신 다른 분들 코드 보는데만 하루종일 시간 투자했어요 ㅜㅜ
같이 화이팅 합시다🤲