LAN (local area network)
WAN
ROUTER
서버란?
클라이언트란?

IP 주소는 아파트 호수라서 기기마다 구분이 가능함. 기기마다 다르고 아파트 호수 같은 것
IP 주소: 192.168.10.20
네트워크 주소 : 192.168.10 // 어디까지가 같은 구역인지 나누는 기준
호스트 주소: 20
✅ 네트워크 주소와 호스트 주소 구분 가능한 이유는?
-> 서브넷 마스크 255.255.255.0 (이진수 11111111.11111111.11111111.00000000)와 IP주소의 AND 연산 때문이다
네트워크 주소가 같다 == 같은 LAN에 속한다
같은 네트워크(같은 LAN) 안에 있는 컴퓨터들끼리는 서로 직접 통신할 수 있지만, 다른 네트워크에 있는 컴퓨터와는 라우터나 게이트웨이를 통해서 통신한다
네트워크 주소와 호스트 주소를 구분해주기 위함
IP주소와 서브넷 마스크를 AND 연산한 결과(둘다 1이면 1 아니면 0)로 네트워크 주소를 구분하기 때문이다
IP 주소: 192.168.10.20 (이진수로 11000000.10101000.00001010.00010100)
서브넷 마스크: 255.255.255.0 (이진수로 11111111.11111111.11111111.00000000)
서브넷 마스크의 앞의 3바이트는 전부 다 1이여서 IP주소 앞 3바이트가 그대로 나온다. 사실상 IP주소에서 그냥 앞에 3바이트가 네트워크 주소라고 봐도됨
🧑💻 예시 1: 서브넷 마스크가 255.255.255.0
서브넷 마스크: 255.255.255.0
네트워크 주소: 192.168.10.0
⭕ 예시:
IP 1: 192.168.10.20
IP 2: 192.168.10.50
두 IP는 같은 네트워크 (네트워크 주소는 192.168.10.0)
🧑💻 예시 2:
서브넷 마스크: 255.255.0.0
네트워크 주소: 192.168.0.0
⭕ 예시:
IP 1: 192.168.10.20
IP 2: 192.168.200.50
192.168.10.20과 192.168.200.50이 같은 네트워크(192.168.0.0 네트워크)
: 기본 게이트 웨이의 IP는 로컬 네트워크의 네트워크 주소에 속해야 하낟
로컬 네트워크의 네트워크 주소가 192.168.0이면
IP 주소 범위는 192.168.10.1부터 192.168.10.254까지 사용 가능해.
192.168.10.0은 네트워크 주소이고, 192.168.10.255는 브로드캐스트 주소이기때문에 제외
로컬 네트워크의 일부여야 패킷을 로컬 네트워크에서 외부 네트워크로 라우팅할 수 있어
port = 항구
모든 프로그램은 각각 하나의 유일한 포트번호를 가지고 있다. 선점시 가용하지 못 한다.
Transmission Control Protocol : 수신여부 확인(안정적) , 느림
1:1 통신
1️⃣ 상대방이 연결된 상태에서 데이터 주고받는다.
2️⃣ 1) 클라이언트가 연결 요청하고 2) 서버가 연결 수락하면 통신 회선이 고정 (고정된 회선)
3️⃣ 순서대로 전달
=> 안정적

ServerSocket 객체 생성
ServerSocket serverSocket = new ServerSocket();
``
1-1) 연결 요청 수락 위해서 accept() 메소드 실행
2. 클라이언트 연결 요청으로 통신용 Socket 들어옴 return
3. 서버종료 (반드시 serverSocket.close())
Socket socket = new Socket("IP", port번호);
User Datagram Protocol 수신여부 미확인(불안정적), 빠름
1:다 통신
발신자가 알방적으로 데이터 보내는 방식으로 요청 및 수락 과정이 없다
고정회선이 아니라 여러 회선을 통해 데이터 전송되기 때문에 잘못된 회선으로 인해 데이터 손실이 발생
DatagramSocket 은 수/발신점
DatagramPacket 은 주고 받는 데이터
UDP 서버는 요청 및 수락 과정이 없기때문에 클라이언트가 보낸 DatagramPacket을 항상 받을 준비를 해야 한다 => receive()
DatagramSocket socket = new DatagramSocket(9999);
DatagramPacket receivePacket = new DatagramPacket(buffer, buffer.length);
// 3. 데이터 수신 (클라이언트가 보내올 때까지 대기)
socket.receive(receivePacket);
다수의 클라이언트와 통신을 하면 먼저 연결한 클라이언트이 요청을 처리한 후 다음 클라이언트의 요청을 처리하도록 되어 잇다 == 먼저 열결한 클라이언트의 요청 처리 시간이 길어질수록 다음 클라이언트의 요청 처리 작업이 지연됨 => 스레드풀 사용

: 여러개의 스레드를 생성해 놓은 후 작업이 생기면 가져가서 사용 하고 다시 갔다놓고 사용하고...(재사용) 한정된 스레드로 많은 작업처리 가능


객체 표기
{
"student":true,
"skill":["java","c","c++"],
"name":"한겨울",
"tel":{"mobile":"010-1234-1234","home":"02-123-124"},
"id":"winter",
"age":25
}
배열 표기 []
JSONObject : 객체 표기를 생성하거나 파싱
JSONArray : JSON 배열 표기를 생성하거나 파싱
💭 JSON에서 속성 순서는 중요하지 않고 줄바꿈 처리 안됨 => 네트워크 전송량 줄여줌
public static void main(String[] args) throws IOException {
JSONObject root = new JSONObject();
root.put("id", "lazy");
root.put("name", "게으른");
root.put("age", 25);
root.put("student", true);
JSONObject tel= new JSONObject();
tel.put("home", "02-123-124");
tel.put("mobile", "010-1234-1234");
root.put("tel", tel);
JSONArray skill = new JSONArray();
skill.put("java");
skill.put("c");
skill.put("c++");
root.put("skill", skill);
/*String json = root.toString();
System.out.println(json); */
System.out.println(root);
}
//결과
{"student":true,"skill":["java","c","c++"],"name":"한겨울","tel":{"mobile":"010-1234-1234","home":"02-123-124"},"id":"winter","age":25}
BufferedReader br = new BufferedReader(
new FileReader("파일경로", Charset.forName("UTF-8"))
);
String json = br.readLine(); //줄바꿈이 없어서 한줄만 읽어오면 된다.
br.close();
JSONObject root = new JSONObject(json); //중괄호는 객체, 대괄호는 배열로 알아서 나눠 줌 DB에 알아서 저장

JSONObject root = new JSONObject(responseBody);
JSONArray items = root.getJSONArray("items");
//내코드
for(int i = 0; i < items.length(); i++) {
System.out.print("title: " + items.getJSONObject(i).getString("title") + " ");
System.out.print("link: " + items.getJSONObject(i).getString("link"));
System.out.println();
}
for(int i = 0; i < items.length(); i++) {
JSONObject item = (JSONObject)items.get(i);
System.out.print("title: " + item.getString("title") + " ");
System.out.print("link: " + item.getString("link"));
System.out.println();
}