반응형
✔️ 네트워킹
- 두 대 이상의 컴퓨터를 케이블로 연결하여 네트워크를 구성하는 것을 말한다
📌 클라이언트/서버
- 컴퓨터간의 관계를 역할로 구분한 것
- 서버(server) : 서비스를 제공하는 컴퓨터로 이를 위해 서버프로그램이 있어야 한다
- 클라이언트(client) : 서비스를 제공받는 컴퓨터로 이를 위해 서버프로그램과 연결할 수 있는 클라이언트 프로그램이 있어야 한다
- 일반 PC로도 FTP Serv-U, Tomcat과 같은 서버프로그램으로 서버 역할을 수행할 수 있다
- 네트워크를 구성할 때 전용서버의 유무와 역할에 따라 여러 모델로 나뉜다
📌 IP 주소
- 컴퓨터(호스트)를 구별하는데 사용되는 고유한 값으로 모든 컴퓨터는 IP 주소를 갖는다
- 4byte(32bit)의 정수로 구성되어 있으며 a.b.c.d는 각각 부호없는 1byte값(0~255)의 정수이다
- IP 주소는 네트워크 주소와 호스트 주소로 나눌 수 있다
- &연산자를 통해 마지막 8bit가 0인 것을 통해 a.b.c는 네트워크 주소고 d는 호스트 주소라는걸 알 수 있다
- 이 때 호스트 주소가 0인 것은 자신을 가리키고 255는 예약된 브로드캐스트 주소기 때문에 실제 호스트 개수는 254개이다
📌 InetAddress
- IP 주소를 다루기 위한 클래스이다
InetAddress ip = null;
InetAddress[] ipArr = null;
try {
ip = InetAddress.getByName("www.naver.com");
System.out.println(ip.getHostName()); //www.naver.com
System.out.println(ip.getHostAddress()); //222.122.84.200
System.out.println(ip.toString()); //www.naver.com/222.122.84.200
byte[] ipAddr = ip.getAddress();
System.out.println(Arrays.toString(ipAddr)); //[-34, 122, 84, -56]
String result = "";
for(int i = 0; i < ipAddr.length; i++) {
result += (ipAddr[i] < 0) ? ipAddr[i] + 256 : ipAddr[i];
result += ".";
}
System.out.println(result); //222.122.84.200
} catch (UnknownHostException e) {}
try {
ip = InetAddress.getLocalHost();
System.out.println(ip.getHostName()); //chan
System.out.println(ip.getHostAddress()); //192.168.0.1
} catch (UnknownHostException e) {}
try {
ipArr = InetAddress.getAllByName("www.naver.com");
//ipArr[0] : www.naver.com/222.122.84.200
//ipArr[1] : www.naver.com/222.122.84.250
//ipArr[2] : www.naver.com/61.247.208.6
} catch (UnknownHostException e) {}
📌 URL(Uniform Resource Locator)
- 인터넷에 존재하는 여러 서버들이 제공하는 자원에 접근할 수 있는 주소를 표현하기 위한 것이다
- 프로토콜://호스트명:포트번호/경로명/파일명?쿼리스트링#참조 (포트번호, 쿼리, 참조 생략가능)
- ex) http://www.codechobo.com:80/sample/hello.html?referer=codechobo#index1
- 프로토콜 : 자원에 접근하기 위해 서버와 통신하는데 사용되는 통신규약
- 호스트명 : 자원을 제공하는 서버의 이름
- 포트번호 : 통신에 사용되는 서버의 포트번호 (기본 포트번호 80)
- 경로명 : 접근하려는 자원이 저장된 서버상의 위치
- 파일명 : 접근하려는 자원의 이름
- 쿼리 : URL에서 ?이후의 부분
- 참조 : URL에서 #이후의 부분
URL url = new URL("http://www.codechobo.com:80/sample/"
+"hello.html?referer=codechobo#index1");
System.out.println(url.getAuthority()); // www.codechobo.com:80
System.out.println(url.getContent()); // sun.net.www.protocol.http.HttpURLConnection$HttpInputStream@c17164
System.out.println(url.getDefaultPort()); // 80
System.out.println(url.getPort()); // 80
System.out.println(url.getFile()); // /sample/hello.html?referer=codechobo
System.out.println(url.getHost()); // www.codechobo.com
System.out.println(url.getPath()); // /sample/hello.html
System.out.println(url.getProtocol()); // http
System.out.println(url.getQuery()); // referer=codechobo
System.out.println(url.getRef()); // index1
System.out.println(url.getUserInfo()); // null
System.out.println(url.toExternalForm()); // http://www.codechobo.com:80/sample/hello.html?referer=codechobo#index1
System.out.println(url.toURI()); // http://www.codechobo.com:80/sample/hello.html?referer=codechobo#index1
📌 URLConnection
- 어플리케이션과 URL간의 통신연결을 나타내는 클래스의 최상위 클래스로 추상 클래스이다
메서드 | 설명 |
void addRequestProperty(String key, String value) | 지정된 키와 값을 RequestProperty에 추가한다 기존에 같은 키가 있어도 값을 덮어쓰지 않는다 |
void connect() | URL에 저장된 자원에 대한 통신연결을 연다 |
boolean getAllowUserInteraction() | UserInteraction의 허용여부를 반환한다 |
int getConnectTimeout() | 연결종료시간을 천분의 일초로 반환한다 |
Object getContent() | content객체를 반환한다 |
Object getContent(Class[] classes) | content객체를 반환한다 |
String getContentEncoding() | content의 인코딩을 반환한다 |
int getContentLength() | content의 크기를 반환한다 |
String getContentType() | content의 type을 반환한다 |
long getDate() | 헤더(header)의 date필드의 값을 반환한다 |
boolean getDefaultAllowUserInteraction() | defaultAllowUserInteraction의 값을 반환한다 |
String getDefaultRequestProperty(String key) | RequestProperty에서 지정된 키의 디폴트값을 얻는다 |
boolean getDefaultUseCaches() | useCache의 디폴트 값을 얻는다 |
boolean getDoInput() | doInput필드값을 얻는다 |
boolean getDoOutput() | doOutput필드값을 얻는다 |
long getExpiration() | 자원(URL)의 만료일자를 얻는다 (천분의 일초단위) |
FileNameMap getFileNameMap() | FileNameMap(mimetable)을 반환한다 |
String getHeaderField(int n) | 헤더의 n번째 필드를 읽어온다 |
String getHeaderField(String name) | 헤더에서 지정된 이름의 필드를 읽어온다 |
long getHeaderFieldDate(String name, long Default) | 지정된 필드의 값을 날짜값으로 변환하여 반환한다 필드값이 유효하지 않을 경우 Default값을 반환한다 |
int getHeaderFieldInt(String name, long Default) | 지정된 필드의 값을 정수값으로 변환하여 반환한다 필드값이 유효하지 않을 경우 Default값을 반환한다 |
int getHeaderFieldKey(int n) | 헤더의 n번째 필드를 읽어온다 |
Map getHeaderFields() | 헤더의 모든 필드와 값이 저장된 Map을 반환한다 |
long getIfModifiedSince() | ifModifiedSince(변경여부) 필드의 값을 반환한다 |
InputStream getInputStream() | URLConnection에서 InputStream을 반환한다 |
long getLastModified() | LastModified(최종변경일) 필드의 값을 반환한다 |
OutputStream getOutputStream() | URLConnection에서 OutputStream을 반환한다 |
Permission getPermission() | Permission(허용권한)을 반환한다 |
int getReadTimeout() | 읽기제한시간의 값을 반환한다 (천분의 일초) |
Map getRequestProperties() | RequestProperty에 저장된 (키,값)을 Map으로 반환 |
String getRequestProperty(String key) | RequestProperty에서 지정된 키의 값을 반환한다 |
URL getURL() | URLConnection의 URL을 반환한다 |
boolean getUseCaches() | 캐쉬의 사용여부를 반환한다 |
String guessContentTypeFromName(String fname) | 지정된 파일(fname)의 content-type을 추측하여 반환한다 |
String guessContentTypeFromStream(InputStream is) | 지정된 입력스트림(is)의 content-type을 추측하여 반환한다 |
void setAllowUserInteraction(boolean allowuserinteraction) | UserInteraction의 허용여부를 설정한다 |
void setConnectTimeout(int timeout) | 연결종료시간을 설정한다 |
void setContentHandlerFactory(boolean ContentHandlerFactory fac) | ContentHandlerFactory를 설정한다 |
void setDefaultAllowUserInteraction(boolean defaultallowuserinteraction) | UserInteraction 허용여부의 기본값을 설정한다 |
void setDefaultRequestProperty(String key, String value) | RequestProperty의 기본 키쌍(key-pair)을 설정한다 |
void setDefaultUseCaches(boolean defaultusecaches) | 캐쉬 사용여부의 기본값을 설정한다 |
void setDoInput(boolean doinput) | DoInput 필드의 값을 설정한다 |
void setDoOutput(boolean dooutput) | DoOutput 필드의 값을 설정한다 |
void setFileNameMap(FileNameMap map) | FileNameMap을 설정한다 |
void setIfModifiedSince(long ifmodifiedsince) | ModifiedSince 필드의 값을 설정한다 |
void setReadTimeout(int timeout) | 읽기제한시간을 설정한다 (천분의 일초) |
void setRequestProperty(String key, String value) | RequestProperty에 (key, value)를 저장한다 |
void setUseCaches(boolean usecaches) | 캐쉬의 사용여부를 설정한다 |
URL url = null;
BufferedReader input = null;
String address = "http://www.naver.com";
String line = "";
try {
url = new URL(address);
input = new BufferedReader(new InputStreamReader(url.openStream()));
while((line = input.readLine()) != null) {
System.out.println(line);
}
input.close();
} catch (Exception e) {}
✔️ 소켓 프로그래밍
- 프로세스 간의 통신을 위한 소켓을 이용한 통신 프로그래밍으로 java.net 패키지를 통해 구현할 수 있다
📌 TCP와 UDP
- TCP/IP 프로토콜은 이기종 시스템 간의 통신을 위한 표준 프로토콜로 프로토콜의 집합이다
- TCP와 UDP는 TCP/IP 프로토콜에 포함되어 있으며 OSI 7계층 중 전송계층에 해당한다
항목 | TCP | UDP |
연결방식 | 연결기반(connection-oriented) - 연결 후 통신 (전화기) - 1:1 통신방식 |
비연결기반(connectionless-oriented) - 연결없이 통신 (소포) - 1:1, 1:n, n:n 통신방식 |
특징 | 데이터의 경계를 구분안함 (byte-stream) 신뢰성 있는 데이터 전송 - 데이터의 전송순서가 보장됨 - 데이터의 수신여부를 확인함 (데이터가 손실되면 재전송됨) - 패킷을 관리할 필요가 없음 UDP보다 전송속도가 느림 |
데이터의 경계를 구분함 (datagram) 신뢰성 없는 데이터 전송 - 데이터의 전송순서가 바뀔 수 있음 - 데이터의 수신여부를 확인안함 (데이터가 손실되어도 알 수 없음) - 패킷을 관리해주어야 함 TCP보다 전송속도가 빠름 |
관련 클래스 | Socket ServerSocket |
DatagramSocket DatagramPacket MulticastSocket |
📌 TCP 소켓 프로그래밍
- 통신과정
- 서버 프로그램에서는 서버소켓을 사용해서 서버 컴퓨터의 특정 포트에서 클라이언트의 연결요청을 처리할 준비를 한다
- 클라이언트 프로그램은 접속할 서버의 IP주소와 포트 정보를 가지고 소켓을 생성해서 서버에 연결을 요청한다
- 서버소켓은 클라이언트의 연결요청을 받으면 서버에 새로운 소켓을 생성해서 클라이언트의 소켓과 연결되도록 한다
- 이제 클라이언트의 소켓과 새로 생성된 서버의 소켓은 서버소켓과 관계없이 일대일 통신을 한다
- 통신은 포트 정보로 이루어지는데 서버 소켓은 클라이언트 소켓과 연결을 위해 포트를 독점해야 한다
- 소켓은 입력/출력스트림을 가지고 있으며 연결된 소켓과 서로 교차하여 연결된다
- 자바에서는 TCP 소켓 프로그래밍을 위한 클래스를 제공한다
- Socket : 프로세스 간의 통신을 담당하며 InputStream/OutputStream을 통해 프로세스 간 입출력이 이루어진다
- ServerSocket : 포트와 연결되어 연결요청이 오면 소켓을 생성해 통신한다 (한 포트에 한 소켓)
📌 UDP 소켓 프로그래밍
- TCP 소켓 프로그래밍과 마찬가지로 UDP 소켓 프로그래밍을 위한 클래스를 제공한다
- DatagramSocket : 데이터를 DatagramPacket에 담아서 전송한다
- DatagramPacket : 헤더(호스트의 주소와 포트)와 데이터로 구성되어있다
📄 참고
자바의 정석 3rd Edition
반응형
'📚 Study > JAVA' 카테고리의 다른 글
[JAVA] 직렬화(Serialization) (0) | 2022.05.13 |
---|---|
[JAVA] 표준 입출력과 파일 입출력 (0) | 2022.05.13 |
[JAVA] 입출력과 스트림 (0) | 2022.05.13 |
[JAVA] 스트림(Stream) (0) | 2022.05.12 |
[JAVA] 람다와 함수형 인터페이스 (0) | 2022.05.11 |