2

私は単純なピアツーピアゲームを作成しており、XMLを使用してソケットを介して情報を送信することにしました(以下の例)。しかし、私はそれを送る方法がわかりませんか?私は単に 私の例からの ObjectOutputStream.writeObject(obj)パラメータの使用として使用する必要がありますか?主に私が尋ねているのは、ソケットを介してXMLオブジェクトを送信するのがどのように適切に見えるかです。object

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;

public class SendIPObject {
    public static void main(String[] args) throws Exception {
        JAXBContext context = JAXBContext.newInstance(IPSender.class);

        Marshaller m = context.createMarshaller();
        m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

        Player object = new Player();
        object.setID(0);
        object.setIP("192.167.211.167");

        m.marshal(object, System.out);

    }
}






import java.io.Serializable;

abstract public class Player implements Serializable{
    private String ip;
    private int id;

    public String getIP() {
        return ip;
    }

    public int getID() {
        return id;
    }

    public void setIP(String ip) {
        this.ip = ip;
    }

    public void setID(int id) {
        this.id = id;
    }

}
4

2 に答える 2

3

XMLはプレーン文字列として送信されます。したがって、最初のステップは、「Hello、world」など、相互に文字列を送受信できるクライアントを作成することです。次に、オブジェクトを作成し、JAXBを使用してStringに変換して送信する必要があります。他のクライアントで受信してJAXBを再度使用するよりも。このようにして、送受信するものを簡単にデバッグできます。完了したら、一時的なxml文字列への変換を回避し、マーシャリングとアンマーシャリングで直接ソケットストリームを使用することができます。オブジェクトをバイト配列にシリアル化するため、
使用すべきではないと思います。ObjectOutputStreamただし、オブジェクトをXML(文字列)に「シリアル化」して送信する必要があります。
ここでは、オブジェクトをJavaにマーシャリングする方法を確認できますString出力ストリームをStringオブジェクトに変換したい

于 2012-11-21T19:40:42.853 に答える
2

送信者と受信者の両方がJavaベースの場合、実際にはxmlへの変換をスキップして、オブジェクトをに送信できますObjectInputStream。これは基本的に、xmlを使用する代わりになります。ObjectInputStream必要に応じて、Stringクラスでを使用することもできます。

クラスを少し具体的に変更Playerし、toString()メソッドを追加して、両端で受信されたものを表示します。

クライアントの外観は次のとおりです。

public class Client {

    public static void main(String[] args) throws UnknownHostException, IOException {

        Player player = new Player("192.168.1.10", 1);
        //create connection
        Socket sock = new Socket("127.0.0.1", 8080);
        //get teh output stream to send in over
        ObjectOutputStream cout = new ObjectOutputStream(sock.getOutputStream());
        //send it 
        System.out.println("Sending: "+player.toString());
        cout.writeObject(player);
        //close connection
        sock.close();
        System.out.println("Closed");
    }

}

サーバーの外観は次のとおりです。

public class Server {

    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(8080);
        while (true) {
            try {
                System.out.print("\nserver>> ");

                // listen for connection from client
                Socket sock = serverSocket.accept();
                System.out.println("CONNECTION ACCEPTED");

                ObjectInputStream sin = new ObjectInputStream(sock.getInputStream());

                //read the player in
                Player player = (Player) sin.readObject();
                System.out.println("from Client>> " + player.toString());

                // close the connection
                sock.close();
                System.out.println("server>> CONNECTION CLOSED");
                System.exit(0);
            } catch (Exception e) {
            }
        }
    }    
}
于 2012-11-21T20:00:28.370 に答える