ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 14. 자바 네트워크의 기본.
    Programming/JAVA 2010. 5. 3. 21:12

    1 네트워크의 기본 프로그램
    1.1 개요

    자바의 네트워크의 예

    애플릿의 동작원리

    IO에서의 네트워크 지원

    자바와 네트워크

    네트워크 기능을 강화한 언어가 자바 언어이다.

    java.net 패키지내의 클래스들이 네트워크를 지원한다.

    java.net 패키지 내의 대표적인 기본 클래스들

    URL 클래스

    InetAddress 클래스

    URLConnection 클래스

    URLDecoder 클래스

    URLEncoder 클래스

    URLClassLoader 클래스
    1.2 URL 클래스

    Web상에 존재하는 자원에 접근하거나

    네트워크상의 유일한 주소를 나타내기 위한 방법을 제공한다.

    URL의 예

    http://java.sun.com/javase/downloads/index.jsp

    즉,

    protocol://호스트명:포트/호스트상의 경로명/파일

    이렇게 구성되어 있다.
    1.2 URL 클래스

    URL구조를 보다 편리하게 사용할 수 있도록 하는 클래스가 바로 URL클래스이다.

    URL객체를 생성하는 방법은 두 가지 이다.

    URL url1 = new URL(“http”, “hostname”, 80, “index.html”);

    URL url2 = new URL(“http://hostname:80/index.html”);

    URL객체를 생성할 때에는 잘못된 주소에 대한 MalformedURLException 예외처리를 해주어야 한다.
    try{
    URL url1 = new URL(“http”, “hostname”, 80, “index.html”);
    }catch(MalformedURLExceptione){
    e.printStackTrace();
    }
    1.2 URL 클래스

    URL객체가 생성되었다면 다음과 같은 멤버 메서드를 사용할 수 있다.

    public String getProtocol();

    public String getHost();

    public String getFile();

    public String getRef();

    public int getPort();

    URL클래스로 스트림을 개설할 수도 있다.

    가령 웹페이지의 주소에 스트림을 개설하고자 한다면 URL 의 openStream 메서드를 이용하면 된다.
    URL url = new URL(“http”, “hostname”, 80, “index.html”);
    InputStreamis = url.openStream();
    1.2 URL 클래스
    import java.net.*;
    import java.io.*;
    public class URLMain{
    public static void main(String args[])
    throws MalformedURLException, IOException{
    URL url = new URL("http://java.sun.com/javase/downloads/index.jsp");
    System.out.println("Port: " + url.getPort());
    System.out.println("Protocol: " + url.getProtocol());
    System.out.println("HostName: " + url.getHost());
    System.out.println("File: " + url.getFile());
    System.out.println("Ref: " + url.getRef());
    String temp;
    BufferedReader br;
    br = new BufferedReader(new InputStreamReader(url.openStream()));
    while ((temp = br.readLine()) != null) {
    System.out.println(temp);
    }
    br.close();
    }
    }
    1.3 InetAddress 클래스

    Internet Protocol Address를 표현하기 위한 클래 스이다.

    즉, IP Address를 표현하고 제어하는 기능을 제공한다.

    InetAddress객체는 생성자가 private이기 때문에 static method인 getByName()메서드를 이용한다.

    InetAddress inet1 = InetAddress.getByName(“java.sun.com”);

    InetAddress inet2 = InetAddress.getByName(“localhost”);
    1.3 InetAddress 클래스
    import java.net.*;
    public class InetAddressMain{
    public static void main(String[] args) throws UnknownHostException{
    InetAddress inet1 = InetAddress.getByName(“java.sun.com");
    InetAddress inet2 = InetAddress.getByName(“localhost");
    System.out.println(inet1);
    System.out.println(inet1.getHostName());
    System.out.println(inet1.getHostAddress());
    System.out.println(inet1.getHostName());
    System.out.println(inet1.getHostAddress());
    System.out.println(inet2);
    System.out.println(inet2.getHostName());
    System.out.println(inet2.getHostAddress());
    System.out.println(inet2.getHostName());
    System.out.println(inet2.getHostAddress());
    }
    }
    1.4 URLConnection 클래스

    URL을 목표지점으로 하는 네트워크 연결을 위한 작 업을 수행한다.

    URL 클래스와 직접적인 관련이 있다.

    URL 클래스로 스트림을 개설할때,

    URL url = new URL(http://localhost:80/index.html);

    InputStream is = url.openStream();

    URLConnection클래스를 이용하면 다음과 같다.

    URL url = new URL(http://localhost:80/index.html);

    URLConnection con = url.getConnection();

    InputStream is = con.getInputStream();

    URL의 openStream()은 URLConnection으로 연결한 후 getInputStream()을 한 것과 같은 결과가 된다.

    이를 예제로 표현하면 다음과 같다.
    1.4 URLConnection 클래스
    import java.net.*;
    import java.io.*;
    public class URLConnectionMain{
    public static void main(Stringargs[]) throws MalformedURLException, IOException{
    URL url = new URL("http://java.sun.com/javase/downloads/index.jsp”);
    URLConnectioncon = url.openConnection();
    String temp;
    BufferedReaderbr;
    br= new BufferedReader(newInputStreamReader(con.getInputStream()));
    while ((temp = br.readLine()) != null) {
    System.out.println(temp);
    }
    br.close();
    }
    }
    1.4 URLConnection 클래스

    그렇다면 URL클래스의 openStream()을 사용하면 특정주소의 Stream을 개설할 수 있는데, 왜 굳이 URLConnection클래스를 사용해야 하는가?

    openStream()은 InputStream만 생성이 가능한데 반해

    URLConnection을 이용할 경우,

    InputStream뿐만이 아니라,

    OutputStream도개설할수있다.

    다음의예제를보면알수있다.
    1.4 URLConnection 클래스
    import java.net.*;
    import java.io.*;
    public class URLConnectionMain2{
    public static void main(String args[]) throws MalformedURLException, IOException{
    URL url= new URL("http://onesearch.sun.com/search/onesearch/index.jsp");
    URLConnection conn = url.openConnection();
    //출력스트림제어
    conn.setDoOutput(true);
    OutputStream os = conn.getOutputStream();
    PrintWriter out = new PrintWriter(os);
    out.println("qt=love");
    out.close();
    String temp;
    //입력스트림제어
    InputStream is = conn.getInputStream();
    InputStreamReader isr = new InputStreamReader(is);
    BufferedReader br = new BufferedReader(isr);
    while( (temp=br.readLine())!=null){
    System.out.println(temp);
    }
    br.close();
    }
    }
    1.5 URLEncoder와 URLDecoder

    운영체제마다 일부 문자를 인식하는 방식이 달라 이 를 해결하기 위해 사용하는 클래스이다.

    일반 문자열을 웹에서 통용되는 ‘x-ww-form- urlencoded’형식으로 변환하는 역할을 한다.

    대소문자, 숫자, 밑줄을 제외한 URL에 있는 모든 문자를 코드화 하는 것이다.

    정리하자면,

    아스키문자(a~z, A~Z, 1~9), ‘.’, ‘-’, ‘*’, ‘_’은그대로전달

    공백문자(‘‘) : ‘+’기호로 전환

    기타문자 : ‘%xy’와 같이 세개의 문자로 변환되며 이때 xy는 해당문자의 ASCII코드를 16진수화한 결과를 두자리의 대문자 로나타낸것이다.

    문자열을 인코딩하는 방법은 다음과 같다.
    1.5 URLEncoder와 URLDecoder
    import java.io.*;
    import java.net.*;
    public class URLEnDecoderMain{
    public static void main(String[] args) throws UnsupportedEncodingException{
    String enStr= URLEncoder.encode("자바사이트-java.sun.com", "EUC_KR");
    System.out.println("인코딩된문자열:" + enStr);
    String deStr= URLDecoder.decode(enStr, "EUC_KR");
    System.out.println("디코딩된문자열:" + deStr);
    }
    }

    설명

    윈도우 환경의 문자열 인코딩 방식인 EUC_KR을 이용해서 문자열을 인코딩하는 예제이다.
    1.6 URLClassLoader 클래스

    Jar파일이나 특정 디렉토리로 부터 클래스 및 리소스 를 로딩하기 위해 사용한다.

    목표주소는

    네트워크상의 경로일 수도 있으며

    파일디렉토리상의 경로일 수도 있다.

    디렉토리의 경우 경로의 끝에 슬래시(/)가 붙은 위치가 된다.

    JAR파일의 경우에는 JAR파일 자체가 된다

    이때 주소의 구분자는 슬래시(/)를 이용하게 된다.



    c:/javasrc/ch16/

    http://java.sun.com

    http://localhost:8080/data/java.jar

    경로에 포함된 데이터들을 URLClassLoader를 이용해서 로딩 할 수 있다.
    1.6 URLClassLoader 클래스

    ClassLoader가 로컬파일시스템의 클래스를 로딩하는 것 에 비해 URLClassLoader는 로컬과 네트워크상의 자원 들을 로딩하는 역할을 한다.

    local자원을 로딩하고 싶다면 URL 경로를 배열 형식으로 만들 어야 한다.

    URL[] arUrl = (new File(“C:/java_source\ch16”)).toURL();

    그리고 이 URL배열을 URLClassLoader를 생성할때 매개 변수 형식으로 넣어준다.

    URLClassLoader ucl = new URLClassLoader(arUrl);

    이렇게 하면 해당 디렉토리의 자원에 접근이 가능하다.

    Class c = ucl.loadClass(“Hello”);

    물론 로딩할 클래스의 이름은 알고 있어야 한다.
    1.6 URLClassLoader 클래스

    URLClassLoader를 이용한 클래스 로딩

    Hello.java
    public class Hello{
    public Hello(){}
    public String toString(){
    return "안녕하세요Hello class입니다!";
    }
    }

    URLClassLoaderMain.java
    public class URLClassLoaderMain{
    public static void main(String[] args) throws MalformedURLException, ClassNotFoundException,
    InstantiationException, IllegalAccessException{
    URL[] arURL = new File("c:/javasrc/chap16/").toURL();
    URLClassLoader ucl = new URLClassLoader(arURL);
    Class c = ucl.loadClass("Hello");
    Object obj = c.newInstance();
    System.out.println(obj.toString());
    }
    }
    1.6 URLClassLoader 클래스

    URLClassLoader를 특정파일의 InputStream개설
    public class URLClassLoaderMain{
    public static void main(String[] args) throws MalformedURLException, ClassNotFoundException, InstantiationException, IllegalAccessException{
    URL[] arURL = new File("c:/javasrc/chap16/").toURL();
    URLClassLoader ucl = new URLClassLoader(arURL);
    Class c = ucl.loadClass("Hello");
    Object obj = c.newInstance();
    System.out.println(obj.toString());
    }
    }
    1.6 URLClassLoader 클래스

    URLClassLoader의 getResourceAsStream()을 이 용해서 리소스(파일) 읽기

    URLClassLoader를 특정파일의 InputStream개설
    public class URLClassLoaderMain2{
    public static void main(String[] args) throws MalformedURLException, ClassNotFoundException, InstantiationException, IllegalAccessException, IOException{
    URL[] arURL = {new File("c:/javasrc/chap16/").toURL()};
    URLClassLoader ucl = new URLClassLoader(arURL);
    InputStream is = ucl.getResourceAsStream("Hello.java");
    InputStreamReader isr = new InputStreamReader(is);
    int c;
    while( (c = isr.read()) != -1 ){
    System.out.print((char)c);
    }
    isr.close();
    }
    }
    2 Socket의 기본
    2.1 소켓통신의 기본

    소켓(Socket)이란

    네트워크로 연결된 두 대의 호스트간에 통신을 위한 양쪽 끝을 의미한다.

    소켓(Socket)의 역할

    컨넥션(Connection)을 개설하기 위한 도구

    전화기나 무전기정도로 생각하면 된다.
    2.1 소켓통신의 기본

    통신을 하기 위해서는 상대의 주소와 포트가 필요하 며, 주소와 포트를 이용해서 소켓을 개설할 수 있다.

    소켓을 IP만을 이용하여 통신을 한다면 하나의 IP에 오직 하나의 통신 밖에는 개설할 수가 없기 때문에 port를 이 용한다.
    2.1 소켓통신의 기본

    Well known Port

    1~1024는 잘 알려진 포트라고 해서 시스템 내부에서 사 용하는 포트이기 때문에 일반사용자는 되도록 사용하지 않 도록 권장하고 있다.

    대표적 Well Known Port

    7 : Echo

    13 : DayTime

    21 : Ftp

    23 : Telnet

    25 : SMTP

    80 : HTTP
    2.2 TCP와 UDP 통신

    소켓통신의 두 가지 방법

    신뢰성 프로토콜 : TCP

    비 신뢰성 프로토콜 : UDP
    2.2 TCP와 UDP 통신

    TCP : Transfer Control Protocol

    마치 전화와 같은 방식으로 동작

    전화번호를 알아야 통화를 할 수 있는 것 처럼 상대의 IP 와 port를 알아야 연결을 요청

    전화를 걸더라도 상대방이 받아야 통화를 하는 것 처럼 서버가 응답을 받아주지 않으면 대기해야 한다.

    어느 순간에 포기해야 하는 것도 동일하다.

    연결되었다면 양방향 통신이 가능하다.

    계속해서 소켓을 통해서 데이터 송수신이 가능하다.

    데이터의 확인 절차도 거치게 된다.

    만약 전화가 잘 들리지 않는 다면 상대방은 뭐라고요?라고 하 는 것 처럼 TCP 프로토콜도 자료를 받지 못했다면 다시 요청 하는 메커니즘이 있다.
    2.2 TCP와 UDP 통신
    양방향 통신
    TCP 통신의 개념
    Client
    Server
    Port
    IP: 203.252.134.117
    IP: 203.252.134.101
    8080
    Socket
    Socket
    Port
    3456
    Request
    Accept
    TCP
    TCP
    2.2 TCP와 UDP 통신

    UDP : User Datagram Protocol

    마치 편지와 같은 방식으로 동작한다.

    편지를 보낼때 내용을 쓰고 봉투에 주소를 쓴다음 보낸다.

    편지가 도착했는지는 알 수가 없다.

    이러한 원리가 동일하게 적용된다.

    먼저 데이터를 생성한 후 상대방의 주소와 자신의 주소를 기 록하고 보내버리면 그 데이터를 받았는지 확인할 방법은 없다.

    단지 보냈다는 사실만 존재한다.

    UDP 통신은 상대방과 연결되어 있는 개념이 아니다.

    자신의 로컬머신에서 소켓을 개설하고 데이터를 랜카드에 실 어 보내는 개념이다.

    받는이의 입장에서는 편지함을 열 때까지 알수 없는 것 처럼 UDP소켓을 통해서 포트를 열어서 보기 전까지 데이 터가 도착했는지를 알 수가 없다.
    2.2 TCP와 UDP 통신
    UDP 통신의 개념
    Client
    Server
    Port
    IP: 203.252.134.117
    IP: 203.252.134.101
    8080
    Port
    3456
    Send
    Receive
    Missing
    DatagramSocket
    DatagramSocket
    DatagramPacket
    2.2 TCP와 UDP 통신

    TCP VS. UDP
    신뢰성
    속도
    TCP


    UDP


    3 TCP Client Programming
    3.1 Echo Client Program

    TCP 소켓을 이용해서 Echo 클라이언트 프로그램을 테스트 해보자

    네트워크 통신을 위해서는 서버와 클라이언트가 존재 해야 한다.

    여기서는 먼저 클라이언트를 테스트 해보도록 하겠다.

    일반적으로 네트워크에 존재하는 서버들은 7번 포트로 Echo데몬을 운영하고 있다.

    이를 이용해서 테스트 해보도록 하겠다.
    3.1 Echo Client Program
    import java.io.*;
    import java.net.*;
    public class EchoClientMain{
    public static void main(String[] args) throws IOException{
    String IP =
    “java.sun.com";
    int port = 7;
    String data = "Hello World";
    Socket socket= new Socket(IP, port);
    PrintWriterpw = new PrintWriter(socket.getOutputStream(), true);
    pw.println(data); //데이터보내기
    BufferedReaderbr;
    br= new BufferedReader(newInputStreamReader(socket.getInputStream()));
    String reply = br.readLine(); //응답받기
    System.out.print("Echo: " + reply);
    br.close();
    pw.close();
    socket.close();
    }
    }
    3.2 DayTime Client Program

    일반적 서버에서는 서버의 시간을 서비스해주는 DayTime서버 프로그램을 운영한다.

    13번 포트에서 서비스를 하며,

    클라이언트 프로그램으로 접속을 하면 바로 해당 서버의 시간을 보내준다.

    이 역시 예제를 통해 살펴 보겠다.
    3.2 DayTime Client Program
    import java.io.*;
    import java.net.*;
    public class DayTimeClientMain{
    public static void main(String[] args) throws IOException {
    String IP =
    “localhost";
    int port = 13;
    Socket socket= new Socket(IP, port);
    BufferedReaderbr;
    br= new BufferedReader(new InputStreamReader(socket.getInputStream()));
    String replyTime= br.readLine(); //서버로부터시간받기
    System.out.print(args[0] + " Server Time: " + replyTime);
    br.close();
    socket.close();
    }
    }
    3.3 HTTP Client Program-Socket

    웹서버는 80포트로 웹문서를 서비스하는 서버 프로 그램이다.

    Echo나 Daytime은 간단한 메커니즘에 의해서 데이터를 내려 받을 수 있으나,

    웹서버는 고유의 방식을 가지고 있다.

    이러한 고유의 방식을 프로토콜이라고 한다.

    웹서버가 사용하는 프로토콜은 http이다.
    3.3 HTTP Client Program-Socket

    웹서버가 사용하는 프로토콜은 http이다.

    다음의 예제에서는 HTTP 1.1에서 GET방식으로 파일을 전송받도록 한다.

    이를 위해서는 웹서버에 연결한 후 GET 메시지를 다음과 같이 전송하면 된다.
    GET /파일명HTTP/1.0 \r\n
    Host: 호스트명\r\n
    /r\n

    GET 다음과 파일명 다음의 공백에 주의해야 한다.

    1.0 메시지는 다음과 같다.
    GET /파일명HTTP/1.0 \r\n
    /r/n

    다음의 예제에서 확인해 보도록 하겠다.
    3.3 HTTP Client Program-Socket
    import java.io.BufferedInputStream;
    import java.io.BufferedOutputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.net.Socket;
    public class HttpClientMain{
    public static void main(String[] args) throws IOException {
    Socket socket= new Socket("java.sun.com", 80);
    BufferedInputStreambis;
    bis= new BufferedInputStream(socket.getInputStream());
    PrintWriterout = new PrintWriter(socket.getOutputStream());
    out.print("GET/index.htmlHTTP/1.0\r\n");
    out.print("\r\n");
    out.flush();
    FileOutputStreamfs= new FileOutputStream("index.html");
    BufferedOutputStreambos= new BufferedOutputStream(fs);
    intc;
    while( (c = bis.read()) != -1 ){
    bos.write(c);
    }
    out.close();
    bis.close();
    bos.close();
    socket.close();
    }
    }
    3.3 HTTP Client Program-Socket
    import java.io.*;
    import java.net.*;
    public class HttpClientMain2{
    public static void main(String[] args) throws IOException {
    Socket socket= new Socket("java.sun.com", 80);
    BufferedInputStreambis;
    bis= new BufferedInputStream(socket.getInputStream());
    PrintStreamout = new PrintStream(socket.getOutputStream());
    out.print("GET/index.htmlHTTP/1.1\r\n");
    out.print("Host: index.html\r\n");
    out.print("\r\n");
    out.flush();
    FileOutputStreamfs= new FileOutputStream("index.html");
    BufferedOutputStreambos= new BufferedOutputStream(fs);
    int c;
    while((c= bis.read()) != -1){
    bos.write(c);
    }
    out.close();
    bis.close();
    bos.close();
    socket.close();
    }
    }

    소켓 대신 다른 방식으로 웹서버에 접근을 해보도록 한다.

    이에는 HttpURLConnection클래스를 이용한다.

    HttpURLConnection 생성
    URL url = new URL(“http://kr.yahoo.com/index.html”);
    URLConnectionconn= url.openConnection();
    HttpURLConnectionhttpConn= (HttpURLConnection)conn;

    줄이면 이렇게도 가능하다.
    URL url = new URL(“http://kr.yahoo.com/index.html”);
    HttpURLConnectionhttpConn= (HttpURLConnection) url.openConnection();

    생성된 객체를 이용해서 GET방식 요청은 다음과 같다.
    httpConn.setRequestMethod(
    “GET”);
    3.4 HTTP Client Program-URLConnection
    3.4 HTTP Client Program-URLConnection
    import java.io.*;
    import java.net.*;
    public class HttpClientMain3{
    public static void main(String[] args) throws IOException {
    URL url= new URL(“http://kr.yahoo.com/index.html”);
    HttpURLConnection httpConn = (HttpURLConnection)url.openConnection();
    httpConn.setRequestMethod("GET");
    InputStreamis = httpConn.getInputStream();
    BufferedInputStream bis = new BufferedInputStream(is);
    FileOutputStream fs = new FileOutputStream(“yahoo3.html”);
    BufferedOutputStream bos = new BufferedOutputStream(fs);
    int c;
    while( (c = bis.read()) != -1 ){
    bos.write(c);
    }
    bis.close();
    bos.close();
    }
    }
    4 TCP Echo Server & Client
    4.1 TCP ServerSocket

    서버에서 다른 소켓의 응답을 받아주기 위해서 필요한 것이 ServerSocket이다.

    ServerSocket은 클라이언트와 통신할 수 있는 서버용 Socket을 만들어 준다.

    ServerSocket의 개설은 서버의 특정 포트를 서비스 하는 의 미를 담고 잇다.

    그렇기 때문에 ServerSocket을 생성하기 위해서는 서비스할 포트가 필요하게 된다.

    ServerSocket의 생성과 접속 대기
    ServerSocket ss = new ServerSocket(10000);
    Socket socket = ss.accept();//클라이언트의접속을대기한다.

    Socket을 전화기에 비유하였다면,

    ServerSocket은 약간 억지스럽지만 클라이언트간의 통신을 연결해 주는 중계기의 역할을 한다고 이해하면 된다.
    4.1 TCP ServerSocket

    ServerSocket의 accept()에서 리턴된 서버용 Socket

    클라이언트 Socket으로 ServerSocket에 연결요청할 때 accept()가 반응한다.

    ServerSocket이 accept()할 때 리턴된 서버용 Socket은 해당 클라이언트와 통신할 수 있는 유일한 수단이다.

    accept()할 때 리턴된 서버용 Socket은 자동으로 포트 (Port)를 할당 받는다.
    4.1 TCP ServerSocket

    서버용 Socket의 생성 및 스트림 개설
    ServerSocket ss = new ServerSocket(10000);
    Socket socket = ss.accept();
    InputStream is = socket.getInputStream();
    OutputStream os = socket.getOutputStream();

    accpet()를 통해서 할당되는 socket은 자동으로 포트가 할 당된다 – 주의할것!

    스트림이 생성되었다면 클라이언트가 전송한 데이터를 먼저 읽은 후 데이터를 출력스트림으로 다시 전송해주면 에코서버 가 완성된다.
    4.1 TCP ServerSocket
    4343
    Socket
    TCP ServerSocket의 동작 원리
    10000
    Socket
    Client1
    2302









    ServerSocket
    Socket
    Client1
    Client2
    Client3
    Internet
    4344
    4345
    Echo Server
    Echo Clients
    accept()
    Socket
    Client2
    3325


    Socket
    Client3
    4567


    4.2 TCP Echo Server
    import java.io.*;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.util.Date;
    public class EchoServerMain{
    public static void main (String args[]) throws IOException{
    ServerSocketss= new ServerSocket(30000);
    while (true) {
    Socket socket= ss.accept();
    System.out.println(newDate().toString() + ":" + socket.toString());
    BufferedReaderbr= new BufferedReader(new InputStreamReader(socket.getInputStream()));
    BufferedWriterbw= new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
    String temp = br.readLine();
    bw.write(temp+ " 1\n"); bw.flush();
    bw.write(temp+ " 2\n"); bw.flush();
    bw.write(temp+ " 3\n"); bw.flush();
    bw.write(temp+ " 4\n"); bw.flush();
    br.close();
    bw.close();
    socket.close();
    }
    //ss.close();
    }
    }
    4.2 TCP Echo Server

    설명

    Echo 서버 프로그램을 시작하기 위해서는 ServerSocket 부터 생성해야 한다.

    일정 포트만 주어지면 그 주소에 해당 포트를 개설한 후 클 라이언트 Socket의 접속 요청을 받아 들일 준비를 하게 된 다.

    그리고 항상 접속요청을 받아 들이도록 while문에서 accept()를 무한루프를 돌면서 실행하고 있다.

    클라이언트가 접속하는 순간 통신 할 수 있는 Socket을 반 환하게 된다.
    4.2 TCP Echo Server

    설명(계속)

    생성된 socket을 이용해서 I/O stream을 개설한다.

    그리고 클라이언트로 부터 데이터를 readLine()메서드를 이 용해서 읽어내고 있다.

    String temp = br.readLine();

    읽은 데이터를 다시 클라이언트로 전송한다.

    bw.wirte(temp + “1\n”); bw.flush();

    bw.wirte(temp + “2\n”); bw.flush();

    bw.wirte(temp + “3\n”); bw.flush();

    bw.wirte(temp + “4\n”); bw.flush();

    flush()메서드는 스트림에 기록한 데이터를 바로 전송하기 위해 사용 한다.

    write에서 \n을 사용한 이유는 클라이언트에서 줄 단위로 읽어 들이 기 때문에 줄단위 표시를 해준 것이다.
    4.3 TCP Echo Client
    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.OutputStreamWriter;
    import java.net.Socket;
    public class EchoClientMain2{
    public static void main (String args[]) throws IOException{
    Socket socket= new Socket("localhost", 30000);
    OutputStreamWriterosw= new OutputStreamWriter(socket.getOutputStream());
    BufferedWriterbw= new BufferedWriter(osw);
    bw.write("HelloWorld\n");
    bw.flush();
    InputStreamReaderisr= new InputStreamReader(socket.getInputStream());
    BufferedReaderbr= new BufferedReader(isr);
    String temp = "";
    while((temp= br.readLine())!= null){
    System.out.println(temp);
    }
    br.close();
    bw.close();
    socket.close();
    }
    }
    4.3 TCP Echo Client

    설명

    Echo 클라이언트는 당연히 접속과 동시에 메아리를 보내는 부분 과 받는 부분으로 되어 있다.

    클라이언트에서 서버의 주소와 포트를 이용해서 Socket을 생성하 면 자동으로 서버측의 ServerSocket의 accept()부분을 활성화시 키게 된다.

    Socket이생성되었다면그다음작업은스트림을개설한수메시 지를 전송하고 에코의 형식으로 메시지를 되돌려 받는 것으로 작 업이 마무리 된다.
    4.4 TCP Echo 테스트

    실행

    서버 실행

    클라이언트 실행
Designed by Tistory.