예전엔 byte가 깨질거 고려해서 hex string으로 변환해서 사용했었는데.. 모바일 쪽에서는 base64를 사용하는 곳이 있는듯 싶다. 뭐 사용하기 나름이니까.. 쩌ㅃ~

Base64로 인코딩된 문자열을 byte array로 디코딩 해준다.
public static byte[] base64Decode(String source) {
       byte[] buffer = null;
   
       BASE64Decoder base64Decoder     = new BASE64Decoder();
       ByteArrayInputStream  in     = new ByteArrayInputStream(source.getBytes());
       ByteArrayOutputStream out     = new ByteArrayOutputStream();

       try {
           base64Decoder.decodeBuffer(in, out);
       } catch (Exception e) {
           e.printStackTrace();
       }
       buffer = out.toByteArray();
       return buffer;
}

'java > util' 카테고리의 다른 글

[java] - byte array to image  (0) 2010.06.30
[java] - 소수점 자르기 (duble type)  (0) 2010.06.30
[java] - 타입 변환  (0) 2010.06.30
[java] - 외부 프로그램 실행하기..  (0) 2010.06.29
[java] - byte array to int  (0) 2010.06.29
Posted by 짱가쟁이
Posted by 짱가쟁이
출처

XmlRpcServlet 을 사용한 단순한 형태의 standalone webserver 이다. web server 의 servlet api 를 활용하여 구현된다.


1. org/apache/xmlrpc/webserver/XmlRpcServlet.properties

- 위 경로에 맞춰서 프로퍼티를 생성하고 서비스 클래스 패스를 작성하면 땡.

 

2. 서비스 클래스 작성

- 적당히 알아서 만들어 주면 땡.

 

3. ServletServer.java

- servlet api 가 없으면 밑의 빨갛게 칠해진 코드에서 컴파일 에러가 나온다. (tomcat 6.0 의 servlet-api.jar 사용)


Example Code

import org.apache.xmlrpc.webserver.ServletWebServer;
import org.apache.xmlrpc.webserver.XmlRpcServlet;

public class ServletServer {

 private static final int port = 8080;

    public static void main(String[] args) throws Exception {
        XmlRpcServlet servlet = new XmlRpcServlet();
        ServletWebServer webServer = new ServletWebServer(servlet, port);
        webServer.start();
    }

}



Posted by 짱가쟁이
출처

XmlRpcServlet 를 이용하면 XML-RPC Server 를 손쉽게 만들 수 있다.

1개의 설정파일과 서비스를 위한 class 및 web.xml 을 수정하면 문서처럼 10분이면 끝난다.

테스트는 eclipse + apach 6.0 에서 수행함.


web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
 <display-name>xml_rpc_web</display-name>
 
 <servlet>
        <servlet-name>XmlRpcServlet</servlet-name>
        <servlet-class>org.apache.xmlrpc.webserver.XmlRpcServlet</servlet-class>
        <init-param>
          <param-name>enabledForExtensions</param-name>
          <param-value>true</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>XmlRpcServlet</servlet-name>
        <url-pattern>/bbaeggar</url-pattern>
    </servlet-mapping>
   
</web-app>

XmlRpcServlet.properties
- 요넘은 org/apache/xmlrpc/webserver/XmlRpcServlet.properties 경로에 만들어 줘야함.
Calculator=org.apache.xmlrpc.demo.Calculator
Login=org.apache.xmlrpc.demo.Login


3. 서비스 클래스..

위에 프로퍼티에서 사용되는 서비스 클래스는 알아서 만들어주면 될듯.


4. 테스트

Client.java

import java.net.URL;


import org.apache.xmlrpc.client.XmlRpcClient;
import org.apache.xmlrpc.client.XmlRpcClientConfigImpl;
import org.apache.xmlrpc.client.XmlRpcCommonsTransportFactory;

public class Client {

