我试图在客户端和服务器之间来回发送一个对象,当它离开客户端时,所有数据都在那里,即 z = 6.0 但当它到达服务器时,所有数据都被重置,即 z = 0.0
我虽然这可能与我初始化对象中的变量有关,所以我没有初始化任何东西,我还添加了一个构造函数,但似乎没有任何作用。
对象:
public class PlayerData implements Serializable{
String name;
int id;
double x,y,z;
double rotation;
PlayerData(String name, double x, double y, double z) {
this.name = name;
this.x = x;
this.y = y;
this.z = z;
id = -1;
}
}
客户端发送:
Thread t = new Thread(){
public void run() {
while(true){
try{
System.out.println("Client writing player z: " + player.z);
streamOut.writeObject(player);
streamOut.flush();
}catch(Exception ioe){
System.out.println("Sending Error: "+ ioe.getMessage());
}
}
}
};
t.start();
服务器:
boolean done = false;
while(!done) {
//if(streamIn.available() > 0)
try {
Object o = streamIn.readObject();
if(o instanceof PlayerData){
PlayerData recieved = (PlayerData) o;
System.out.println("S: obj recieved z " + recieved.z);
for(int i = 0; i < serv.clientOut.size(); i++) {
serv.clientOut.get(i).writeObject(recieved);
serv.clientOut.get(i).flush();
}
}else
System.out.println("Server: bad object");
}
catch(IOException e) {
done = true;
}
}
它会说
Client writing player z: -42.05979919433594
S: obj recieved z 0.0
最佳答案
您通过序列化重复发送相同对象 - 并且ObjectOutputStream
注意到这一点,并将其解析为对同一对象的引用。
如果您想在每次调用时有效地发送一个单独的对象,请将其添加到循环中:
streamOut.reset();
这样,每次您写入对象时,它都会将其写出,就好像以前从未见过它一样(并且您将在另一侧的每个 readObject
调用中获得一个新对象) 。当然,这意味着流会更大。就我个人而言,我会考虑使用替代序列化技术,例如 Protocol Buffer ,但这是另一回事......
关于java - 通过套接字发送时对象丢失数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23174385/