Threadproblem mit Sockets und Server

Monokuma

Monokuma

Aktives Mitglied
Hallo. Ich habe ein Problem mit meinem Server und Client. Der Server soll Punktezahlen an alle Clients senden. Bei einem Client wird nur dem Client die Punktezahl zugeschrieben, bei zwei Clients gibt der Server beide Punktezahlen an jeden Client, bei drei Clients drei Punktezahlen, die der Server an alle Clients versendet, usw...
Jedoch ist es momentan so, dass wenn sich ein weiterer Client anmeldet, dass nur der neue und nicht der/die vorherige/n die Punktezahl bekommt.

Server.java:
package application;

import java.io.IOException;
import java.io.Serializable;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import static application.Client.readReceivedScore;

public class Server implements Serializable {
    public static int PORT = 10024;
    public static ServerSocket serverSocket;
    public static boolean checkScore = true;
    public static HashMap<String, Integer> clientsScoreMap = new HashMap<>();
    static List<Client> connections = new ArrayList<Client>();   // Array List of all connections
    public static Socket verbindung;

    public static void main(String[] args) throws IOException {
        serverSocket = new ServerSocket(PORT);
        System.out.println("Server running on " + InetAddress.getLocalHost() + " and Port " + PORT);

        Thread wait = new Thread(() -> {
            while (true) try {
                waitForClient(serverSocket.accept());
            } catch (Exception e) {
                e.printStackTrace();
            }
        });

        wait.start();
    }
    

    public static void waitForClient(Socket connection) throws IOException {
        Client client = new Client(connection);
        connections.add(client);
        client.start();
    }



}

Client.java:
package application;


import java.io.*;
import java.net.Socket;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

import static application.Server.*;

public class Client extends Thread implements Serializable{

    static Socket connection;
    static ObjectInputStream in;
    static ObjectOutputStream out;

    public Client(Socket connection) throws IOException {
        Client.connection = connection;
        in = new ObjectInputStream(connection.getInputStream());
        out = new ObjectOutputStream(connection.getOutputStream());
        out.flush();

    }