 public static void main(String[] args) throws Exception {
        // create configuration
        XmlRpcClientConfigImpl config = new XmlRpcClientConfigImpl();
        config.setServerURL(new URL("http://127.0.0.1:8080/xml_rpc_web/bbaeggar"));
        config.setEnabledForExtensions(true); 
        config.setConnectionTimeout(60 * 1000);
        config.setReplyTimeout(60 * 1000);

        XmlRpcClient client = new XmlRpcClient();
     
        // use Commons HttpClient as transport
        client.setTransportFactory(
            new XmlRpcCommonsTransportFactory(client));
        // set configuration
        client.setConfig(config);

        // make the a regular call
        Object[] params = new Object[]
            { new Integer(2), new Integer(3) };
        Integer result = (Integer) client.execute("Calculator.add", params);
         System.out.println("2 + 3 = " + result);
        
         for(int i = 0;i<100;i++) {
      // make the a regular call
         Object[] params1 = new Object[]
             { "bbaeggar", "0000" };
         Boolean result1 = (Boolean) client.execute("Login.login", params1);
          System.out.println("is Login = " + result1);
         }
     
    }

}


ps.

http://ws.apache.org/xmlrpc/server.html <- 여기를 잘 읽다보면 stand-alone 형태로도 서비스를 제공할 수 있어 더 좋은듯.

 


Posted by 짱가쟁이

- 위 sample 을 돌려보고 싶으면 위의 두개가 없어서 안돌아감.. 알아서 다운받고 사용하면 잘 돌아갈듯 싶지만.. 이클립스 버그인지.. 아니면 내부적으로 돌아가고 있는 엔진이 문제인지는 모르것지만.. 클라이언트측에서 서버측 원격메소드를 찾지 못하는 버그가 발생됨. 이때 당황하지 말고 clean &  build 수행 후 다시 run 하면 결과가 잘나온다.

 


Posted by 짱가쟁이
출처

위 기사는 Object serialization 를 사용하여 object를 로컬에 파일로 저장하거나 socket으로 전송하는 단순한 example 을 보여주고 있다. java.io.Serializable 객체를 implement 한 클래스를 소켓으로 어떻게 송/수신 한는지 보여주는 샘플을 간단히 정리해 보았다.

Server
ObjectInputStream   : readObject() 메소드를 사용하여 input stream 객체를 reading 한다.
ObjectOutputStream : writeObject() 메소드를 사용하여 output stream 객체를 writing 한다.

