Search on the blog

2014年2月20日木曜日

JAXBとソケット通信でJavaBeansをリモートに送る


 JAXB(Java Architecture for XML Binding)というライブラリを使うとJavaBeans <-> XMLの変換が簡単に出来るみたいです。Java SE 6以降なら標準ライブラリに含まれています。これを使ってちょっと遊んでみました。

 XMLにシリアライズしたBeanをソケット通信でリモートサーバーに送って、リモートサーバー側では受け取ったXMLをBeanにデシリアライズして何か処理をしてみたら面白いかなーと思ってそれっぽいものを書いてみました。

 学生の実験レベルな感じですが、サーバーを起動した後、クライアント側で
~/workspace/sample/JAXB$ java -cp bin com.kenjih.socket.Client
taro
yamada
30
とすると、サーバー側で
Hello, I'm taro yamada, 30 years old!
と出力されて、おお!ってなりました。。

以下ソースコードです。
まず、Bean。
package com.kenjih.jaxb;

import java.io.Serializable;

public class Employee implements Serializable {
    private static final long serialVersionUID = 6128567005613141734L;

    private String firstName;
    private String lastName;
    private int age;

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public void greet() {
        System.out.printf("Hello, I'm %s %s, %d years old!\n",
                this.getFirstName(), this.getLastName(), this.getAge());
    }
}

次にサーバー。
package com.kenjih.socket;

import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.StringReader;
import java.net.ServerSocket;
import java.net.Socket;

import javax.xml.bind.JAXB;

import com.kenjih.jaxb.Employee;

public class Server {
    public static void main(String argv[]) {
        try {
            ServerSocket serverSocket = new ServerSocket(55555);
            while (true) {
                Socket socket = serverSocket.accept();
                
                DataInputStream dis = new DataInputStream(socket.getInputStream());
                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                byte[] buffer = new byte[1024];
                for (int s; (s = dis.read(buffer)) != -1; ) {
                     baos.write(buffer, 0, s);
                }
                
                String xml = baos.toString();
                Employee emp = JAXB.unmarshal(new StringReader(xml), Employee.class);
                emp.greet();
            
                socket.close();
                Thread.sleep(1000);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

最後にクライアント。
package com.kenjih.socket;

import java.io.DataOutputStream;
import java.io.IOException;
import java.io.StringWriter;
import java.net.Socket;
import java.util.Scanner;

import javax.xml.bind.JAXB;

import com.kenjih.jaxb.Employee;

public class Client {
    public static void main(String argv[]) {
        try {
            Socket s = new Socket("localhost", 55555);

            DataOutputStream dos = new DataOutputStream(s.getOutputStream());

            Employee emp = new Employee();
            
            Scanner sc = new Scanner(System.in);
            String firstName = sc.next();
            String lastName = sc.next();
            int age = sc.nextInt();
            
            emp.setFirstName(firstName);
            emp.setLastName(lastName);
            emp.setAge(age);

            StringWriter stringWriter = new StringWriter();
            JAXB.marshal(emp, stringWriter);
            System.out.println(stringWriter);            
            dos.write(stringWriter.toString().getBytes());

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

0 件のコメント:

コメントを投稿