    public static void readReceivedScore() {
        Runnable helloRunnable = () -> {
            try {

                if (in.readUTF().equals("Unknown Player,0")) return;
                //writeToAll(in.readUTF());


                clientsScoreMap.put(in.readUTF().split(",")[0], Integer.parseInt(in.readUTF().split(",")[1]));


                clientsScoreMap.forEach((key, value) -> {

                    if (key.equals("Unknown Player")) return;
                    try {
                        writeToAll(key + "," + value);
                        //out.writeUTF(key + "," + value + "," + connections.size());
                        //out.reset();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                });

                out.flush();


            } catch (IOException e) {
                e.printStackTrace();
            }
        };

        ScheduledExecutorService executor2 = Executors.newScheduledThreadPool(1);
        executor2.scheduleAtFixedRate(helloRunnable, 0, 5, TimeUnit.SECONDS);
    }




    @Override
    public void run() {
        System.out.println("Connected to " + connection.getRemoteSocketAddress());

        readReceivedScore();
    }

    public static void write(String obj) throws IOException {
        out.writeUTF(obj);
        out.flush();
    }

    public static void writeToAll(String obj) throws IOException {
        for (Client c : connections) {
            c.write(obj);
        }
    }
}

main.java:
 public static void sendScore(GraphicsContext gc) {
        Runnable helloRunnable = new Runnable() {
            public void run() {
                try {
                    out.writeUTF(validUsername + "," + score);
                    out.flush();
                    System.out.println("SENT");

                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        };

        ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
        executor.scheduleAtFixedRate(helloRunnable, 0, 1, TimeUnit.SECONDS);
    }

    public static void readAllScores() {
        Runnable helloRunnable = () -> {
            try {
                System.out.println(in.readUTF());

            } catch (IOException e) {
                e.printStackTrace();
            }
        };

        ScheduledExecutorService executor2 = Executors.newScheduledThreadPool(1);
        executor2.scheduleAtFixedRate(helloRunnable, 0, 5, TimeUnit.SECONDS);
    }


    public static long startingTime;

    public static void main(String[] args) {
        try {


            verbindung = new Socket("localhost", 10024);

            System.out.println("Verbunden");
            out = new ObjectOutputStream(verbindung.getOutputStream());
            in = new ObjectInputStream(verbindung.getInputStream());


            launch(args);
        } catch (Exception e) {
            System.out.println("Verbindung fehlgeschlagen");
        }

        //sounds.playBackgroundMusic();
        // TODO: Music
        // Sets Background Music
        // sounds.playBackgroundMusic();
        //Application.launch(args);
        //myLaunch(main.class);
    }
 
Beste Antwort
kneitzel
Nimm das static raus. Das Einzige, das static ist, ist eben die public static void main.

Und wenn eine Instanz Zugriff auf eine andere benötigt, dann gib ihr eine Referenz.

Dann wundert mich im Client der Code für writeAll: Ich sehe in der Client Klasse kein connections Instanzvariable. Das dürfte also nicht erst übersetzbar sein ....

Und Server ist Serializable? Wieso das?
F

fhoffmann

Top Contributor
Warum sind die denn static:
Java:
public class Client extends Thread implements Serializable{

    static Socket connection;
    static ObjectInputStream in;
    static ObjectOutputStream out;
 
Monokuma

Monokuma

Aktives Mitglied
Warum sind die denn static:
Java:
public class Client extends Thread implements Serializable{

    static Socket connection;
    static ObjectInputStream in;
    static ObjectOutputStream out;
Das erste ist static, aufgrund der Methode, die darunter ist. Bei den anderen Beiden dachte ich mir nur, dass ich es in den anderen Klassen nicht brauchen werde außer in Server, Main und Client.
 
F

fhoffmann

Top Contributor
Aber jedesmal, wenn sich ein Client anmeldet, erzeugst du eine Instanz der Klasse Client. Und alle diese Instanzen teilen sich die (static) Informationen (des letzten angemeldeten Clients).
Das kann doch nicht gut gehen!
 
kneitzel

kneitzel

Top Contributor
Nimm das static raus. Das Einzige, das static ist, ist eben die public static void main.

Und wenn eine Instanz Zugriff auf eine andere benötigt, dann gib ihr eine Referenz.

Dann wundert mich im Client der Code für writeAll: Ich sehe in der Client Klasse kein connections Instanzvariable. Das dürfte also nicht erst übersetzbar sein ....

Und Server ist Serializable? Wieso das?
 
Beste Antwort
Monokuma

Monokuma

Aktives Mitglied
Nimm das static raus. Das Einzige, das static ist, ist eben die public static void main.

Und wenn eine Instanz Zugriff auf eine andere benötigt, dann gib ihr eine Referenz.

Dann wundert mich im Client der Code für writeAll: Ich sehe in der Client Klasse kein connections Instanzvariable. Das dürfte also nicht erst übersetzbar sein ....

Und Server ist Serializable? Wieso das?
Die connections Instanzvariable ist in der Serverklasse. Bei dem Serializable dachte ich mir, dass es hilfreich sein könnte.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
E Threadproblem Allgemeine Java-Themen 4
E Socket Sockets timen out Allgemeine Java-Themen 15
T Übungsprogramm: Sockets Allgemeine Java-Themen 7
C Threading mit BufferedReader/InputStream & sockets Allgemeine Java-Themen 0
J UTF-8 Sockets : Windows<->Linux Ein altes Problem Allgemeine Java-Themen 7
G Applet mit Sockets und TableLayout will nicht laufen Allgemeine Java-Themen 3
D Fehlerhafte Thread Verwendung beim arbeiten mit Sockets Allgemeine Java-Themen 6
T imagej-server NullPointerException Allgemeine Java-Themen 1
TonioTec Api für Datenaustausch zwischen Client und Server Allgemeine Java-Themen 0
W Server-Thread schreibt nicht alle Dateien Allgemeine Java-Themen 6
C Java RMI Client - Server Allgemeine Java-Themen 0
B Datei/Ordner auf Server zugreifen/erstellen Allgemeine Java-Themen 2
M TomEE auf Windows Server 2016 installieren Allgemeine Java-Themen 4
bueseb84 Git : Mehrere Server verwenden Allgemeine Java-Themen 3
P Am Application Server - Selbe files aber trotzdem CNF Allgemeine Java-Themen 2
KeexZDeveoper Zugriff auf Methoden vom Server Allgemeine Java-Themen 7
J Java - hoher Ramverbraucht auf WTS Server Allgemeine Java-Themen 8
C TCP Server und BufferedReader Leerstring im Stream? Allgemeine Java-Themen 5
C Logfile upload zu einem externen filezilla sftp server Allgemeine Java-Themen 6
S Simples Client Server Setup in Java Allgemeine Java-Themen 4
K Server mieten, Berechnungen darauf ausführen Allgemeine Java-Themen 14
Anfänger2011 Java Server oder lieber was anderes Allgemeine Java-Themen 16
F Best Practice Server und Clients Allgemeine Java-Themen 10
E JavaFX RMI extrem langsam wenn Server nicht läuft Allgemeine Java-Themen 5
D Best Practice Java Application Server , Docker oder was? Allgemeine Java-Themen 15
L Suche nach CalDav Server API Allgemeine Java-Themen 0
C Hang Man Server Client Allgemeine Java-Themen 3
C Hang man mit Server/Client Allgemeine Java-Themen 2
K Classpath JDBC Driver auf Server Allgemeine Java-Themen 4
J Programm meldet "Keine Rückmeldung" nach Verbindung zum Server Allgemeine Java-Themen 4
I Installer, der JAVA EE Server und DB installiert Allgemeine Java-Themen 10
M Kapselung JasperReports Server und Java Allgemeine Java-Themen 5
P Java Fehler auf Win2008 Server java.io.FilePermission IE8 Version JRE 1.7.0_51 Allgemeine Java-Themen 7
M Dateien aus einem Verzeichnis auf einem Server auflisten Allgemeine Java-Themen 5
M Checksummenprüfung bei Client Server kommunikation Allgemeine Java-Themen 3
C Mit Pc Awendungen auf Server starten Allgemeine Java-Themen 8
B Input/Output Server Startet, Jedoch Kein Output. Allgemeine Java-Themen 1
T Daten über port abfangen mit proxy server Allgemeine Java-Themen 12
E Socket Client-Server-Programmierung Allgemeine Java-Themen 44
T Java Streaming-Server & Streaming-Client Allgemeine Java-Themen 4
R Fragen zu Server + UI Allgemeine Java-Themen 2
0 Lösungsweg Client Server Kommunikation Fehlermeldung ausgeben Allgemeine Java-Themen 12
D Client / Server Allgemeine Java-Themen 23
D Player Objekt - Frame über Server anzeigen lassen. Allgemeine Java-Themen 3
U AWT simulierter Tastendruck auf Virtual Server Allgemeine Java-Themen 7
Z Socket [Chatprogramm] Nachrichten vom Server anzeigen lassen Allgemeine Java-Themen 6
E Methoden Server Benutzer abfrage Allgemeine Java-Themen 2
N COM Server ansteuern / KISSsoft Allgemeine Java-Themen 3
N URLConnection - Server abgeschaltet Allgemeine Java-Themen 2
A Parser verursacht Speicherprobleme auf Server Allgemeine Java-Themen 2
T Mit Java auf Dateien zugreifen die auf einem Server liegen Allgemeine Java-Themen 5
J Problem beim Auslesen einer Datei vom Server Allgemeine Java-Themen 4
T jar Archiv auf Server ausführen Allgemeine Java-Themen 3
J Application Server Allgemeine Java-Themen 2
A Input/Output Applet-Zugriff auf PHP-Schnittstelle (externer Server) Allgemeine Java-Themen 22
C game-server GUI erstellen Allgemeine Java-Themen 13
Developer_X Java FTP - Ordner auf Server erstellen Allgemeine Java-Themen 7
C Java Server Pages Problem Allgemeine Java-Themen 6
T Gleichzeitige Zugriffe auf Daten auf dem Server Allgemeine Java-Themen 11
M Server-Responds testen, Code-Redundanz Allgemeine Java-Themen 3
T JPA Entity im Client-Server-Umfeld Allgemeine Java-Themen 19
C Primzahlen Server Allgemeine Java-Themen 3
K Server Daten Visualisieren Allgemeine Java-Themen 3
S FTP Gezippte Datei von FTP Server downloaden Allgemeine Java-Themen 24
T Zeit von einem Server/Webseite auslesen und in eigener GUI anzeigen Allgemeine Java-Themen 6
B verbindung mit exchange server Allgemeine Java-Themen 3
AlexSpritze Alle Domains oder FQDN von einem Server erfragen? Allgemeine Java-Themen 2
H SwingWorker statt Thread für einen Server Allgemeine Java-Themen 2
D Versuch Server - Client anwendung Allgemeine Java-Themen 9
M Frage zum Auslesen einer Datei auf nem Server Allgemeine Java-Themen 4
ruutaiokwu MS Exchange Server 2003 Daten auslesen Allgemeine Java-Themen 2
T Welcher Server? JSP und Client-Anwendung Allgemeine Java-Themen 4
Final_Striker Datei vom Server bekommen Allgemeine Java-Themen 2
H Server Threaded machen. Port-Problem Frage Allgemeine Java-Themen 2
W programm auf server Allgemeine Java-Themen 5
C Java Polling, Server Prozedur oder doch Datenbank? Allgemeine Java-Themen 4
MQue Server- Thread Client Allgemeine Java-Themen 2
N Daten auf Server kopieren Allgemeine Java-Themen 6
S Datei auf Server mit lokaler Datei vergleichen Allgemeine Java-Themen 4
J J2EE Server für EJB Container Allgemeine Java-Themen 8
D design client server Allgemeine Java-Themen 10
I Persistenz ohne App-Server? Allgemeine Java-Themen 6
O binärer Suchbaum mit client server., objekte speichern. Allgemeine Java-Themen 2
0 kein Java unter Server 2008 ? Allgemeine Java-Themen 3
G Proxy- Server setzen Allgemeine Java-Themen 2
G Preise am Server verändern Allgemeine Java-Themen 4
M Applet Servlet Kommunikation ein Problem bei externem Server Allgemeine Java-Themen 3
J Java zugriff auf Exchange Server Allgemeine Java-Themen 10
MQue FTP Server/ Datei ablegen Allgemeine Java-Themen 4
F Java Server VM/ Client VM Allgemeine Java-Themen 7
J java + rmi + not found in gnu.java.rmi.server Allgemeine Java-Themen 7
T Socket Server Anwendung - Empfang eines Byte-Arrays Allgemeine Java-Themen 7
A Client/Server-Anwendung Allgemeine Java-Themen 3
P Server für Java- Programme Allgemeine Java-Themen 8
S SERVER.XML Allgemeine Java-Themen 3
G Gelöst: ZIP File vom FTP Server entpacken Allgemeine Java-Themen 3
T Proxys: Idee für den Callback vom Server zum Client? Allgemeine Java-Themen 3
M Textdatei auslesen / schreiben (Server) Allgemeine Java-Themen 9
B Möglichkeiten ein Java Programm auf einem Server auszuführen Allgemeine Java-Themen 30
M Eigenes Java-Server-Programm unter Linux steuern? Allgemeine Java-Themen 13

Ähnliche Java Themen


Oben