Vector aktualisiert sich nicht?

Status
Nicht offen für weitere Antworten.

GagamehlO

Aktives Mitglied
So ich bin gerade daran ein Rundenbasiertes Netzwerk fähiges Strategiespiel zu schreiben.

mhm, das ist alles so schwer zu erklären, da ich schon 3000 Zeilen Code habe, ich versuchs einfach trotzdem mal.

Ich habe einen Vector in dem die Schiffe gelagert sind (Koordinaten, Rüstung etc...)
Zu beginn kann man sich eine Anzahl Schiffe kaufen die verschiedene Attribute besitzen und die in die jeweilige Aufstellungszone klätschen (platzieren).

Das sieht ca. so aus..
Die grünen Felder zeigen die Aufstellungszone, der Gegner erhölt die gegenüberliegende Seite.
Die Spielengine/Spielprinzip etc. funtkioniert auch wunderbar, nur leider habert es an der Netzwerkprogrammierung.
attachment.php


WEnn ich die Schiffe platziert habe, schicke ich sie meinem Gegenspeiler der sie dann bei sich platziert.
Das funktioniert auch alles wunderbar.
Nur wenn ich in den kommenden Runden meine Schiffe bewege und dem Gegner den aktualisierten Vector schicke.
Erhält er in der readObject() Methode oder nach der Methode dennoch nur den alten Vector.
Ich hbe schon mal etwas von den Objectidentifiern gehört und weiß das durch die readObject() Methode null zurück gegeben wird wenn das Objekt schon vorhanden ist.
Aus diesem Grund rufe ich immer die .clone() Methode des Vectors auf und habe im debugging auch immer ander Object-Id´s erhalten.

Ok jetzt mal nen bischen Code:
Ist leider wie ich schon sagte schwer zu verstehen, da es nur Codeschnipsel sind und der Quelltext sehr stark mit einander verwurzelt ist.


Code:
public void send(Object obj) throws Exception
    {
      if(obj instanceof Vector)
      {
        System.out.println("Vector->DuringClient->Send:");
        Vector in = (Vector) obj;
      for(int x=0;x<in.size();x++)
   	 {
   	 	System.out.println(((BattleShip)in.get(x)).getCoords());
   	 }//for end
      objout.writeObject(in.clone());
      }//end if
      else {
        objout.writeObject(obj);  
      }
    	
    	objout.flush();
    }//Method send() end

Die Methode gibt mir den Vector noch einmal aus, damit ich erkennen kann ob es noch der neue Vector ist.
->Er ist es!
Die Methode send() wird von der Spielklasse aufgerufen falls sich ein Schiff in irgendeiner Art und weise verändert hat (Richtung, Attribute,Koordinaten etc.)
Sie wird so aufgerufen send(ownships.clone()); = ownships ist der Vector mit meinen Schiffen.



Code:
public void run()
        {
            while (true) 
            {
                try
                {
                  Object obj = objin.readObject();
                 if(obj instanceof String)
                 {
                 	String in = (String) obj;
                 	if(in.startsWith(":"))
                 	{
                 		
                 	}
                 	else
                 	{
	                 	command=in;
	                 	if(in.equals("ready"))frame.add(gamefield);
	                 	else if(in.equals("start")) gamefield.setNewRound();
                 	}//else end
                 	
                 }//end if
                 else if(obj instanceof Integer)
                 {
                 	int playerid = (int) ((Integer)obj).intValue();
                 	gamefield.setPlayerId(playerid);
                 	do
                 	{
                 		//Spielfeld wird geladen
                 	}while(!(gamefield.isLoaded()));
                 	
                 	
                 }
                 else if(obj instanceof Vector)
                 {
                   Vector in = (Vector) obj;
                 	if(command.equals("torpedo")) gamefield.setTorpedos(in);
                 	else if(command.equals("opponentships"))
                 	 {
                 	 System.out.println("Vector->DuringClient->Get:");
                 	 for(int x=0;x<in.size();x++)
                  	 {
                  	 	System.out.println(((BattleShip)in.get(x)).getCoords());
                  	 }//for end
                 	  gamefield.setOpponentShips(in);
                 	 }
                 	else if(command.equals("myships")) gamefield.setMyShips(in);
                 	else if(command.equals("asteroids")) gamefield.setAsteroids(in);
                 }
                }
                catch(Exception any)
				{
                	any.printStackTrace();
                	stop();
				}
		  
            }//while end

        }//Method run() end
