java.net package
거의 사용되지 않는다 ㅠㅠ
자바 언어적인적인 측면보다는 네트워크 기술적인 용어 중심으로 알아둘 것!
불특정 다수의 네트워크망 = 인터넷
특정집단의 네트워크망 = 인트라넷
인터넷 + 인트라넷 = 익스트라넷
Network
- Network란 다른 장치로 데이터를 이동시킬 수 있는 컴퓨터들과 주변 장치들의 집합이다.
- Network의 연결된 모든 장치들을 Node라고한다.
- 다른 Node에게 하나 이상의 Service를 해주는 Node를 Host라 부른다.
- 하나의 컴퓨터에서 다른 컴퓨터로 데이터를 이동시킬 때 복합한 계층을 통해 전송되는데, 이런 대표적인 모델이 OSI7 Layer Model이다.
- OSI 계층 모델은 모두 7계층으로 이루어졌다.
- 데이터 통신을 이해하는데 OSI7 Layer Model은 상당한 역할을 하지만, Internet기반의 표준 모델로 사용하는 TCP/IP계층 모델을 주로 사용하고 있다.
- 자바에서 이야기하는 네트워크 프로그래밍은 TCP/IP 모델을 사용하고 있다.
Internet Address
- 모든 호스트는 Internet Address(Host 또는 IP address)라 불리는 유일한 32비트 숫자로 구성된 address체계를 이용하여 서로를 구분할 수 있다.
- IP address는 32비트 숫자를 한번에 모두를 표현하는 것이 힘들기 때문에, 8비트씩 끊어서 표현하고, 각자리는 1바이트로 0~255까지의 범위를 갖게 된다.
- 32비트의 address체계를 IPv4라 한다.
- 오늘날 IPv4는 포화 상태이고, 이를 극복하고자 나온것이 IPv6이다.
- IPv6는 128비트의 address체계를 관리하고 있으며, 16비트씩 8부분으로 나누어 16진수로 표시한다.
- 각 호스트는 Domain 이름을 컴퓨터가 사용하는 address로 바꾸어 주어야 한다. 이렇게 IP address를 Domain 이름으로 바꾸어 주는 시스템을 DNS이라 한다.
Port와 Protocol
- Port는 컴퓨터의 주변장치를 접속하기 위한 물리적인 포트와 프로그램에서 사용되는 접속 장소인 논리적인 포트가 있다.
- 포트번호는 인터넷번호 할당 허가 위원회(IANA)에 의해 예약된 Port번호를 가진다.
- 예약된 Port번호의 예로는 80(http), 21(ftp), 22(ssh), 23(telnet)등이 있다.
- 0~1023은 예약된 포트 번호이고, 그 나머지 0~65535까지 유저가 할당하여 사용할 수 있다.
- Protocol은 client와 server간의 통신규약이다.
- 통신규약이란 상호 간의 접속이나 절단방식, 통신방식, 주고받을 데이터의 형식, 오류검출 방식, 코드변환방식, 전송속도 등에 대하여 정의한 것을 말한다.
- 대표적인 인터넷 표준 프로토콜에는 TCP와 UDP가 있다.
TCP와 UDP
- TCP/IP 계층 모델은 4계층의 구조를 가지고 있다.
- Application, Transfer, Network, Data Link 계층이 있다.
- 이 중 Transfer 계층에서 사용하는 프로토콜에는 TCP와 UDP가 있다.
TCP
- Transmission Control Protocol은 신뢰할 수 있는 Protocol로서,
- 데이터를 상대 측까지 제대로 전달되었는지 확인 메시지(ACK)를 주고 받음으로써 데이터의 송수신 상태를 점검한다.
- 대표적으로 전화 시스템
UDP
- User Datagram Protocol은 신뢰할 수 없는 프로토콜로서, 데이터를 보내기만 하고 확인 메시지를 주고 받지 않기 때문에 제대로 전달했는지 확인하지 않는다.
- 대표적으로 편지 또는 위성 중계
InetAddress class
import java.net.*;
import java.util.*;
class InetAddress3{
public static void main(String[] args)throws Exception {
String url = null;
Scanner s = new Scanner(System.in);
System.out.print("웹 사이트 주소 입력 ==> ");
url = s.nextLine();
InetAddress [] addr = InetAddress.getAllByName(url);
System.out.println("==================================");
System.out.println(url+"는 "+addr.length+"개의 IP주소를 갖고 있습니다.");
for(int i = 0; i < addr.length; i++){
System.out.println("IP 번호 = " + addr[i].getHostAddress());
}}}
url과 uri의 차이점?
잘 알기!!!!
URL은 Uniform Resource Locator
URI는 Uniform Resource Identifier
예1>
http://terms.naver.com/entry.nhn
URL : 프로토콜(http)을 포함한 전체 주소
http://terms.naver.com/entry.nhn
URI : ip와 포트를 제외한 실질적인 주소(변하지 않는 정적주소)(파일경로)
/entry.nhn
예2>
URL : 웹 상에서 서비스를 제공하는 각 서버들에 있는 파일들의 위치를 표시하기 위한 것으로 접속할 서비스의 종류,도메인명,파일의 위치 등을 포함한다.
e.g. http://127.0.0.1:7001/TestApps/test.jsp
URI : 존재하는 자원을 식별하기 위한 일반적인 식별자를 규정하기 위한 것으로 URL에서 HTTP프로토콜,호스트명,port 번호를 제외한 것이다.
e.g. /TestApps/test.jsp
//서버
import java.net.*;
import java.io.*;
import java.util.*;
public class TcpIpMultichatServer {
HashMap clients;
TcpIpMultichatServer() {
clients = new HashMap();
Collections.synchronizedMap(clients);
}
public void start() {
ServerSocket serverSocket = null;
Socket socket = null;
try {
serverSocket = new ServerSocket(7777);
System.out.println("서버가 시작되었습니다.");
while(true) {
socket = serverSocket.accept();
System.out.println("["+socket.getInetAddress() + ":"+socket.getPort()+"]"+"에서 접속하였습니다.");
ServerReceiver thread = new ServerReceiver(socket);
thread.start();
}
} catch(Exception e) {
e.printStackTrace();
}
} // start()
void sendToAll(String msg) {
Iterator it = clients.keySet().iterator();
while(it.hasNext()) {
try {
DataOutputStream out =
(DataOutputStream)clients.get(it.next());
out.writeUTF(msg);
} catch(IOException e){}
} // while
} // sendToAll
public static void main(String args[]) {
new TcpIpMultichatServer().start();
}
class ServerReceiver extends Thread {
Socket socket;
DataInputStream in;
DataOutputStream out;
ServerReceiver(Socket socket) {
this.socket = socket;
try {
in = new DataInputStream(socket.getInputStream());
out = new DataOutputStream(socket.getOutputStream());
} catch(IOException e) {}
}
public void run() {
String name = "";
try {
name = in.readUTF();
sendToAll("#"+name+"님이 들어오셨습니다.");
clients.p
ut(name, out);
System.out.println("현재 서버접속자 수는 " + clients.size() + "입니다.");
while(in!=null) {
sendToAll(in.readUTF());
}
} catch(IOException e) {
// ignore
} finally {
sendToAll("#"+name+"님이 나가셨습니다.");
clients.remove(name);
System.out.println("["+socket.getInetAddress()+":"+socket.getPort()+"]"+"에서 접속을 종료하였습니다.");
System.out.println("현재 서버접속자 수는 "+ clients.size()+"입니다.");
} // try
} // run
} // ReceiverThread
} // class
//클라이언트
import java.net.*;
import java.io.*;
import java.util.Scanner;
public class TcpIpMultichatClient {
public static void main(String args[]) {
if(args.length!=1) {
System.out.println("USAGE: java TcpIpMultichatClient 대화명");
System.exit(0);
}
try {
String serverIp = "아이피";
// 소켓을 생성하여 연결을 요청한다.
Socket socket = new Socket(serverIp, 7777);
System.out.println("서버에 연결되었습니다.");
Thread sender = new Thread(new ClientSender(socket, args[0]));
Thread receiver = new Thread(new ClientReceiver(socket));
sender.start();
receiver.start();
} catch(ConnectException ce) {
ce.printStackTrace();
} catch(Exception e) {}
} // main
static class ClientSender extends Thread {
Socket socket;
DataOutputStream out;
String name;
ClientSender(Socket socket, String name) {
this.socket = socket;
try {
out = new DataOutputStream(socket.getOutputStream());
this.name = name;
} catch(Exception e) {}
}
public void run() {
Scanner scanner = new Scanner(System.in);
try {
if(out!=null) {
out.writeUTF(name);
}
while(out!=null) {
out.writeUTF("["+name+"]"+scanner.nextLine());
}
} catch(IOException e) {}
} }
static class ClientReceiver extends Thread {
Socket socket;
DataInputStream in;
ClientReceiver(Socket socket) {
this.socket = socket;
try {
in = new DataInputStream(socket.getInputStream());
} catch(IOException e) {}
}
public void run() {
while(in!=null) {
try {
System.out.println(in.readUTF());
} catch(IOException e) {}
}
}
}
}