ObjectServer.java
- 무조건 요청을 받아주는 무식한 서버.
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class ObjectServer extends Thread {

    private ServerSocket serverSocket;
   
    public ObjectServer(int port) throws IOException {
        serverSocket = new ServerSocket(port);
        this.start();
    }
   
    public void run() {
        while(true) {           
            Socket client;
            try {
                System.out.println("Waiting for connections.");
                client = serverSocket.accept();
                System.out.println("Accepted a connection from: "+client.getInetAddress());
                WorkerThread c = new WorkerThread(client);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
           
        }

    }
}

WorkerThread.java
- 요청을 처리하고 응답값을 보내는 worker thread.
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;

import study.socket.serializing.ResponseVo;
import study.socket.serializing.RequestVo;

public class WorkerThread extends Thread {
    private Socket client = null;
    // read stream
    private ObjectInputStream ois = null;
    // write stream
    private ObjectOutputStream oos = null;
       
    public WorkerThread() {}

    public WorkerThread(Socket clientSocket) {
        client = clientSocket;
       
        try {
            ois = new ObjectInputStream(client.getInputStream());
            oos = new ObjectOutputStream(client.getOutputStream());
        } catch(Exception e1) {
            try {
                client.close();
            }catch(Exception e) {
                System.out.println(e.getMessage());
            }
            return;
        }
        this.start();
    }
   
    public void readObject() throws IOException, ClassNotFoundException {
        RequestVo requestVo = (RequestVo) ois.readObject();
       
        System.out.println("id:"+requestVo.getId());
        System.out.println("msg:"+requestVo.getMsg());
    }
   
    public void wirteObject() throws IOException {
        ResponseVo responseVo = new ResponseVo();
        responseVo.setId("response id");
        responseVo.setMsg("응답값 전송했음.. 알아서 처리하삼.");
       
        oos.writeObject(responseVo);
    }
   
    public void run() {
       
        try {
            readObject();
            wirteObject();

            oos.flush();
            // close streams and connections
            ois.close();
            oos.close();
            client.close();
        } catch(Exception e) {}              
            try {
                ois.close();
                oos.close();
                client.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
           }
    }

Serializing Custom Classes
Serializable interface 를 implements 한 custom class 를 작성한다.

RequestVo.java
- 요청 객체
import java.io.Serializable;

public class RequestVo implements Serializable {

    private String id;
    private String msg;
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getMsg() {
        return msg;
    }
    public void setMsg(String msg) {
        this.msg = msg;
    }  
}

ResponseVo.java
- 응답 객체
import java.io.Serializable;

public class ResponseVo implements Serializable {

    private String id;
    private String msg;
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getMsg() {
        return msg;
    }
    public void setMsg(String msg) {
        this.msg = msg;
    }
}

Client

ObjectClient.java
import java.io.*;
import java.net.*;
import java.util.*;

import study.socket.serializing.ResponseVo;
import study.socket.serializing.RequestVo;

public class ObjectClient {

    public static void main(String argv[]) {
          ObjectOutputStream oos = null;
          ObjectInputStream ois = null;
          Socket socket = null;

          try {
            // open a socket connection
            socket = new Socket("127.0.0.1", 20001);
            // open I/O streams for objects
            oos = new ObjectOutputStream(socket.getOutputStream());
            ois = new ObjectInputStream(socket.getInputStream());
           
            // send an object to the server
            RequestVo requestVo = new RequestVo();
            requestVo.setId("request id");
            requestVo.setMsg("요청했다.. 빨리 보내라 오바.");           
            oos.writeObject(requestVo);
           
            // read an object from the server
            ResponseVo rcvVo = (ResponseVo) ois.readObject();
            System.out.println("id:" + rcvVo.getId());
            System.out.println("msg:" + rcvVo.getMsg());
            oos.close();
            ois.close();
          } catch(Exception e) {
            System.out.println(e.getMessage());
          }
       }
}


'java > socket' 카테고리의 다른 글

DataInputStream 에서 전체 byte[] 읽기  (0) 2012.06.29
Posted by 짱가쟁이
2010. 6. 30. 09:33
출처

int to String
String str = Integer.toString(i);
String str = "" + i;


String to int
int i = Integer.parseInt(str);

int i = Integer.valueOf(str).intValue();


double to String
String str = Double.toString(d);


long to String
String str = Long.toString(l);


float to String
String str = Float.toString(f);


String to double
double d = Double.valueOf(str).doubleValue();


String to long
long l = Long.valueOf(str).longValue();

long l = Long.parseLong(str);


String to float
float f = Float.valueOf(str).floatValue();


decimal to binary
String binstr = Integer.toBinaryString(i);


decimal to hexadecimal
String hexstr = Integer.toString(i, 16);

String hexstr = Integer.toHexString(i);

Integer.toHexString( 0x10000 | i).substring(1).toUpperCase());


hexadecimal(String) to int
int i = Integer.valueOf("B8DA3", 16).intValue();

int i = Integer.parseInt("B8DA3", 16);


ASCII Code to String
String char = new Character((char)i).toString();


Integer to ASCII Code
int i = (int) c;


Integer to boolean
boolean b = (i != 0);


boolean to Integer
int i = (b)? 1 : 0;


'java > util' 카테고리의 다른 글

[java] - 소수점 자르기 (duble type)  (0) 2010.06.30
[java] - base54 String decode  (0) 2010.06.30
[java] - 외부 프로그램 실행하기..  (0) 2010.06.29
[java] - byte array to int  (0) 2010.06.29
[java] - int to byte array  (0) 2010.06.29
Posted by 짱가쟁이
2010. 6. 30. 09:25
출처

SOAP (Simple Object Access Protocol)

 

소프트웨어간에 메시지(오브젝트)를 교환하는 형태의 프로토콜이다. 이는 확장가능한 분산 프로토콜로 HTTP나 SMTP 등의 다양한 통신 프로토콜을 사용하여 전달할 수 있으며, XML-RPC를 확장 계승한 형태이다.

SOAP 는 XML을 근간으로 헤더(header)와 바디(body)를 조합하는 디자인 패턴으로 설계되어
있다. 헤더(header)는 선택사항으로 반복이나 보안 및 트랜잭션(transaction)을 정보로 하는 메타정보를 갖고 있으며, 바디(body) 부분은 핵심 정보로 이루어져 있다.

 

XML-RPC (eXtensible Markeup Language - Remote Procedure Call)

 

HTTP를 통해 XML 기반의 메시지를 교환하는 프로토콜이다.
XML에 데이터 타입을 담을 수 있는 간단한 방법을 제공하여 원격지에 있는 함수(method)를 호출할 수 있도록 구성되어 있다.

* SOAP은 그 자체가 하나의 독립적인 HTTP 메시지를 구성했지만, XML-RPC는 HTTP의 POST 요청의 내용을 단순히 XML로 구성한 것에서 차이가 있다.
공통점은 인터넷 표준인 HTTP 프로토콜을 이용하고 플랫폼으로부터 독립적인 XML을 이용한다는 것.

 

 


XML-RPC

SOAP

CORBA

 

개발편의

개발이 용이.

쉬운 구조.

XML-RPC

보다 복잡함.

개발이 어려움.

매우 복잡함.

 

통합

운영체제 및 언어

독립적.

스텁코드가 필요 없음.

운영체제 및 언어에

독립적.

스텁 코드가 불필요.

제품간에 호환성에

다소 문제가 있음.

클라이언트 스텁

필요함.

 

서비스

형태

간단한 웹 서비스.

복잡한 웹 서비스.

응용프로그램

및 전사적 시스템.

 

확장

간단한 구조.

XML 스키마 기반에 확장성이 뛰어남.

확장성이 뛰어남.

 

보안

HTTPS.

HTTPS

XML 서명(진행 중)

XML 암호화(진행 중)

XML ACL(진행 중)

Object Security

Service.

ORB기반

보안 메커니즘.

 

서비스

제공서비스가 없음.

UDDI, 보안.

Name Service. Event Service, Transaction Service, Object Security Service 등 다수.

 

 


Posted by 짱가쟁이
swing tutorial 의 예제를 보면 알아서 테이블 헤더의 값이 중앙에 배치되는데.. 요넘.. NetBeans 를 사용해서 생성한 테이블은 기본이 왼쪽 정렬이 된다. 이것저것 뒤져봐도 마땅한 방법이 생각이 안나.. 그냥 코드로 추가했다.

이렇게 무식한 방법말고, 좋은 방법이 있을 법도 한데.. 더이상 찾기가 귀찮다. 쩌ㅃ~

밑의 소스코드를 보면 현재 테이블의 Header CellRenderer 를 가져와서 랜더의 수평 정렬을 center 로 설정했다.

Code
DefaultTableCellRenderer renderer =  

                         (DefaultTableCellRenderer)table.getTableHeader().getDefaultRenderer();
renderer.setHorizontalAlignment(SwingConstants.CENTER);
table.getTableHeader().setDefaultRenderer(renderer);


Posted by 짱가쟁이

<실행화면>



Cell Editor 를 콤보박스로 변경하는 단순한 형태의 코드.

changeCellEditor(table, table.getColumnModel().getColumn(3));

void changeCellEditor(JTable table, TableColumn column) {

        JComboBox comboBox = new JComboBox();
        comboBox.addItem("사람");
        comboBox.addItem("요크");
        comboBox.addItem("마르티스");
        comboBox.addItem("MIX");
        column.setCellEditor(new DefaultCellEditor(comboBox));

        DefaultTableCellRenderer renderer =
                new DefaultTableCellRenderer();
        renderer.setToolTipText("클릭하면 콤보박스로 변경됩니다.");
        column.setCellRenderer(renderer);
}


위 코드 샘플의 bold line 이 cell editor 를 변경하는 부분이다.

출처

Posted by 짱가쟁이
이전버튼 1 2 3 4 5 6 7 8 ··· 12 이전버튼