Scalable Vector Graphics (SVG) 1.1 [W3C Recommendation]은 2차원 그래픽을 기술하는 언어이다.
일부 래스터 그래픽 기능도 사용할 수 있지만, 기본적으로는 벡터 그래픽 언어이다. SVG는 실질적이고
유연한 그래픽 포맷을 XML에 제공한다는 목표를 갖고 있으며, 이 부분에서 성공을 거두었다.
SVG의 기능에는 중첩된 변형, 클리핑 경로, 알파 마스크, 래스터 필터 효과, 템플릿 객체 등이 포함되어 있고,
확장성도 우수하다. SVG는 애니메이션, 줌과 플래닝 뷰, 다양한 그래픽 명령어, 그룹핑, 스크립팅, 하이퍼링크,
구조화 된 메타데이터, CSS, 특화된 DOM 수퍼세트, 기타 XML 문서로의 임베딩을 지원한다. SVG의 일부
디자인은 벡터 경로가 개별 애트리뷰트 내에서 공간 한정적인 숫자 리스트로 표현된다는 점에서 논란이
되고 있지만, 메인 SVG는 가장 광범위하게 XML 애플리케이션들을 포용하고 있다. 이 스팩은 여러 언어들로
번역되었다.

SVG 1.1은 XHTML 1.1+과 비슷한 방식으로 모듈화 되었다. Mobile SVG Profiles: SVG Tiny and SVG Basic
[W3C Recommendation]에서는 모바일 폰과 PDA에 적합한 감소된 SVG 모듈을 정의하고 있다. SVG 1.2 [개발중]는 SVG를 완벽한 애플리케이션 플랫폼으로 만드는 새로운 툴과 그래픽 포맷을 추가했다.


import java.awt.event.*; // 각 컴포넌트에 대한 이벤트를 작성하기 위한 패키지
import javax.swing.*; // 스윙 컴포넌트를 사용하기위한 패키지
import java.net.*; // 네트워크 클래스를 사용하기 위한 패키지
import java.io.*; // 입출력 스트림을 사용하기 위한 패키지

 

public class MailSender extends JFrame implements ActionListener{

    // 보낸이, 받는이, 제목을 입력 받기 위한 텍스트 상자

    //private JTextField from, to, suject;

    private JTextField from, to, subject;

    // 메일 본문 작성으로 위한 텍스트 상자
    private JTextArea data;

    // 메일보내기 버튼, 모든 텍스트상자 지우기버튼, 종료 버튼
    private JButton send, clear, exit;

    // SMTP서버에 접속하기 위한 서버주소와 도메인을 담는 변수
    private String server, domain;

   

    // MailSender 생성자(객체 생성시 자동으로 호출)

 //public void MailSender(String server, String domain) { 생성자는 반환형이 없음

    public MailSender(String server, String domain) {

         // 부모 클래스의 생성자를 호출해 창의 제목을 설정
        //Super("send Mail");

        super("send Mail");

        // 생성자로 넘어온 SMTP서버의 주소와 도메인을 각 변수에 할당
        this.server = server;
        this.domain = domain;
  

        // 각 컴포넌트를 생성해 이벤트연결
        from = new JTextField();
        to = new JTextField();
        subject = new JTextField();
        data = new JTextArea();
        send = new JButton("SEND");
        send.addActionListener(this);
        clear = new JButton("CLEAR");
        clear.addActionListener(this);
        exit = new JButton("EXIT");
        exit.addActionListener(this);

 

        // 각 컴포넌트를 패널에 위치 시킴

        JPanel c = new JPanel(new PositionLayout());
        c.add("5%, 2%, 20%, 9%", new JLabel("FROM: "));
        c.add("25%, 2%, 95%, 9%", from);
        c.add("5%, 11%, 20%, 18%", new JLabel("To: "));
        c.add("25%, 11%, 95%, 18%", to);
     //c.add("5%, 20%, 20%, 27%", new JLable("SUBJECT: "));

        c.add("5%, 20%, 20%, 27%", new JLabel("SUBJECT: "));
     //C.add("25%, 20%, 95%, 27%", subject);

        c.add("25%, 20%, 95%, 27%", subject);
        c.add("5%, 29%, 20%, 34%", new JLabel("DATA: "));
        c.add("5%, 35%, 95%, 85%", new JScrollPane(data));
        c.add("8%, 88%, 28%, 95%", send);
        c.add("40%, 88%, 60%, 95%", clear);
        c.add("72%, 88%, 92%, 95%", exit);
 

         // 컴포넌트들을 담고 있는 패널을 프레임에 추가 시킴
      //SetContentPane(c);

        setContentPane(c);

        // 기본 닫힘명령 설정
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        // 프레임의 사이즈 설정
        setSize(400, 450);

        // 프레임을 띄움.
        setVisible(true);
    }

