02 2일째....

프로그래밍/Java 2007. 11. 27. 13:48 Posted by galad


/******************************************************************************
*   파일      : URLConnectionOutput.java
*   용도      : URLConnectionOutput test
*   작성자   : 성홍제
*   작성일   : 2006. 08. 07
*   Version : 1.0
******************************************************************************/

import java.net.*;
import java.io.*;

public class URLConnectionOutput
{
    public static void main(String[] args)
    {
        try
        {
            URL url = new URL("http://search.empas.com/search/all.html");
            URLConnection conn = url.openConnection();
           
            // URLConnection 개체가 output도 가능하게 하겠다는 설정
            conn.setDoOutput(true);
           
            System.out.println("검색어를 입력하세요:");
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            String strKeyword = br.readLine();
           
            OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
            wr.write("a=w&s=&f=&z=A&q="+URLEncoder.encode(strKeyword,"euc-kr"));
            wr.flush();
            wr.close();
           
            String line=null;
            br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
            PrintWriter pw = new PrintWriter(new FileWriter("result.html"));
           
            while ((line = br.readLine()) != null)
            {
                System.out.println(line);
                pw.println(line);
            }
       
            pw.close();
            br.close();           
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
}


★ URLEncoder,URLDecoder

① URLEncoder클래스
데이터를 웹서버에서 요구하는 데이터 형식으로 바꾸어 줌
 (x-www-form-urlencoded 형식)


변환규칙
아스키문자(a~z, A~Z, 1~9), ‘,’, ‘-’, ‘*’, ‘_’ : 그대로 전달
공백문자 : ‘+’기호로 전환
기타문자 : ‘%xy’ 같은 형식으로 변환(xy: ASCII코드를 16진수화한 결과)


하나의 static 멤버 메서드를 갖음
  public static String encode(String s)  Deprecated.
  public static String encode(String s,String charset. )


② URLDecoder클래스
X-www-form-urlencoded 형식으로 인코딩된 데이터를 디코딩


하나의 static 멤버메서드를 갖음
Public static String decode(String d)



/******************************************************************************
*   파일      : URLEnDecoderTest.java
*   용도      : URLEnDecoderTest test
*   작성자   : 성홍제
*   작성일   : 2006. 08. 07
*   Version : 1.0
******************************************************************************/

import java.net.*;

public class URLEnDecoderTest
{
    public static void main(String [] args) throws Exception
    {
        String str, encodedStr, decodedStr;
       
        str = "우리가 사랑하는 모든 사람";
       
        // euc-kr로 인코딩
        encodedStr = URLEncoder.encode(str,"euc-kr");
        decodedStr = URLDecoder.decode(encodedStr,"euc-kr");
       
        System.out.println("str  :  " + str);
        System.out.println("encodedStr  :  " + encodedStr);
        System.out.println("decodedStr  :  " + decodedStr);
    }
}



★ 포트(Port)

 포트 : 하나의 주소에서 동시 작업, 여러 서비스 이용 용이
 0~1023 사이의 포트는 시스템에 예약
 사용자가 임의의 사용 포트 :1024~65535까지의 포트
 미리 할당되어 있는 포트

하나의 포트는 하나의 프로그램만이 사용가능.

동시에 2개 이상의 프로그램이 같은 포트를 사용하려하면 충돌이 발생.


★ 소켓(Socket)

① 상호 통신을 위해 사용되는 일시적인 객체
② 통신을 하기 위해 사용되는 TCP 계층
  소켓 & 포트 : 두 개의 프로그램이 하부 네트워크에 신경 쓰지 않고 통신하기 위한

    소프트웨어적인 메커니즘(mechanism)
③ 두 개의 프로그램 사이에 통신을 위한 채널이 형성
  양방향 통신이 이루짐
  서버 :  자신의 포트 번호로 요청 대기(listen) => 요청 확인(accept) => 해당 서비스 수행
④ 소켓의 기본적인 일
  원격기계에 접속
  데이터를 보냄
  연결끊음
  포트에 바인드
  들어오는 데이터에 귀를 기울임
  바인드된 포트를 통해 들어오는 원격 기계 접속요청 받음   
⑤ 가상회선 마련  : 포트와 소켓 이용
  TCP의 연결기반 서비스를 제공 
  각 TCP 애플리케이션은 고유한 포트번호를 가진 포트를 가짐. 
  가상회선을 확보 
  TCP 층은 소켓들을 마련하고 있다가, 그 소켓을 통해 들어온 요청을 전달할 표적 애플리케이션의 포트에 연결.  

   1. 서버 :  4444번 포트에 대해  계속 클라이언트의 요청대기(Listen)
   2. 클라이언트 : 4444번 포트를 통해 서버로 서비스 요청.
   3. 서버 / 클라이언트 프로그램은 각각이 사용하는 포트(소켓)을 연결
       => 하나의 논리적인 채널을 생성
   4. 서버:  결과를 클라이언트가 사용하는 포트(예에서는1234)를 통해 전달


/******************************************************************************
*   파일      : EchoServer.java
*   용도      : EchoServer test
*   작성자   : 성홍제
*   작성일   : 2006. 08. 07
*   Version : 1.0
******************************************************************************/

import java.net.*;  
import java.io.*;  
   
public class EchoServer
{  
   
    public static void main(String[] args)
    {
        ServerSocket server = null;
        Socket sock = null;
        BufferedReader br = null;
        PrintWriter pw = null;
       
        try
        {
            // 서버 소켓 생성 - 서버가 사용할 포트 번호
            server = new ServerSocket(10001);
           
            while(true)
            {
                System.out.println("접속을 기다립니다.");
               
                // 클라이언트의 접속을 기다린다. 접속한 후에 다음 라인으로 넘어간다.
                sock = server.accept();
               
                // 접속한 컴퓨터의 IP주소를 얻는다. - 소켓에 모든 정보가 들어있다.
                InetAddress inetaddr = sock.getInetAddress();
                System.out.println(inetaddr.getHostAddress() + " 로 부터 접속하였습니다.");
               
                // 역시 소켓에서 Input, OutputStream을 얻어온다.
                InputStream in = sock.getInputStream();
                OutputStream out = sock.getOutputStream();
               
                br = new BufferedReader(new InputStreamReader(in));
                pw = new PrintWriter(new OutputStreamWriter(out));           
               
                String line = null;
               
                // 한줄씩 읽어와서
                while((line = br.readLine()) != null)
                {  
                    // 화면에 출력하고
                    System.out.println("클라이언트로 부터 전송받은 문자열 : " + line);
                   
                    // 다시 그대로 클라이언트에 돌려준다.
                    pw.println(line);
                    pw.flush();
                }  
            }
        }

        catch(SocketException e) // 클라이언트가 강제 종료 시 서버에서 예외 발생하는 것을 처리
        {           
            System.out.println("클라이언트 강제 종료");
        }
        catch(Exception e)
        {  
            //System.out.println(e);
            e.printStackTrace();
        }
        finally
        {
            try
            {
                // 소켓 닫기 전에 먼저 스트림부터 닫는다.               
                pw.close();
                br.close();
                sock.close();
            }
            catch(Exception e)
            {
                e.printStackTrace();
            }
        }
    } // main  
}    



/******************************************************************************
*   파일      : EchoClient.java
*   용도      : EchoClient test
*   작성자   : 성홍제
*   작성일   : 2006. 08. 07
*   Version : 1.0
******************************************************************************/

import java.net.*;    
import java.io.*;    
   
public class EchoClient
{    
   
    public static void main(String[] args)
    {  
        Socket sock = null;
        BufferedReader keyboard = null;
        PrintWriter pw = null;
        BufferedReader br = null;
       
        try
        {
            // 클라이언트 소켓 생성 - 서버의 IP주소와 서버 프로그램의 포트번호

            // 생성과 동시에 연결한다.
            sock = new Socket("61.109.232.156", 10001);
           
            keyboard = new BufferedReader(new InputStreamReader(System.in));
           
            pw = new PrintWriter(new OutputStreamWriter(sock.getOutputStream()));
            br = new BufferedReader(new InputStreamReader(sock.getInputStream()));
           
            String line = null;
           
            // 키보드로부터 메시지 입력 받음.
            while((line = keyboard.readLine()) != null)
            {
                if(line.toLowerCase().equals("quit"))
                    break;
               
                // 서버로 보낸다.
                pw.println(line);
                pw.flush();
               
                // 서버에서 되돌려보낸 문자열을 읽는다.
                String echo = br.readLine();
                System.out.println("서버 로부터 전달받은 문자열 :" + echo);
            }
        }
        catch(Exception e)
        {  
            System.out.println(e);
        }
        finally
        {
            try
            {
                br.close();
                pw.close();
                sock.close();
            }
            catch(Exception e)
            {
                e.printStackTrace();
            }
        }
    } // main  
}    



'프로그래밍 > Java' 카테고리의 다른 글

04 UDP  (0) 2007.11.27
03 졸려....  (0) 2007.11.27
01 Network 첫시간...  (0) 2007.11.27
05 문자 단위 입출력  (0) 2007.11.27
04 ObjectOutputStream / ObjectInputStream 클래스  (0) 2007.11.27