# Client/Server sendet nicht



## das-mo (24. Apr 2012)

Hallo,
ich bin mit ein paar Freunden dabei ein GO-Spiel zu programmieren und wir stehen gerade vor einem kleinen Problem. Wir wollen das Spiel Netzwerkfähig machen nur der Client sendet nicht so wie wir wollen eine Nachricht an den Server:

Hier einmal der Aufruf:

```
public void Multiplayer() throws IOException {
        System.out.println("Procedure started");
        Server server = new Server();
        server.start();
        System.out.println("Server created");
        Client client = new Client("127.0.0.1");
        client.start();
        System.out.println("Client Created");

        client.Write("HALLO!!!");
        System.out.println("Message sent");
        System.out.println(server.Read());

    }
```

Server:

```
public class Server extends Thread {

    int port;
    ServerSocket ssock;
    Socket sock;

    public Server() throws IOException {
        port = 2223;

    }

    @Override
    public void run() {
        try {
            Listen();
        } catch (Exception e) {
        }
    }

    public void Listen() throws IOException {
        ssock = new ServerSocket(port);
        sock = ssock.accept();
        System.out.println("sock accepted!!");
    }

    public String Read() throws IOException {
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(sock.getInputStream()));
        char[] buffer = new char[10];
        int anzahl = bufferedReader.read(buffer, 0, 10);
        String message = new String(buffer, 0, anzahl);
        return message;
    }

    public void Write(String m) throws IOException {
        PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(sock.getOutputStream()));
        printWriter.print(m);
        printWriter.flush();
    }
}
```

Client:

```
public class Client extends Thread {

    String ip;
    Socket sock;
    int port;

    public Client(String i) throws IOException {
        ip = i;
        port = 2223;

    }

    @Override
    public void run() {
        try {
            Connect();
        } catch (Exception e) {
        }
    }

    public final void Connect() throws IOException {
        sock = new Socket(ip, port);
        
        System.out.println("Connected?");
    }

    public void Write(String m) {
        try{
        PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(sock.getOutputStream()));
        printWriter.print(m);
        printWriter.flush();
        System.out.println("Message written");}
        catch(IOException e){
            System.err.println("ERROR: IOException");
        }
    }
}
```

Kann mir jemand helfen?

das-mo


----------



## SlaterB (24. Apr 2012)

dasselbe Problem wie hier, auch diese Exception
http://www.java-forum.org/java-basics-anfaenger-themen/135245-nullpointer-exception.html


----------



## das-mo (24. Apr 2012)

Danke für die schnelle Antwort werde ich mir gleich einmal angucken.

EDIT: Also wenn ich das jetzt richtig verstanden habe muss ich den Thread schlafen legen. Aber warum und wo genau???


----------



## ESCS (24. Apr 2012)

Weil die Anweisungen im run() der Server-Klasse noch nicht vollständig abgearbeitet sind bevor du dich mit dem Client verbindest (weil der Server in einem neuen Thread läuft).

Der Umweg über sleep() ist eine unschöne Lösung da man im Endeffekt ja nicht weiß wie lange es dauert bis der Server fertig ist meinen seinen Operationen.

Also entweder über Listener gehen oder den Server an sich initialisieren und Lese-/Schreiboperationen des Servers in einen neuen Thread auslagern.


----------



## SlaterB (24. Apr 2012)

den edit von 17.21 habe ich übrigens nicht gesehen, gefährliche Posting-Art

wo und warum war im anderen Thread übrigends auch das Hauptthema im weiteren Verlauf


----------



## das-mo (24. Apr 2012)

Mal kurz fürs Verständnis:
Ich erstelle eine Klasse Server die läuft durch extends Thread und die methode run() in einem eigenen Thread. Alles was bei mir in Listen() steht kann ich eigentlich auch in run() mit reinpacken und die Methoden Read() und Write() sollen auch jeweils in einen eigenen Thread? Und das gleiche für den Client nochmal?


----------



## SlaterB (24. Apr 2012)

Methoden immer klein schreiben,
Wrapper auf die Socket-Streams nur genau einmal erstellen und merken solange Socket gemerkt wird

und die Aufrufe sollen genau dann passieren wann sie sinnvoll sind, wie schon im anderen Topic gesagt,
ob das in die vorhandenen Thread-Klassen oder in neue Thread-Klassen gehört oder wohin auch immer, 
musst du dir schon selber mit Intelligenz ausdenken,

es ist jedenfalls nicht sinnvoll, per Telefon ein Taxi zu rufen und dann direkt auf die Staße zu gehen, 
einzusteigen und durch die Luft zu purzeln, da kein Taxi da ist


----------



## das-mo (24. Apr 2012)

weil ich da nicht mehr ganz durchblicke hab ich jetzt einfach ein thread.sleep() eingebaut.

Ich danke euch


----------