    // 이벤트 핸들러
    public void actionPerformed(ActionEvent e){

        // 이벤트를 발생한 객체를 가져옴
        Object c = e.getSource();

        // 서버로 부터 수신된 응답 메시지를 담기위한 변수
        String incoming;

 

        // exit버튼을 눌렀을경우 프레임을 닫고 프로그램 종료

        if(c==exit) {
         //setvisible(false);

            setVisible(false);
            System.exit(0);

        // clear버튼을 눌렀을경우 모든 텍스트 상자 초기화
        }else if(c==clear) {
            from.setText("");
            to.setText("");
            subject.setText("");
            data.setText("");

        // send버튼을 눌렀을 경우 SMTP서버로 접속 후 메일을 보냄.
        }else if(c==send) {
            try{

                // SMTP서버에 접속 하기위한 소켓 생성(SMTP서버 Def.Port:25)
                Socket s = new Socket(server, 25);

                // 서버로 송신하기 위한 출력 스트림을 얻어온다.
                PrintStream out = new PrintStream(s.getOutputStream(), true);

                // 서버로 부터 수신된 데이터를 받기위한 입력 스트림을 얻어온다.
             //BufferedReader in = new BufferedReader(new InputStreamReader(s.GetInputStream()));

                BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));

 

                // 서버로 연결 요청 메시지를 송신한다.
                out.println("HELO"+domain);

                // 서버로 부터의 응답메시지를 수신 한다.
                incoming = in.readLine();

 

                // 서버로 메일 보낸이에 대한 정보를 송신 한다.
                out.println("MAIL FROM: < "+from.getText()+" >");

                // 서버로 부터의 응답메시지를 수신 한다.
                incoming = in.readLine();

               

                // 서버로 메일 받는이에 대한 정보를 송신 한다.
                out.println("RCPT TO:< "+to.getText()+" >");

                // 서버로 부터의 응답메시지를 수신 한다.
                incoming = in.readLine();

               

                // 서버로 데이터를 보낸다는 메시지를 송신한다.
                out.println("DATA");

                // 서버로 부터의 응답메시지를 수신 한다.
                incoming = in.readLine();

           

                // 서버로 메일 제목을 송신 한다.
                out.println("Subject: "+subject.getText());

                // 서버로 부터의 응답메시지를 수신 한다.
                incoming = in.readLine();

     

                // 본문 내용의 끝에 캐리지리턴값과 라인피드값을 합친 내용을 서버에 전송
                String msg = data.getText();
               out.println(msg+"\r\n.\r\n");

               // 서버로 부터의 응답메시지를 수신 한다.
               incoming = in.readLine();

               // 서버로 종료한다는 메시지를 송신 한다.
               out.println("QUIT");

             

               // 각 텍스트 상자들의 값을 초기화 한다.

               to.setText("");
               subject.setText("");
               data.setText("");

           // try{}구문에서 예외 발생시 예외 처리 부분..
           }catch(Exception ex){
               ex.printStackTrace();

           }
        }

    }

    public static void main(String args[]) {

        // 프로그램을 실행시 아규먼트 2개가 넘어오지 않았을경우
     //if(args.length(2)){  length는 메소드가 아님

        if(args.length != 2){

            // SMTP서버의 주소와 도메인을 객체에 생성자를 통해 객체 생성
            new MailSender("localhost", "mokpo.ac.kr");
        }else{ // 프로그램을 실행시 아규먼트가 넘어 왔다면

            // SMTP서버의 주소와 도메인을 객체에 생성자를 통해 객체 생성
         //new MailSender(args[0], arg[1]);

            new MailSender(args[0], args[1]);
        }
    }
}


