2009-04-13 5 views
1

Ich versuche, ein einfaches Spiel zu machen, das über ein TCP-Netz geht.JAVA - Schwierigkeiten mit einem einfachen Server, der die Klienten sieht

Der Server schaltet sich so etwas für Verbindungen zu überprüfen, in Server.java:

try 
{ 
    server = new ServerSocket(port); 
    System.out.println("Server started on port " + port); 

    while (true) 
    { 
     socket = server.accept(); 
     System.out.println("A new player has joined the server."); 
     new Server(socket).start(); 
    } 
} 

und einen neuen Kunden zu machen, in Player.java:

socket = new Socket(hostname, port); 

Nun, diese Werke Gut und alles, aber ich brauche den Server, um die Instanz des Players zu einer Array-Liste hinzuzufügen und in der Lage zu sein, alle von ihnen bestimmte Daten zu senden. Sie haben beide Hauptmethoden, also kann ein Computer nur den Server ausführen und 4 andere Computer verbinden, indem er Player.java ausführt. Wenn alle Spieler einen neuen Socket erstellen, wie soll der Server mit jedem Player interagieren?

+0

Wo ist Player? - Client oder Server? –

Antwort

1

Ich bin mir nicht sicher, ob ich die Frage verstehe.

Der Aufruf einen anderen Rückgabewert für jeden Verbindungs ​​Client zu akzeptieren erzeugen (in der Regel die Client-Adresse und Port darstellt), so müssen Sie jeden von ihnen speichern. Sie können dann interagieren über die Sockets, Sun hat eine pretty good example in its tutorial:

Das heißt, sparen Sie sich eine Menge Kopfschmerzen und denken Sie über die Leistung, die Sie von dem Spiel erwarten. Sie können sich eine Menge Ärger ersparen und einfach Zuverlässigkeit und Skalierbarkeit hinzufügen, wenn Sie Ihre Kommunikationen statt mit den Sockets selbst verwalten.

Verbringen Sie Ihre Zeit mit dem Schreiben des Spiels, nicht mit Low-Level-Socket-Programmierung, es sei denn, Sie versuchen zu lernen.

+0

+1 Yay zum Sehen von Wäldern anstelle von Bäumen! Ich mag deine Antwort so sehr, ich zerstöre meine. :-P –

+0

Ich denke, deine Antwort ist gut, mach es nicht nuke. Ich habe meine Zeit damit verbracht, Sockets aufzubauen (ich denke, es ist wichtig zu lernen), habe aber gelernt, die Fähigkeit zu schätzen, die Kopfschmerzen auf ein bestehendes Framework zu verschieben. Mein Programm ist jetzt viel zuverlässiger (z. B. passiert das Gehen mit einem Laptop-Test) – Uri

+0

Ich werde genauer mit Ihnen sein. Das Spiel ist Scrabble. Der Server muss in der Lage sein, Informationen über die Bewegung jedes Spielers über TCP zu senden. Diese Information ist im Wesentlichen die Positionen und die Buchstaben in diesen Positionen. Ich kann das nicht senden, weil ich nur mit Sockets interagieren kann, nicht mit Playern. –

0

Versuchen Sie folgendes:

Server client = new Server(socket); 
clients.add(client); 
client.start(); 

wo clients Typ List<Server> hat. Dann fügen Sie eine sendMessage Methode (oder was auch immer) zu Ihrer Server Klasse hinzu. Dann:

for (Server client : clients) { 
    client.sendMessage("..."); 
} 

Hoffe, das hilft! (BTW gibt es einen deutlichen Grund nenne ich die Variablen client und clients. Sie sind wirklich Abstraktionen für eingehende Clients, Server nicht als solche, obwohl der Code innerhalb Server ist wirklich ein Server für die Interaktion mit dem Kunden.)

1

server.accept() Methode gibt Ihnen ein Objekt Socket zurück. Socket Klasse haben eine Methode getOutputStream(), können Sie diesen Stream verwenden, um eine Nachricht zu senden.

+0

Das Problem ist, dass ich mit der Player-Klasse interagieren muss. Nicht die Socket-Klasse. Was Sie vorschlagen, ist, dass ich die ArrayList voll von Sockets anstelle von Playern mache. –

+0

Ja, das ist wahrscheinlich das, was Sie tun müssen. Denken Sie daran, dass das vom Client erstellte Player-Objekt überhaupt nicht auf dem Server vorhanden ist. –

+0

@Logan: Sie benötigen eine Möglichkeit, Ihre Objekte in einen Byte-Stream zu serialisieren, den Sie über den OutputStream senden, um von der Player-Klasse empfangen zu werden. Dies muss dann die Bytes im Stream wieder in die Objekte deserialisieren ("rekonstituieren"). –

0

Lassen Sie mich einige Refactorings Namen basierend auf meinem Verständnis seiner Frage tun.

Rename bestehende Server.java zu Player.java

Player player = new Player(socket); 
players.add(player); // server can use this collection for group notification 
..... 


class Player implements Runnable { 

    Player(Socket socket) { 
     this.socket = socket; 
     new Thread(this).start(); // later you may avoid it by using a threadpool executor. 
    } 


    public void run() { 
     while(running) { 
      // read and write data from client machines. 
      // use wait() appropriately 
     } 
    } 

} 

Wenn der Server alle Spieler informieren will, kann es ein Verfahren auf dem Player-Objekt aufrufen, die weitere Arbeit nicht erforderlichen Daten an den Client zu senden.

Schließlich bestehende Player.java zu GameLauncher.java umbenennen.

Sie könnten mehr Grip bekommen nach diesem einfach ‚umbenennen‘ Refactoring zu tun.

Verwandte Themen