Dies hier würde im andrem peer passieren.
Das Object wird gelesen und je nach dem String den ich vorher durchgeschickt habe weiß die run() Methode was sie mit dem Object tun soll.
Da ich vorher "opponentships" gesendet habe gibt sie mir diesen Vector zur sicherheit noch einmal aus.
Es liegen jedoch die alten Schiffe drinnen.


Wer interesse am Kompletten Quelltext hat kann sich ja einmal melden, da ich den ungern hier reinstellen möchte.


mfg GagamehlO
 

GagamehlO

Aktives Mitglied
Vector->DuringClient->Send:
java.awt.Point[x=10,y=7] <---- Schiff wurde versetzt
java.awt.Point[x=13,y=4]

Vector->get:
java.awt.Point[x=13,y=7] <----- Nicht aktualisiert
java.awt.Point[x=13,y=4]

Habe es gerade mit writeUnshared(Object obj) versucht.
Funzt auch nicht.

Verdammt!!!!!!
Es konnte mir bis jetzt auch noch kein Dozent etc. helfen,..,..
 

Mag1c

Top Contributor
Hi,

so, ich habs nun :)

hatte noch das Gegenstück ObjectInputStream#readUnshared gefunden. Aber damit gehts auch nicht.

Du mußt vor dem Schreiben deines Vectors ObjectOutputStream#reset aufrufen. Das setzt den inneren Zustand deines OOS zurück und der Vector wird immer rausgeschrieben. Das klappt dann auch mit writeObject/readObject.

Gruß
Mag1c
 
G

Guest

Gast
Wäre nett wenn du nocheinmal darauf eigehen würdest warum?
Wenn ich die Strings sende, kommen ja auch neue Strings an und es wird nicht nur auf die erste String-Referenz die gelesen wurde ständig zugegriffen.
Ich werde es gliech mal ausprobieren.
´Noch ne Frage war das jetzt nen offensichtlicher-Programmierfehler oder eher so interner Java-Schnick schnack wie z.B. das mit den Object Identifiers den man nicht überall mitbekommt?
 

GagamehlO

Aktives Mitglied
JUHU!!!!!!!!!!!!!!!! :lol: :lol: :lol:
Es klappt jetzt! Danke!!!

Wäre aber troztdem nett wenn du mir das vileicht noch einmal erklären könnte.
Ich möchte ja auch wissen warum und es nicht nur einbauen.


mfg GagamehlO
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
Iron Monkey Große Daten ins Vector füllen Netzwerkprogrammierung 4
I Vector in Datagram packen Netzwerkprogrammierung 3
V Socket Objekte werden nicht aktualisiert Netzwerkprogrammierung 2
T Socket Java Programm hängt sich auf bei dem versuch von einem Socket scanner Daten zu erhalten. Netzwerkprogrammierung 1
X Socket [Anfänger] BufferedReader.readLine() lässt sich Zeit Netzwerkprogrammierung 1
F FTP FTPClient Datei lässt sich nicht öffnen Netzwerkprogrammierung 4
I Swing hängt sich auf bei Verbindung zum Server Netzwerkprogrammierung 3
B udp erkennen um welches objekt es sich handelt / max size Netzwerkprogrammierung 5
H RMI Stubs and Skeletons lassen sich nicht erstellen Netzwerkprogrammierung 4
H Socket Client server,verbindung läst sich nicht abbauen&code optimierung Netzwerkprogrammierung 3
P Warum lässt sich mein Server und mein Client einfach nicht schließen?!?! Netzwerkprogrammierung 16
C komisches Problem / ObjectInputStream erstellt sich nicht Netzwerkprogrammierung 5
M httpclient kann sich nicht auf asp.net Seite anmelden Netzwerkprogrammierung 2
& RMI Server beendet sich selbst Netzwerkprogrammierung 6
A RMI: Wieviele Clients können sich gleichzeitig anmelden? Netzwerkprogrammierung 34
N Wer kennt sich aus mit ssh (ganymed ssh lib) Netzwerkprogrammierung 2
D Server schliesst sich automatisch mit Client Netzwerkprogrammierung 3
TRunKX Threads beenden sich selber? Netzwerkprogrammierung 6
D DynDNS-Adresse ändert sich während Server pollt Netzwerkprogrammierung 2

Ähnliche Java Themen

Neue Themen


Oben