0

İstemci-sunucu tabanlı bir sandboxgame programlıyorum ve garip bir hata var: Sunucu, oyuncular da dahil olmak üzere tüm varlıkları bir ArrayList'e kaydeder. Ayrıca, Entity-ArrayList içine de dahil olan oyuncuları içeren bir ArrayList'i kaydeder. Her kene ve her oyuncu için sunucu, oyuncunun konumunu, tüm varlıkların listesini ve istemci tabanlı bir onaylama komutu komutu gönderir. İletim için Object-Output ve -InputStreams kullanıyorum. sunucu tarafından göndermek iletiler, böyle arıyoruz:Java Nesne Aktarımı: Aktarım sırasında nesneler "değiştir"

-> STPOS:{[email protected]} y-coord is 75.25017862499999, I already checked 
-> SDENT:{[[email protected]]}  y-coord is 75.25017862499999 
-> CLTICK 

istemci girişi böyle görünüyor: Böylece koordinat "sihirli" değişiklikleri

<- STPOS: {[email protected]}  y-coord is 75.25017862499999 
<- SDENT: {[[email protected]]}  y-coord is 60.00158922 
<- CLTICK 

.

ArrayList'in sunucu çıktı bu şekilde çalışır: (dışarı: ObjectOutputStream, varlıkları: ArrayList, Varlık ve ProtocolClass kendi sınıfları şunlardır): (in: istemci taraflı giriş izler

out.writeObject(new ProtocolClass(PROTOCOL.sendEntities, entities)); 

ObjectInputStream)

ProtocolClass pc = (ProtocolClass) in.readObject(); 
[...] 
[if pc.protocol equals PROTOCOL.sendEntities] 
entities = (ArrayList<Entity>) pc.object; 

oyuncu yere düşen edildiğinde başlangıçta y-coord, "60" ve artar olduğunu. 75.25 ... yere dokunduğunda sahip olduğu koordinat. 60.0015 ... ilk iletilen yeni y-koordinatıdır. Böylece ilk kene için çalışır. Ama her zaman durum böyle değil, çoğu zaman 60.

Tek bir akış kullanarak sadece bir iş parçacığı vardır, böylece akışlar eşzamansız olarak adlandırılmaz. Tüm "Sorgular" bir Kuyrukta kaydedilir. Tüm projemi tarardım, ama gerçekten sadece "SDENT" -Query'i bir kez onaylar.

Bunun neden olduğu hakkında hiçbir fikrim yok. Aktarılan nesneleri bir ArrayList'e göndermek, Eclipse'de "Denetlenmemiş yayın" uyarısı verir. Diğer döküm durumlarda ise durum böyle değildir. Sadece ArrayList'e döküm yapmak fark yaratmaz.

cevap

0

Aynı nesneyi gözden geçirilmiş bir coy yazmak istediğinizde ObjectOutputStream.reset() kullanmanız gerekir. Neden için Javadoc'a bakın.

+0

Teşekkürler, günümü kurtardım! – Andreas

İlgili konular