jeudi 23 avril 2015

List Deserialisierung entfernt Objekte

Hey Leute,

ich programmiere zurzeit zum Spaß ein Netzwerkspiel für Doppelkopf und bin auf einen Fehler gestoßen, der mich ratlos macht. Ich habe, bevor das Spiel startet, eine Lobby, zu der Spieler sich verbinden können.
Nachdem ein Spieler sich verbunden hat, wird an alle Spieler eine Nachricht geschickt, in der Informationen zur Lobby enthalten sind, welche in der GUI angezeigt werden sollen(zur Zeit nur Spielerobjekte in einer Liste).
Beim Senden dieser Nachricht hat diese Liste die richtige Größe, nur wenn diese Nachricht bei den Spieler ankommt, fehlen dort alle Spielerobjekte, welche sich nach dem eigenen Verbinden verbunden haben.
Als Beispiel:
Spieler 1 erstellt den Server
Spieler 2 verbindet sich und sieht in der Lobby Spieler 1 und 2
Spieler 3 verbindet sich und sieht in der Lobby Spieler 1,2 und 3
Spieler 2 sieht weiterhin nur Spieler 1 und 2 in der Lobby, Spieler 1 und 3 sehen alles

Ich habe zum Testen bereits einen Integer mitgeschickt, der die Listengröße speichert und dieser hat auch beim Spieler 2 den Wert 3, die Liste allerdings nur 2 Objekte.

Die Nachrichten werden mit ObjectOutputStream und ObjectInputStream von einem Socket/ServerSocket gesendet/empfangen

Hat jemand von euch schonmal solch ein Problem gehabt und kann mir helfen?

Hier die einzelnen Klassen und Methoden:
Java Code:

  1. public class Player extends Entity {
  2.  
  3. private static final long serialVersionUID = 7166160897222310950L;
  4.  
  5. private String name = "";
  6.  
  7. public Player(String name) {
  8. this.name = name;
  9. }
  10.  
  11. public String getName() {
  12. return name;
  13. }
  14. }

Java Code:

  1. public abstract class Entity implements Serializable {
  2.  
  3. private static final long serialVersionUID = -6163438352827657353L;
  4.  
  5. }

Java Code:

  1. public class Table extends Entity {
  2.  
  3. private static final long serialVersionUID = -4887168039027506598L;
  4.  
  5. private List<Player> players;
  6.  
  7. public Table() {
  8. players = new LinkedList<Player>();
  9. }
  10.  
  11. public List<Player> getPlayers() {
  12. return players;
  13. }
  14.  
  15. public void addPlayer(Player player) {
  16. if(!players.contains(player))
  17. {
  18. players.add(player);
  19. }
  20. }
  21. }

Java Code:

  1. public class GameController extends AbstractController {
  2.  
  3. private Table table;
  4.  
  5. public GameController() {
  6. table = new Table();
  7. }
  8.  
  9. private void playerWantsToJoinLobby(Player player)
  10. {
  11. table.addPlayer(player);
  12. UpdateLobbyEvent ev1 = new UpdateLobbyEvent(table.getPlayers());
  13. getEventBus().addDokoEvent(ev1);
  14. }
  15. }

ExternalEvent sind alle Nachrichten, welche übers Netzwerk verschickt werden. Ein EventBus mit Consumer wartet auf diese Events und sendet sie zu allen Spielern
Java Code:

  1. public class UpdateLobbyEvent extends ExternalEvent {
  2.  
  3. private static final long serialVersionUID = -4286761159555969836L;
  4.  
  5. private final List<Player> players;
  6.  
  7. private int playerSize;
  8.  
  9. public UpdateLobbyEvent(List<Player> players)
  10. {
  11. this.players = players;
  12. this.playerSize = players.size();
  13. }
  14.  
  15. public List<Player> getPlayers() {
  16. return players;
  17. }
  18.  
  19. public int getPlayerSize() {
  20. return playerSize;
  21. }
  22. }

Senden der Nachricht
Java Code:

  1. public void sendMessage(ExternalEvent event) {
  2. try {
  3. output.writeObject(event);
  4. } catch (IOException e) {
  5. e.printStackTrace();
  6. }
  7. }

Empfangen der Nachricht
Java Code:

  1. while ((object = input.readObject()) != null) {
  2. if (object instanceof ExternalEvent) {
  3. ExternalEvent event = (ExternalEvent) object;
  4. if(event instanceof UpdateLobbyEvent)
  5. {
  6. System.out.println("Sending new lobby: " + ((UpdateLobbyEvent) event).getPlayerSize());
  7. System.out.println("listSize: " + ((UpdateLobbyEvent) event).getPlayers().size());
  8. }


Genau beim Empfangen der Nachricht treten die Probleme auf und die beiden Attribute sind wie in dem Beispiel teilweise unterschiedlich groß.

Wäre für jede Hilfe dankbar! :)

Viele Grüße,
Crashkurs


List Deserialisierung entfernt Objekte

0 commentaires:

Enregistrer un commentaire