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 件のコメント:
コメントを投稿