장르: 애초에 역경을 딛고 이룩하는 숭고한 사랑이란 없다. 그 역경 자체가 사랑이다.
프로그램 특징: 그 곳에서 살아남는 사랑이 어떤 모습으로 걸어오는지 기다려 보고 싶다.
-
TCP/IP 와 UDP0514분*이것이 자바다(3판)을 보고 작성한 글입니다.IP: Internet ProtocolIP 주소는 네트워크 어댑터(LAN 카드)마다 할당된다.DNS(Domain Name System)Web browser 웹 명령어 ipconfig / ifconfig웹브라우저가 DNS를 거쳐 웹서버에서 웹 페이지를 받게 되는 과정?웹 브라우저는 웹 서버와 통신하는 클라이언트로, 사용자가 입력한 도메인 이름으로 DNS에서 IP를 검색해 찾은 다음, 웹 서버와 연결해 웹 페이지를 받는다.Port 번호운영체제가 관리하는 서버 프로그램의 연결 번호포트번호가 필요한 이유는?배경: 하나의 IP 주소를 갖는 컴퓨터에서 다양한 서버 프로그램(FTP서버, DBMS, 웹 서버 등)이 실행될 수 있다. 서버는 시작할 때 특정 포트 번호에 바인..
-
이것이 자바다(3판) 9장 익명객체 풀다가 new와 final을 이해하기 위해 JVM 메모리 동작 공부0425분7. 다음 Chatting 클래스는 컴파일 에러가 발생합니다. 원인을 설명해보세요.public class Chatting { class Chat { void start() {} void sendMessage(String message) {} } void startChat(String chatId) { String nickName = null; nickName = chatId; Chat chat = new Chat() { @Override public void start() { while(true) { String inputData = "안..
-
[JAVA] 이것이 자바다(3판) 7장 상속 확인문제 답안0423분6. Parent 클래스를 상속해서 Child 클래스를 다음과 같이 작성했는데, Child 생성자에서 컴파일 에러가 발생했습니다. 그 이유와 해결 방법을 설명해보세요.public class Parent { public String name; // 매개변수가 있는 생성자 public Parent(String name) { this.name = name; }}public class Child extends Parent { public int studentNo; public Child(String name, int studentNo) { this.name = name; this.studentNo = studentNo; }..
-
[JAVA] 객체지향의 꽃: 클래스0417분OOP 프로그래밍이 뭘까요?Object-Oriented Programming 에서 Object는 데이터(필드)와 메소드를 하나로 묶어서 사용하겠다는 개념입니다.Encapsulation → 정보 보안Inheritance → 유지보수 용이Polymorphism → 클래스 형변환: 실무에서 많이 사용 클래스 기본 구조 field, method, Constructor필드와 메소드는 선택적으로 가질 수 있다. public class Car { String company = "현대자동차"; String model; String color; int maxSpeed; // 생성자 선언하지 않으면 자동 선언된다. // 선언한 경우에는 필요한 경우에 대한 선언자를 만들어줘야 한다. Car(..
-
[JAVA] 이것이 자바다(3판) 6장 20번 답안0417분20. 키보드로부터 계좌 정보를 입력받아 계좌를 관리하는 프로그램입니다. 계좌는 Account 객체로 생성되고 BankApplication에서 길이 100 Account[] 배열로 관리됩니다. Account.classpackage ThisisJAVA.ch06.bank;public class Account { static final int MIN_BALANCE = 0; static final int MAX_BALANCE = 1000000; String accountNum; String accountOwner; int balance, withdraw, deposit; Account(String accountNum, String accountOwner, int deposit) ..
-
[JAVA] 참조형 : 배열 초기화, 복사0416분Data TypePrimitive TypeReference Type정수 실수논리ArrayEnumClassInterfacebytecharshortintlongfloatdoubleboolean 참조형에서 가장 많이 사용되는 배열을 보자. 배열은 마지막 인덱스에 length를 가진다. 배열은 크기가 정해지면 변경할 수 없다. 배열명(배열 변수:scores)는 stack에 저장되어 heap 영역에 생성된 배열을 참조하는 방식으로 이용한다. 배열 변수(scores)는 힙 영역의 배열 주소를 저장한다. 따라서 인덱스로 접근할 수 있다.배열 내부는 같은 type 값으로 관리하나, 해당 배열이 가리키는 주소의 객체 타입은 다를 수 있다. 배열 초기화// 정적 초기화String season = {"Spring", ..
-
[JAVA] 이것이 자바다(3판) 5장 9번 답안0415분9. 키보드로 학생 수와 각 학생들의 점수를 입력받고 최고 점수 및 평균 점수를 출력하는 코드를 작성해보세요.package ch05.referenceType;import java.util.Scanner;public class Chap5 { public static void main(String[] args) { boolean run = true; Scanner sc = new Scanner(System.in); int studentNum = 0; Integer[] scoreList = null; int max = 0; int total = 0; while (run) { System.out.pr..
-
[JAVA] JVM 런타임 영역 동작0415분OS는 실행 중인 프로그램을 프로세스 단위로 관리한다. 자바 프로그램을 시작하면 JVM 프로세스가 생성된다. 이 프로세스가 main() 메소드를 호출한다. JVM은 운영체제에서 할당 받은 메모리 영역을 메소드 영역, 힙 영역, 스택 영역으로 구분해서 사용한다.메소드 영역: 바이트코드 파일을 읽은 내용이 저장되는 영역스택 영역: 메소드를 호출할 때마다 생성되는 프레임이 저장되는 영역힙 영역: 객체가 생성되는 영역. 객체 주소는 메소드 영역과 스택 영역의 상수와 변수에서 참조한다. JVM → 클래스 로드 → main() 찾아 실행근데 main()은 아직 객체가 없기 때문에 클래스 이름만으로 호출하기 위해 메소드 영역(static)에 올라가서 클래스 로딩 시 바로 준비된다. public static void..
-
HTTP Protocol 기초0319분*Node.js 프로그래밍 입문(고경희)를 읽고 작성한 글입니다. 클라이언트는 서버로 자료를 요청하고, 서버는 클라이언트로 자료를 전송하는 방식으로 웹이 동작한다. HTTP requestHTTP response 근데 서로 사용하는 프로그래밍 언어도 다르고 동작 방식도 다르기 때문에 통일된 규칙, HTTP protocol을 사용해 자료를 주고 받는다. 1. HTTP request클라이언트가 서버로 무엇인가 요청할 때는 웹 브라우저에 URL을 입력해서 요청한다. 2. IP address & Port우리는 문자로 입력하지만 사실 인터넷에서 서버에 접속하기 위해선 IP주소: 포트번호(211.47.28.14:443)가 필요하다. 수많은 클라우드 컴퓨터와 서버 컴퓨터에게 각각 고유한 주소가 있기엔 숫자가 부족하..
*이것이 자바다(3판)을 보고 작성한 글입니다.
IP: Internet Protocol
IP 주소는 네트워크 어댑터(LAN 카드)마다 할당된다.
- DNS(Domain Name System)
- Web browser 웹
- 명령어 ipconfig / ifconfig
웹브라우저가 DNS를 거쳐 웹서버에서 웹 페이지를 받게 되는 과정?
- 웹 브라우저는 웹 서버와 통신하는 클라이언트로, 사용자가 입력한 도메인 이름으로 DNS에서 IP를 검색해 찾은 다음, 웹 서버와 연결해 웹 페이지를 받는다.
Port 번호
운영체제가 관리하는 서버 프로그램의 연결 번호
포트번호가 필요한 이유는?
- 배경: 하나의 IP 주소를 갖는 컴퓨터에서 다양한 서버 프로그램(FTP서버, DBMS, 웹 서버 등)이 실행될 수 있다. 서버는 시작할 때 특정 포트 번호에 바인딩되며, 클라이언트는 어떤 서버와 통신할 지 표현하기 위해 해당 서버의 포트번호로 통신 요청해야 한다.→ 클라이언트가 서버와 통신할 때 사용하는 포트 번호는 운영체제가 부여하는 포트번호로, 통신 요청할 때 함께 전송되어 서버가 클라이언트로 데이터를 보낼 때 사용된다.
- 클라이언트는 서버에서 보낸 정보를 받기 위해서도 포트 번호를 필요로 한다. 이때 서버와 같이 고정적인 포트번호에 바인딩하는 것이 아니라 운영체제가 자동으로 부여하는 번호를 사용한다.
- IP는 컴퓨터의 네트워크 어댑터(LAN)까지 갈 수 있는 정보기 때문에, 컴퓨터 내부에서 실행하는 서버를 선택하기 위해 추가적인 포트 번호가 필요하다.
Well Known Port | 0 ~ 1023 | ICANN가 특정 애플리케이션용으로 미리 예약한 포트 |
Registered Port | 1024 ~ 49151 | 회사에서 등록해서 사용하는 포트 |
Dynamic Or Private Port | 49152 ~ 65535 | 운영체제가 부여하는 동적 포트 또는 개인적인 목적으로 사용할 수 있는 포트 |
2. IP 주소 얻기
IP주소 대신 도메인을 사용하려는 경우 사용 객체 InetAddress
import java.net.*;
// 도메인 네임을 알고 있는 경우
InetAddress ia = InetAddress.getByName(String domainName);
InetAddress[] iaArr = InetAddress.getAllByName(String domainName);
하나의 도메인으로 여러 IP가 등록되어 있는 이유?
- 클라이언트가 많이 연결되었을 경우 서버 부하를 나누기 위해
객체로 부터 IP 주소를 얻는 메소드 getHostAddress()
String ip = InetAddress.getHostAddress();
로컬 컴퓨터의 IP와 네이버 웹의 IP 정보 출력
InetAddress local = InetAddress.getLocalHost();
sout(local.getHostAddress());
TCP는 통신시 회선을 고정해서 사용하기 때문에 순차적이고 손실없는 데이터 전송 → 신뢰성
UCP는 여러 회선을 통해 일방적인 데이터 전송 → 속도
3. TCP/IP 네트워킹
Transmission Control Protocol TCP는 IP와 함께 사용되므로 TCP/IP라고도 한다. 웹 브라우저가 웹 서버에 연결할 때 사용되며 이메일 전송, 파일 전송, DB 연동에도 사용된다.
- 연결형 프로토콜?
상대방이 연결된 상태에서 데이터를 주고 받는 것으로, 클라이언트가 연결 요청 → 서버 수락 → 통신 회선 고정이 되면 데이터는 고정 회선을 통해 전달된다. 떄문에 TCP는 보낸 데이터가 순서대로 전달되며 손실이 발생하지 않는다. - Protocol IP 주소로 프로그램들이 통신할 때 약속된 통신 규약
java.net ServerSocket, Socket 패키지
- ServerSocket 클라이언트 연결을 수락하는 서버 클래스
- Socket 클라이언트에서 연결 요청하거나 클라이언트와 서버 양쪽에서 데이터를 주고 받을 때 사용하는 클래스
TCP 서버: ServerSocket / Socket 사용 흐름
- 서버의 포트번호 지정: 서버가 ServerSocket 사용을 위해 바인딩할 포트 번호(50001) 지정
- ServerSocket serverSocket = new ServerSocket(50001); // 객체 생성과 bind 과정이 분리된 코드 ServerSocket
serverSocket = new ServerSocket(); serverSocket.bind(new InetSocketAddress(50001));
3. 클라이언트의 연결 요청: 서버가 실행되면 클라이언트는 Socket을 이용해 서버의 IP주소와 포트 번호로 연결 요청
try {
// (server IP, port number)
// if asking to server running in local (localhost, port num)
Socket socket = new Socket("IP", 50001);
// using domain name
Sokcet socket = new Socket(InetAddress.getByName("domainName"), 50001);
// create socket and connect
socket = new Socket();
socket.connect( new InetSocketAddress("domainName", 50001));
} catch (UnknownHostException e) {
// IP 잘못 표기한 경우
} catch (IOException e) {
// IP, Port로 서버에 연결할 수 없는 경우
}
4. 서버의 통신용 Socket 생성: ServerSocket은 accept() 메소드로 클라이언트 연결 요청 수락 후 통신용 Socket 생성accept() 클라이언트 연결 요청 전까지 블로킹 상태, 클라이언트 요청이 들어오면 블로킹 해제 후 통신용 Socket 리턴
- blocking 실행을 멈춘 상태
- Socket socket = serverSocket.accept();
- 통신: 클라이언트와 서버는 양쪽 Socket을 이용해 데이터 통신
- 서버 종료: ServerSocket close()로 포트 번호 언바인딩을 해줘야 다른 프로그램에서 해당 포트 번호 사용 가능
- serverSocket.close(); socket.close();
서버 설정 시 발생할 수 있는 상황
- 서버 컴퓨터에서 여러 개의 IP가 할당된 경우
- BindException: Port가 다른 프로그램에서 사용 중인 경우
- → 다른 포트로 바인딩하거나 포트를 사용 중인 프로그램 종료 후 다시 실행
- 클라이언트가 서버 연결 요청 시 UnknownHostException / IOExceptioin
- IP 주소가 잘못 표기된 경우
- 제공된 IP와 포트 번호로 연결할 수 없는 경우
- 클라이언트의 IP주소와 포트 번호를 얻고 싶다면→ InetSocketAddress 객체 획득
- InetSocketAddress.getHostToString() / getPort()
- accept()로 리턴된 Socket의 getRemoteSocketAddress() 사용
InetSocketAddress isa = (InetSocketAddress) socket.getRemoteSocketAddress();
String clientIp = isa.getHostToString();
String portNo = isa.getPort();
데이터 주고 받기: IOStream
데이터는 byte로 보내고 받는다. 근데 데이터가 바이트는 아니니까 보조스트림인 DataInputStream/DataOutputStream 을 연결해서 사용한다. 대신 상대방도 DataOutputStream으로 보낼 때만 사용 가능하다.
// receive data
DataInputStream dis = new DataInputStream(socket.getInputStream());
// byte[string encoding with UTF-8]
String message = dis.readUTF();
// send data
DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
dos.writeUTF(message);
dos.flush();
System.out.println("Message sent: " + message);
4. UDP 네트워킹
User Datagram Protocol UCP는 발신자가 일방적으로 수신자에게 데이터를 보내는 방식
→ 연결 요청 및 수락 과정이 없기 때문에 TCP보다 데이터 전송 속도가 빠르다.
- 실시간 영상 스트리밍
java.net DatagramSocket / DatagramPacket 이용
- DatagramPacket(수신된 데이터 저장할 바이트 배열, 수신할 수 있는 최대 바이트 수)
UDP server
UCP 서버는 클라이언트가 보낸 Datagram을 항상 받을 준비가 되어야 한다.
TCP accept()는 클라이언트 요청 전까지 블로킹이 기본 상태였지만 UDP는 receive()로 데이터 수신 전까지 블로킹된다.
DatagramSocket socket = new DatagramSocket(50001);
// (바이트 배열, 시작 인덱스, 수신 가능 바이트 수)
DatagramPacket packet = new DatagramPacket(new byte[1024], 1024);
socket.receive(packet);
반대로, UDP 서버가 클라이언트에게 처리 내용을 보내려면 클라이언트 IP주소와 포트 번호가 필요하다.
- receive()로 받은 DatagramPacket .getSocketAddress() 로 SocketAddress 객체 획득
UDP Client
UDP DatagramSocket은 기본 생성자로 생성한다. 클라이언트의 포트 번호는 자동 부여되기 때문에 따로 지정할 필요가 없다.
1. DatagramSocket (바이트 배열, 바이트 배열에 보내고자 하는 바이트 수, InetSocketAddress);
- InetSocketAddress: UDP 서버의 IP와 Port 정보를 가진 객체
2. DatagramPacket에 담아서 정보 전달
- 서버로 데이터 전송 socket.send(sendPacket)
- 서버 처리 결과 받기 socket.receive(dataReceivePacket)
- 소켓 닫기 socket.close()
5. 서버의 동시 요청 처리
서버는 다수의 클라이언트와 통신하는데 클라이언트의 모든 요청 처리를 동기적으로 하면 다음 클라이언트의 지연시간이 길어진다.
accept() -> 데이터 받고 보내기(별도 스레드로 작업) -> receive()
- 스레드는 과도한 스레드 생성을 막고자 threadPool 을 이용한다. 스레드 수는 제한되지만 작업 큐 대기 작업 증가로 응답이 늦어질 수 있다.
6. JSON 데이터 형식
- JavaScript Object Notation
JSON에서 속성 순서는 중요하지 않기 때문에 추가한 순서대로 작성되지 않아도 상관없다. 그리고 줄바꿈 처리가 되지 않는데 오히려 이것이 네트워크 전송량을 줄이기 때문에 더 좋다.
작은 프로젝트에서는 JSON 자체를 이용하기 때문에 JSON-java 라이브러리 이용해서 JSON 생성하지만, JSON parsing이 필요한 경우에는 jackson 라이브러리를 이용해서 자바 객체로 변환해 사용할 수 있다.
'Computer Science > Network' 카테고리의 다른 글
HTTP Protocol 기초 (0) | 2025.03.19 |
---|