如何通过java中的tcp / ip网络连接发送用户定义的类对象?

时间:2011-05-10 23:57:31

标签: java networking user-defined-types

这是我想从客户端应用程序发送到服务器应用程序的用户定义类的示例:

class dataStruct implements Serializable{
    byte data;
    int messageNum;
    public void setData(byte datum, int messageNumber){
        data=datum;
        messageNum=messageNumber;
    }
}

如何通过java中的tcp / ip连接发送用户定义的类?

我可以使用哪些类型的流来完成此任务(如果我发送的不仅仅是文本)?

我可以通过套接字流传递一个完整的对象,还是我必须在通过流传递它之后再将其强制转换?

我正在编写一个服务器/客户端应用程序,我只能找到教程,其中包含通过网络连接传递的基本类型或字符串的示例 - 而不是用户定义的类型。

非常感谢您的帮助和指导。

2 个答案:

答案 0 :(得分:3)

在发送方使用ObjectOutputStream,在接收方使用ObjectInputStream。

为了更清楚一点,这是一个例子(没有任何异常处理)。

发送方:

dataStruct ds = ...;
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
oos.writeObject(ds);
oos.close();

接收方:

ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
Object o = ois.readObject();
if(o instanceof dataStruct) {
   dataStruct ds = (dataStruct)o;
   // do something with ds
}
else {
   // something gone wrong - this should not happen if your
   // socket is connected to the sending side above.
}

所以是的,你必须在接收端进行转换,以便编译器知道正确的类。 (转换不会改变对象的类,只会改变编译器对它的了解。)

此序列化也可用于将对象保存到文件。 当然,这只提供了与Java的互操作性,如果您有非Java合作伙伴,您可能希望使用自定义序列化协议或某些基于XML的格式。

答案 1 :(得分:3)

让对象实现Serializable标记界面,然后使用ObjectOutputStreamObjectInputStream传输对象。当对象在另一端出现时,它将通过readObject()上的ObjectInputStream方法返回Object,所以是的,您需要将其强制转换为正确的类型。