【问题标题】:Sending and Receiving Serialized Objects in Java - Socket Programming在 Java 中发送和接收序列化对象 - 套接字编程
【发布时间】:2011-09-21 19:17:40
【问题描述】:

(我知道这可以在 RMI 中完成,但我需要使用套接字来执行此操作,因为我发现如果使用 RMI 方法可能会有一些设置过程)

请查看http://www.coderanch.com/t/205325/sockets/java/send-any-java-Object-through的简单客户端-服务器代码

在这个程序中,SimpleServer 发送的两个对象的顺序是 SimpleClient 知道的。

即:服务器

oos.writeObject(new testobject(1,"object from client")); oos.writeObject(new String("another object from the client"));

客户端根据接收对象的顺序进行转换。但我想避免这种性质并让客户端随时发送任何对象,因此服务器也应该能够相应地处理发送的每个对象并返回结果。

testobject to = (testobject)ois.readObject(); 
System.out.println(to.id);}  
System.out.println((String)ois.readObject());

有没有办法“标记”正在发送的对象,以便可以通过服务器中的简单“if”语句来确定操作?

有没有更好的方法来使用 服务器返回的 ResultSet 而不是我的对象序列化方法?

提前致谢。

谢谢

【问题讨论】:

  • 您使用 ObjectInputStream 读取的对象已经具有正确的运行时类型 - 转换不会改变它。所以在某种程度上他们已经被“标记”了,你可以打电话给getClass() 或在他们身上使用instanceof 并根据它来处理它们。
  • 不要使用new String("another object from the client"),它几乎总是毫无意义的。

标签: java sockets serialization client-server


【解决方案1】:

readObject 将在其适当的类中返回一个对象。如果你需要一些基于它的分支逻辑,你可以使用instanceof:

Object newObj = stream.readObject();
if (newObj instanceof testobject) {
     doSomething((testobject) newObj);
} else if (newObj instanceof String) {
     doSomethingWithString((String) newObj);
} // etc.

通常,不建议对从流中读取的所有对象执行此操作。如果你打算使用 ObjectStreams 建立一个协议,你应该记录它并坚持下去。这样一来,如果一侧发送的数据不正确,您会在另一侧更快地捕捉到它。

但是,在协议流中的给定点的场景中,预计客户端可能会发送几种不同类型的对象之一,那么这可能是有意义的。

【讨论】:

  • 感谢您的回复。我将使用这种方法来实现一个 ATM 模拟器,用户将在其中将 PIN、卡号从客户端程序发送到服务器。服务器将验证这些数据,如果有效,则显示他的帐户详细信息。我希望将这些帐户详细信息作为对象发送给客户。您对此有何看法?
  • 我在尼日利亚有一台出色的服务器,通过它可以非常有效地处理这种流量
猜你喜欢
  • 2010-11-29
  • 2011-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-09
  • 2015-02-28
  • 1970-01-01
相关资源
最近更新 更多