Java ObjectのSocketでの送受信
ソケット通信で自前のクラスオブジェクトを送受信するサンプル.(CUI版)
サーバープログラムObjEchoServer.javaと、クライアントプログラムObjEchoClient.java、データコンテナ用クラスDataContainerを
以下に掲載します。
複数の項目のデータを送受信する場合、クラスオブジェクトに詰め込んで一気に送ると楽な場合がありますね。ソケット通信では
そのような形の通信も行えます。
このプログラムではデータコンテナクラスとしてDataContainerを用意します。このクラスはフィールドとして boolean closeFlag,
int sliderVal, String mesStr の3つの要素を持っています。
動作概要:ObjEchoServerを初めに起動しておく。次にObjEchoClientを起動すると、まずサーバーからクライアントへDataContainer
オブジェクトが送信され、次にクライアントからサーバーへメッセージが送信され、接続切断、プログラム終了となる。
メッセージはDataContainerクラスのオブジェクトのフィールドにセットして送られる。
↑この本はJavaの通信プログラムの基本理解に手頃です。あまり厚くないのでとっつきやすい。
// ObjEchoServer.java ******************************** import java.io.*; import java.net.*; /** * * @author kom */ public class ObjEchoServer { public static void main(String args[]) { int port=9998; //ポート番号 try { ServerSocket ss = new ServerSocket(port); DataContainer dtCon=new DataContainer(); //データコンテナにメッセージ文字列をセット dtCon.mesStr="Hello, The Server is with you now."; System.out.println("Waiting for a Request from Client."); //接続を待受け Socket s = ss.accept(); //クライアントを接続したら、通信用ソケットがsに入る System.out.println("Connected with Client!"); //通信用ソケットsを使って入出力ストリームを生成 ObjectOutputStream oos = new ObjectOutputStream(s.getOutputStream()); ObjectInputStream ois = new ObjectInputStream(s.getInputStream()); //データコンテナオブジェクトをクライアントに送信 oos.writeObject(dtCon); //クライアントからのデータコンテナを受信 dtCon = (DataContainer) (ois.readObject()); System.out.println( "Message from Client:"+dtCon.mesStr); ois.close(); oos.close(); s.close(); System.out.println("Disconnected and Finish the process."); } catch (Exception e) { System.out.println(e); } } } // ObjEchoClient.java ******************************** import java.io.*; import java.net.*; /** * * @author kom */ public class ObjEchoClient { public static void main(String[] args) { int port=9998; //ポート番号 try { //ソケットの接続 Socket s = new Socket("localhost", port); //入力と出力ストリームの生成 ObjectInputStream ois = new ObjectInputStream(s.getInputStream()); ObjectOutputStream oos = new ObjectOutputStream(s.getOutputStream()); //データを入れて運ぶオブジェクトをストリームから受け取る DataContainer dtCon = (DataContainer) (ois.readObject()); System.out.println( "Message from Server:"+dtCon.mesStr); dtCon.mesStr="This is Client."; //オブジェクトをストリームに送信 oos.writeObject(dtCon); oos.flush(); ois.close(); oos.close(); s.close(); } catch (Exception e) { System.out.println( e); } } }
以下は、データコンテナ用のクラス定義です。
/* クラスDataContainerの定義 boolean、int、String の3つのフィールドを持つ。 */ // DataContainer.java ******************************** import java.io.Serializable; /** * * @author kom */ public class DataContainer implements Serializable{ boolean closeFlag; int sliderVal; String mesStr; DataContainer(){ closeFlag=false; sliderVal=0; mesStr=""; } DataContainer(boolean cls, int slider, String strM){ closeFlag=cls; sliderVal=slider; mesStr=strM; } } //end of definition of DataContainer class