/*
* @(#)PositionLayout.java       98/02/18
*      - written by 최종명(CHOI JONG MYUNG)
*
* Copyright by Choi Jong Myung, CS Dept. of Soongsil Univ., Seoul, Korea.
* All rights reserved.
*
* This software is the confidential and proprietary information
* of Choi Jong Myung.  You shall not disclose such Confidential
* Information and shall use it only non-commercial purpose.
*/

import java.awt.*;
import java.util.*;

public class PositionLayout implements LayoutManager {
    Vector  positions = new Vector(10);
    Vector  components = new Vector(10);
    private  boolean   leftRatio;
    private  boolean   topRatio;
    private  boolean   rightRatio;
    private  boolean   bottomRatio;

    public void addLayoutComponent(String p, Component c) {
        positions.addElement(p);
        components.addElement(c);
    }


    public void removeLayoutComponent(Component c) {

        int i = components.indexOf(c);
        if(i != -1) {
            positions.removeElementAt(i);
            components.removeElementAt(i);
        }
    }


    public Dimension preferredLayoutSize(Container parent) {
        Dimension dim = new Dimension(0,0);
        int ncomponents = parent.getComponentCount();
        Insets  insets = parent.getInsets();
        dim.width += insets.left + insets.right;
        dim.height += insets.top + insets.bottom;

        int maxW = dim.width;
        int maxH = dim.height;
        for(int i = 0; i < ncomponents; i++) {
            Component  com = parent.getComponent(i);
            if(com.isVisible() == false)
                continue;
            int  w = com.getPreferredSize().width + dim.width;
            int  h = com.getPreferredSize().height + dim.height;
            if( w > maxW )
                maxW = w;
            if( h > maxH )
                maxH = h;
        }
        //System.out.println("prefer Size: width="+maxW+"\t\theight="+maxH);
        return  new Dimension(maxW, maxH);
    }


    public Dimension minimumLayoutSize(Container target) {
        return  target.getSize();
    }


    public void layoutContainer(Container target) {
        Insets insets = target.getInsets();
        int    ncomponents = target.getComponentCount();
        Dimension d = target.getSize();
        d.width  -= insets.left + insets.right;
        d.height  -= insets.top + insets.bottom;
        int  startX =0, startY =0, endX =0, endY =0;
        int  left = 0, top =0, right = 0, bottom =0;
        for(int i=0; i< ncomponents; i++) {
            Component comp = target.getComponent(i);
         StringTokenizer token = new StringTokenizer((String)positions.elementAt(i), ", \t");
            String  leftSt = token.nextToken();
            if(leftSt.endsWith("%")) {
                leftRatio = true;
                left  = Integer.parseInt(leftSt.substring(0, leftSt.length()-1));
            } else {
                left  = Integer.parseInt(leftSt);
            }

            String  topSt = token.nextToken();
            if(topSt.endsWith("%")) {
                topRatio = true;
                top  = Integer.parseInt(topSt.substring(0, topSt.length()-1));
            } else {
                top  = Integer.parseInt(topSt);
            }

            String  rightSt = token.nextToken();
            if(rightSt.endsWith("%")) {
                rightRatio = true;
                right  = Integer.parseInt(rightSt.substring(0, rightSt.length()-1));
            } else {
                right  = Integer.parseInt(rightSt);
            }

            String  bottomSt = token.nextToken();
            if(bottomSt.endsWith("%")) {
                bottomRatio = true;
                bottom  = Integer.parseInt(bottomSt.substring(0, bottomSt.length()-1));
            } else {
                bottom  = Integer.parseInt(bottomSt);
            }

            if(leftRatio)
                startX = (d.width * left)/100;
            else
                startX = left;

            if(topRatio)
                startY = (d.height * top)/100;
            else
                startY = top;

            if(rightRatio)
                endX = (d.width * right)/100;
            else
                endX = right;

            if(bottomRatio)
                endY = (d.height * bottom)/100;
            else
                endY = bottom;

            if(startX > endX) {
                int temp = startX;
                startX = endX;
                endX = temp;
            }
            if(startY > endY) {
                int temp = startY;
                startY = endY;
                endY = temp;
            }
            int  w = endX - startX;
            int  h = endY - startY;
            comp.setBounds(startX+insets.left, startY+insets.top, w, h);
            topRatio = false;
            leftRatio = false;
            rightRatio = false;
            bottomRatio = false;
        }
    }

    public String toString() {
        return getClass().getName();
    }
}

+ Recent posts