- ip의 확장
기존 ipv4 사용 -> ipv6로 변경
- HTML -> XHTML, HTML5
당시 대부분 XHTML(스트리밍 : 플래시 지원)로 넘어감 (웹브라우저 게임, 유튜브 등에서도 사용)
아이폰의 등장(플래시 지원 안함) -> XHTML 사양되고 HTML5가 표준이 됨.
- HTML (Hypertext Markup Language)
일반적 선형 문서(text)를 넘어선 비선형 문서(hypertext)
아날로그에서 디지털로의 전환을 선형에서 비선형으로의 전환으로 설명하기도 한다.
search(String keyword)
|| 프로토콜 :\\URL ? query
method
, 네트워크에서는 request
- 컴퓨터상의 표준
표준이 정해져있지만 지켜지지 않는 분야도 있다 (ex) 자바스크립트, sql)
이유 : 경쟁 과정에서 벗어남
그러나 표준을 기반으로 발전했기 때문에, 표준을 이해한다면 발전된 프로그램도 이해하기 수월함
그래서 우리는 MySQL으로 공부할 것
자바스크립트 - 제이쿼리 - 크로스브라우징(어떤 브라우저에서나 접근 가능)을 편하게 함.
public class NSLookup {
public static void main(String[] args) {
String domain = JOptionPane.showInputDialog("도메인을 입력하시오");
// IP 나타내는 객체
// 배열 객체 <- 도메인 하나당 나타내는 ip가 여러개기 때문
InetAddress[] inetaddr = null;
try {
inetaddr = InetAddress.getAllByName(domain);
} catch(UnknownHostException e) {
e.printStackTrace();
}
for(int i = 0; i < inetaddr.length; i++) {
System.out.println(inetaddr[i].getHostName());
System.out.println(inetaddr[i].getHostAddress());
System.out.println(inetaddr[i].toString());
System.out.println("-----------------------");
}
} //main
}
(??? 서버 만들고 클라이언트 만들고 할 줄 알면 대단한거)
public class EchoClient {
public static void main(String[] args) {
Socket sock = null;
OutputStream out = null;
OutputStreamWriter osw = null;
PrintWriter pw = null;
InputStream in = null;
InputStreamReader isr = null;
BufferedReader br = null;
BufferedReader keyboard = null;
InputStreamReader keyIsr = null;
try {
// 소켓 생성 : 접속했음
// server 정보 (디바이스 식별자, 포트 식별자)
sock = new Socket("127.0.0.1", 10001);
// 키보드 io 스트림
keyIsr = new InputStreamReader(System.in);
keyboard = new BufferedReader(keyIsr);
out = sock.getOutputStream(); // 소켓에 쓰기
in = sock.getInputStream(); // 소켓을 읽기
osw = new OutputStreamWriter(out);
pw = new PrintWriter(osw);
isr = new InputStreamReader(in);
br = new BufferedReader(isr);
String line = null;
// 키보드입력 대기 : 읽을 게 생길 때까지 멈춤
while ((line = keyboard.readLine()) != null) {
if (line.equals("quit")) {
break;
}
pw.println(line); // 키보드로 입력받은 line을 서버(소켓)에 쓰기
pw.flush();
// 서버로부터 전송 대기
String echo = br.readLine();
System.out.println("서버로부터 전달받은 문자열 : " + echo);
}
pw.close();
br.close();
sock.close();
} catch (Exception e) {
System.out.println(e);
} finally {
try {
keyboard.close();
} catch (Exception e) { }
try {
keyIsr.close();
} catch (Exception e) { }
try {
br.close();
} catch (Exception e) { }
try {
isr.close();
} catch (Exception e) { }
try {
in.close();
} catch (Exception e) { }
try {
pw.close();
} catch (Exception e) { }
try {
osw.close();
} catch (Exception e) { }
try {
out.close();
} catch (Exception e) { }
try {
sock.close();
} catch (Exception e) { }
}
} // main
}
- ip 중 127로 시작하는 ip는 내부ip
127.0.0.1은 '나'를 가리키는 ip - 지금 나에게 접속한 것
(물리적으로 같지만 논리적으로 다른 것으로 인식됨)- 클라이언트가 잘못된 주소로 연결 시도할 경우 : 거절 -> ConnectException 발생
public class EchoServer {
public static void main(String[] args) {
Socket sock = null;
OutputStream out = null;
OutputStreamWriter osw = null;
PrintWriter pw = null;
InputStream in = null;
InputStreamReader isr = null;
BufferedReader br = null;
try {
ServerSocket server = new ServerSocket(10001);
System.out.println("접속을 기다립니다.");
// 1
// Client 정보가 담긴 소켓
sock = server.accept(); // return : Socket 객체
// 멈춤 -> blocked
// 서버 측에서는 프로그램이 멈춤 - 누군가 접속할 때까지
// 소켓이란? 전화기같은 것
InetAddress inetaddr = sock.getInetAddress();
System.out.println(inetaddr.getHostAddress() + "로부터 접속하였습니다.");
out = sock.getOutputStream(); // 소켓에 쓰기
in = sock.getInputStream(); // 소켓을 읽기
osw = new OutputStreamWriter(out);
pw = new PrintWriter(osw);
isr = new InputStreamReader(in);
br = new BufferedReader(isr);
String line = null;
// 소켓입력 대기 : 읽을 게 생길 때까지 멈춤
while((line = br.readLine()) != null) {
System.out.println("클라이언트로부터 전송받은 문자열 : " + line);
pw.println(line);
pw.flush();
}
System.out.println(line);
} catch(Exception e) {
System.out.println(e);
} finally {
try {
br.close();
} catch(Exception e) {}
try {
isr.close();
} catch(Exception e) {}
try {
in.close();
}catch (Exception e) {}
try {
pw.close();
}catch(Exception e) {}
try {
osw.close();
}catch(Exception e) {}
try {
out.close();
}catch(Exception e) {}
try {
sock.close();
} catch(Exception e) {}
}
} // main
}
server.accept()
)InStream
, OutStream
의 read()
, write()
수행)import java.util.List;
import java.util.Vector;
import java.util.Iterator;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.net.ServerSocket;
import java.net.InetAddress;
import java.net.Socket;
public class EchoServer {
static List<Socket> activeSocks;
public static void main(String[] args) {
activeSocks = new Vector<Socket>();
try {
ServerSocket server = new ServerSocket(10001);
System.out.println("접속을 기다립니다.");
CheckThread t2 = new CheckThread(activeSocks);
t2.start();
while(true) {
Socket sock = server.accept();
activeSocks.add(sock);
synchronized(activeSocks) {
SocketThread t1 = new SocketThread(activeSocks, sock);
t1.start();
}
}
} catch(Exception e) {
System.out.println(e);
}
} // main
}
class CheckThread extends Thread {
private List<Socket> activeSocks;
public CheckThread(List<Socket> activeSocks) {
this.activeSocks = activeSocks;
}
@Override
public void run() {
InputStream is = null;
InputStreamReader isr = null;
BufferedReader br = null;
OutputStream os = null;
OutputStreamWriter osw = null;
PrintWriter pw = null;
try {
is = System.in;
isr = new InputStreamReader(is);
br = new BufferedReader(isr);
while(br.readLine().equals("1")){
synchronized(activeSocks) {
Iterator<Socket> itr = activeSocks.iterator();
while(itr.hasNext()) {
try {
os = itr.next().getOutputStream();
osw = new OutputStreamWriter(os);
pw = new PrintWriter(osw);
pw.println("연결 중인 클라이언트 수 : " + activeSocks.size());
pw.flush();
} catch(Exception e) {
e.printStackTrace();
}
}
}
}
} catch(Exception e) {
e.printStackTrace();
} finally {
MyUtils.closeAll(br, isr, is);
}
}
}
class SocketThread extends Thread {
private List<Socket> activeSocks;
private Socket sock;
public SocketThread(List<Socket> activeSocks, Socket sock) {
this.activeSocks = activeSocks;
this.sock = sock;
}
@Override
public void run() {
OutputStream out = null;
OutputStreamWriter osw = null;
PrintWriter pw = null;
InputStream in = null;
InputStreamReader isr = null;
BufferedReader br = null;
try {
InetAddress inetaddr = sock.getInetAddress();
System.out.println(inetaddr.getHostAddress() + "로부터 접속하였습니다.");
out = sock.getOutputStream(); // 소켓에 쓰기
osw = new OutputStreamWriter(out);
pw = new PrintWriter(osw);
in = sock.getInputStream(); // 소켓을 읽기
isr = new InputStreamReader(in);
br = new BufferedReader(isr);
String line = null;
// 소켓입력 대기 : 읽을 게 생길 때까지 멈춤
while((line = br.readLine()) != null) {
System.out.println("클라이언트로부터 전송받은 문자열 : " + line);
pw.println(line);
pw.flush();
}
System.out.println(line);
} catch(Exception e) {
e.printStackTrace();
} finally {
MyUtils.closeAll(br, isr, in, pw, osw, out, sock);
activeSocks.remove(sock);
}
}
}
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
public class EchoClient {
static Socket sock;
public static void main(String[] args) {
OutputStream out = null;
OutputStreamWriter osw = null;
PrintWriter pw = null;
InputStream in = null;
InputStreamReader isr = null;
BufferedReader br = null;
BufferedReader keyboard = null;
InputStreamReader keyIsr = null;
// 필요한 일
// 1. 키보드를 통해 유저가 할 말을 입력받음 (대기)
// 2. 소켓을 통해 서버에서 연락을 받음 (대기)
try {
sock = new Socket("127.0.0.1", 10001);
// 키보드 io 스트림
keyIsr = new InputStreamReader(System.in);
keyboard = new BufferedReader(keyIsr);
out = sock.getOutputStream(); // 소켓에 쓰기
in = sock.getInputStream(); // 소켓을 읽기
osw = new OutputStreamWriter(out);
pw = new PrintWriter(osw);
isr = new InputStreamReader(in);
br = new BufferedReader(isr);
String line = null;
ReceiveThread waitThread = new ReceiveThread(br);
waitThread.start();
// 키보드입력 대기 : 읽을 게 생길 때까지 멈춤
while ((line = keyboard.readLine()) != null) {
if (line.equals("quit")) {
break;
}
pw.println(line); // 키보드로 입력받은 line을 서버(소켓)에 쓰기
pw.flush();
// 서버로부터 전송 대기
//String echo = br.readLine();
//System.out.println("서버로부터 전달받은 문자열 : " + echo);
}
pw.close();
br.close();
sock.close();
} catch (Exception e) {
System.out.println(e);
} finally {
MyUtils.closeAll(keyboard, keyIsr, br, isr, in, pw, osw, out, sock);
}
} // main
}
class ReceiveThread extends Thread {
private BufferedReader br;
private String inform;
public ReceiveThread(BufferedReader br) {
this.br = br;
}
@Override
public void run() {
try {
// in = sock.getInputStream();
// isr = new InputStreamReader(in);
// br = new BufferedReader(isr);
while((inform = br.readLine()) != null) {
System.out.println("서버로부터 전달받은 문자열 : " + inform);
}
} catch(Exception e) {
e.printStackTrace();
} // finally {
// MyUtils.closeAll(br, isr, in);
// }
}
}
- 소켓 꼭 닫아주기