2

我正在制作简单的点对点游戏,我决定使用 XML 通过套接字发送信息(下面的示例)。但是不知道怎么寄?我应该简单地使用 ObjectOutputStream.writeObject(obj)和作为我的示例中的参数使用object我主要是在问,通过套接字发送 XML 对象看起来如何正确。

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我想将输出流转换为字符串对象

于 2012-11-21T19:40:42.853 回答
2

如果发送方和接收方都是基于 java 的,您实际上可以跳过来回转换为 xml,然后将对象发送过来ObjectInputStream。这本质上是使用 xml 的替代方法。如果你愿意,你也可以ObjectInputStreamString课堂上使用。

我将您的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 回答