2013-06-20 4 views
5

Ich habe schon seit einiger Zeit etwas über Sockets gelernt (ich bin ziemlich jung) und ich glaube, ich habe Java Sockets gut im Griff. Ich habe mich entschieden, ein einfaches Multiplayer Java 2D Social Game zu erstellen. Mein Ziel ist es, dass der Server die X-, Y-Koordinaten der Spieler ausgibt und alle 10 Millisekunden chattet. Nach dem, was ich gelesen habe, sagt mir meine sehr durchschnittliche Logik, dass immer nur ein Benutzer sich mit einem Socket verbinden kann. Daher benötige ich für jeden Spieler, der eine Verbindung herstellt, einen separaten Thread und eine separate Buchse.Benötige ich einen separaten Socket und Thread für jeden Player, der sich anmeldet? [JAVA]

Ist es notwendig, einen ServerSocket und einen Thread pro Player zu haben?

+1

Ja ist es. Ein ServerSocket, aber mehrere Sockets und Threads für die Clients. – Thihara

+2

Vorsicht bei der Erstellung von grenzenlosen Threads! Sie sollten die Gesamtzahl der Threads begrenzen. Am besten verwenden Sie hier einen ExecutorService. – fge

+1

Soll ich einfach einen Socket erstellen, der Verbindungen verwaltet und den Benutzer dann an einen eindeutigen Socket leitet? – user2016705

Antwort

6

Sie sollten nur einen ServerSocket auf einen Port hören, der dem Client bekannt ist. Wenn ein Client eine Verbindung mit dem Server herstellt, wird ein neues Socket-Objekt erstellt, und das ursprüngliche ServerSocket kehrt wieder zum Abhören zurück. Sie sollten dann eine neue Thread ausgliedern oder an eine Executor die eigentliche Arbeit des Sprechens mit dem Klienten übergeben, sonst hört Ihr Server auf, nach Klientenverbindungen zu hören.

Hier ist eine sehr grundlegende Skizze des Codes, den Sie benötigen.

import java.net.*; 
import java.util.concurrent.*; 

public class CoordinateServer { 
    public static void main(String... argv) throws Exception { 
    // 'port' is known to the server and the client 
    int port = Integer.valueOf(argv[0]); 
    ServerSocket ss = new ServerSocket(port); 

    // You should decide what the best type of service is here 
    ExecutorService es = Executors.newCachedThreadPool(); 

    // How will you decide to shut the server down? 
    while (true) { 
     // Blocks until a client connects, returns the new socket 
     // to use to talk to the client 
     Socket s = ss.accept(); 

     // CoordinateOutputter is a class that implements Runnable 
     // and sends co-ordinates to a given socket; it's also 
     // responsible for cleaning up the socket and any other 
     // resources when the client leaves 
     es.submit(new CoordinateOutputter(s)); 
    } 
    } 
} 

I-Buchsen haben hier setzen, da sie mit loszulegen sind leichter zu, aber wenn man diese gut funktioniert haben und möchten, dass Ihre Leistung steigern werden Sie wahrscheinlich das java.nio.channels Paket untersuchen wollen. Es gibt ein gutes Tutorial over at IBM.

+0

Danke für Ihre Antwort – user2016705

3

Ja.

Ein Socket ist eine Verbindung zwischen zwei Punkten (dem Client und dem Server). Dies bedeutet, dass jeder Spieler am Serverende eine eigene Socket-Verbindung benötigt.

Wenn Ihre Anwendung in irgendeiner sinnvollen Weise reagieren soll, sollte jede eingehende Verbindung auf dem Server in ihrem eigenen Thread verarbeitet werden.

Dies ermöglicht Clients, die eine langsame Verbindung haben, nicht zu einem Flaschenhals für andere werden. Dies bedeutet auch, dass bei einem Ausfall einer Clientverbindung keine Updates auf Timeouts warten.

+0

Vielen Dank für Ihre Antwort – user2016705

Verwandte Themen