Socket Server starten Thread Problem

tass2

Mitglied
Hallo! Folgender Code

Java:
/*main methode*/

Server server = new Server(tcpPort);
new Thread(server).start();
		
try {

  Thread.sleep(1000*60); /* 60 Sekunden*/
} catch (InterruptedException e) {
  e.printStackTrace();
}

server.stop;
...

Dies war mein provisorischer Server-Start-Code. Der Server wird gestartet und läuft dann für 60 Sekunden.

Jetzt möchte ich aber, dass der Server nicht für 60 Sekunden läuft, sondern solange läuft, bis die Eingabe der Enter-Taste erfolgt (also: Es kommt ein leeres readLine oder so daher).

Habe das ausprobiert, will aber nicht so recht. was mache ich währenddessen mit dem Thread? Ich kann ja nicht jedesmal, wenn keine Eingabe kommt, nochmal für 1 Sekunde oder so sleepen...
 
S

SlaterB

Gast
solange keine Eingabe kommt musst du gar nichts machen, lege den Thread etwas gloabler ab und niemand muss mit einer Schleife warten, jedenfalls nicht deswegen,

irgendjemand muss aber schon auf die Eingabe aufpassen,
und genau wenn dort eine Enter-Taste festgestellt wird, muss (evtl. neben anderen Aufgaben) der Thread gestoppt werden
 

tass2

Mitglied
Was heißt, globaler ablegen?

Ich habs jetzt so probiert, nach Thread.start();

System.in.read();


Das Problem: Der Server accepted nachher keine Clients mehr, warum auch immer?
 
S

SlaterB

Gast
> Was heißt, globaler ablegen?
wenn nicht diese Methode irgendwie wartet und am Ende stopt, sondern eine andere Methode, gar andere Klasse,
dann den Thread oder den Server in ein Instanzattribut ablegen, statisches Attribut, irgendwohin übergeben

System.in.read();
dürfte blockieren, wer immer auf die Tastatur achtet, eben wartet,
einen neuer Thread bzw. die Tätigkeit eines Server-Objektes sollte das nicht beeinträchtigen,
da fällt mir nichts zu ein, evtl. mit mehr Info/ mehr Code
 

tass2

Mitglied
Hi!

Ja, dürfte blockieren, aber dann werden keine Clients mehr akzeptiert. Mehr Code gibt es dazu nicht wirklich. Der Server arbeitet mit ExecutorService und startet dann eben seine Worker...aber anscheinend nur, wenn der Main Thread nicht blockiert, sondern auf sleep ist.
 
S

SlaterB

Gast
> Der Server arbeitet mit ExecutorService
macht
> new Thread(server).start();
recht wiedersinnig

zu ExecutorService hast du noch keine Zeile gepostet, auch nicht wo das read() stattfindet,
du kannst dabei bleiben oder mehr schreiben
 

tass2

Mitglied
Das read sollte anstatt dessen Stattfinden!

try {

Thread.sleep(1000*60); /* 60 Sekunden*/ /* ersetzte durch System.in.read(); */
} catch (InterruptedException e) {
e.printStackTrace();
}

Ich will den Main thread ja nicht einschläfern, sondern einfach auf die Eingabe warten. Der Server Thread sollte ja trotzdem weiterlaufen und alles erledigen (was er WUNDERBAR macht, wenn ich sleep in der main-methode mache, aber nicht mehr, wenn ich read mache!)
 
S

SlaterB

Gast
dir ist nichts neues mehr zu sagen,

an alle anderen in der Welt, die hier vorbeischauen sollten:
postet Code oder beschwert euch genauso einfach immer weiter über Java
 

tass2

Mitglied
alles klar versuchen wirs:

Habs in einen Link gepackt, ist mmn. zu lange um hier zu posten.

Read a post

Passwort: javaserver

Hier fehlen einige Klassen (lässt sich so nicht kompilieren), und der Worker ist unübersichtlich und macht sicher vieles schlecht (Stringoperationen), aber bitte auf die Frage konzentrieren. Alles Wesentliche dafür sollte enthalten sein.


Ich versuchs jetzt somit einfach, entschuldige nochmal SlaterB, habe gedacht du hättest die Fragestellung missverstanden, was nicht der Fall war.

Oops: Sollte es wichtig sein: Der Notificationsender sendet nur UDP packets, habe ihn auch auskommentiert er sollte das Ganze nicht beeinflussen.
 
S

SlaterB

Gast
zu entschuldigen ist immer nichts, Aktion und Reaktion wie es in manchem Film heißt ;)

ich sehe keinerlei Probleme im Code, außer dass ich jede Menge löschen musste was nicht geht und überhaupt nur ausnahmsweise die fremde Quelle nehme,
wie du selbst sagst hat der Notificationsender nichts damit zu tun

Java:
public class Test2
{
    public static void main(String[] args)
    {
        MainServer.main(null);
    }
}


class MainServer
{
    private static int tcpPort = 9999;

    public static void main(String[] args)
    {
        Runnable r = new Runnable()
            {
                public void run()
                {
                    try
                    {
                        while (true)
                        {
                            Thread.sleep(2000);
                            Socket s = new Socket("localhost", tcpPort);
                            s.getOutputStream().write(68);
                            s.close();
                        }
                    }
                    catch (Exception e)
                    {
                        e.printStackTrace();
                    }
                }
            };
        new Thread(r).start();

        Server server = new Server(tcpPort);
        new Thread(server).start();

        // NotificationSender notificationSender = new NotificationSender();
        // new Thread(notificationSender).start();

        //
        // try
        // {
        // Thread.sleep(8 * 1000);
        // }
        // catch (InterruptedException e)
        // {
        // e.printStackTrace();
        // }

        try
        {
            System.in.read();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }

        System.out.println("Stopping Server");
        server.stop();
        // notificationSender.halt();

    }
}


class Server
    implements Runnable
{

    private int tcpPort;
    private ServerSocket serverSocket = null;
    private boolean isStopped = false;
    private Thread runningThread = null;
    private ExecutorService threadPool = Executors.newFixedThreadPool(6);

    public Server(int tcpPort)
    {
        this.tcpPort = tcpPort;
    }

    public void run()
    {

        synchronized (this)
        {
            this.runningThread = Thread.currentThread();
        }
        openServerSocket();

        while (!isStopped())
        {

            Socket tcpSocket = null;

            try
            {
                tcpSocket = this.serverSocket.accept();
                System.out.println("accept: " + tcpSocket.getPort());
            }
            catch (IOException e)
            {
                if (isStopped())
                {
                    System.out.println("Server Stopped.");
                    return;
                }
                throw new RuntimeException("Error accepting client connection", e);
            }
            this.threadPool.execute(new Worker(tcpSocket));
        }

        this.threadPool.shutdown();
        System.out.println("Server Stopped.");
    }

    private boolean isStopped()
    {
        return this.isStopped;
    }

    public void stop()
    {
        try
        {
            isStopped = true;
            this.serverSocket.close();
        }
        catch (IOException e)
        {
            throw new RuntimeException("Error closing server", e);
        }

        threadPool.shutdown(); /* right here? */

        this.isStopped = true;

    }

    private void openServerSocket()
    {
        try
        {
            this.serverSocket = new ServerSocket(this.tcpPort);
        }
        catch (IOException e)
        {
            throw new RuntimeException("Cannot open port number " + this.tcpPort, e);
        }
    }
}


class Worker
    implements Runnable
{

    private int udpPort = 4000;
    private InetAddress inetAddress = null;
    private Socket tcpSocket = null;
    private DatagramSocket highestSocket = null;
    private DatagramPacket udpPacket = null;
    // private LoginService loginService = LoginService.getInstance();

    private BufferedReader input = null;
    private PrintWriter output = null;

    private Boolean shutdown = false;

    public Worker(Socket tcpSocket)
    {
        this.tcpSocket = tcpSocket;
    }

    public void run()
    {
        String inputMessage = "";
        inetAddress = tcpSocket.getInetAddress();

        try
        {
            input = new BufferedReader(new InputStreamReader(tcpSocket.getInputStream()));
            output = new PrintWriter(tcpSocket.getOutputStream(), true);

            while (!shutdown)
            {
                inputMessage = input.readLine();

                if (inputMessage != null)
                {
                    processInput(inputMessage);
                }
            }

            System.out.println("Worker shutting down");
            input.close();
            output.close();

        }
        catch (IOException e)
        {
            // report exception somewhere.
            System.out.println("Error reading/sending IO");
            e.printStackTrace();
        }
    }

    private void processInput(String input)
    {
        System.out.println("input: " + input);
    }

    public void stop()
    {
        try
        {
            output.println("Server has ended. You have been logged out.");

            shutdown = true;
            tcpSocket.close();

        }
        catch (IOException e)
        {
            System.out.println("Closing worker");
        }
    }
}
ist das was man unter einem vollständigen Testprogramm versteht, kopieren, mit evtl. gleichnamigen eigenen Klassen aufpassen,
Imports automatisch ergänzen lassen, laufen lassen, fertig

Server wird gestartet, alle 2 sec kommt ein Client, keine Spur einer Fehlermöglichkeit,
welche Art Fehlverhalten stellst du dir denn vor?

was ich mir im letzten Posting noch gespart habe war der allgemeine Hinweis,
dass vielleicht andere Stellen auch auf System.in lesen, dann mag ein zusätzliches System.in.read() Auswirkungen haben,
wobei man auch dann noch schwer überlegen muss, etwa dass woanders ein Enter nicht ankommt und es dort dann nicht weitergeht
 

tass2

Mitglied
Nun, wenn dem so ist werde ich es heute mal auf einer anderen Maschine versuchen. bin langsam am Ende mit dem Latein :)

Danke für die Hilfe.
 

tass2

Mitglied
Das Thema hat sich erledigt. Auf einem Linux-Rechner 1:1 ausprobiert, hat auf Anhieb geklappt.

Java, JVM, plattformabhängig auf einmal? Weiß irgendjemand eine sinnvolle erklärung dazu?
 
S

SlaterB

Gast
das wäre dann ja noch ein Java-Fehler,
kannst du mein Programm auf irgendeinem Rechner unter irgendeiner Konfiguration tatsächlich zu Problemen führen?
wenn ja welche Probleme genau, und welche Konstellation wäre das?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Chat Server starten über GUI problem Netzwerkprogrammierung 4
X Mit Java eine Applikation auf einem anderen Windows Rechner (Windows Server 2008) starten Netzwerkprogrammierung 1
K Server Klasse starten Netzwerkprogrammierung 5
A Socket Server-Socket wiederholt starten Netzwerkprogrammierung 3
C Vom Server Programm auf Client starten Netzwerkprogrammierung 2
S eclipse: client/server gleichzeitig starten Netzwerkprogrammierung 8
S jar auf server starten?? Netzwerkprogrammierung 4
J Applikation auf Citrix-Server starten Netzwerkprogrammierung 3
M Server aus inem Applet heraus starten Netzwerkprogrammierung 4
G RMI Server starten - rmiregistry Aufruf? Netzwerkprogrammierung 17
N RMI: Server vom Client aus in eigener JVM starten? Netzwerkprogrammierung 5
M RMI Server will nicht starten Netzwerkprogrammierung 2
F http Post auf einen Grafana Server Netzwerkprogrammierung 3
W Socket Server -> lesen von / schreiben zu php-script Netzwerkprogrammierung 6
E Server mit GUI Netzwerkprogrammierung 4
E FTP FTPS Server gibt Fehlernachricht "522 SSL/TLS required on the data channel" zurück Netzwerkprogrammierung 1
I Performanteste Kommunikationsmethode zwischen Client u. Server Netzwerkprogrammierung 4
L Socket Automatische Zuweisung von Server und Client Rolle Netzwerkprogrammierung 12
Eigenen Rechner als Server? Netzwerkprogrammierung 16
FrankenDerStein HTTP Https Server Bibliothek für Linux und Android gesucht. Netzwerkprogrammierung 7
ExceptionOfExpectation Server/Client-Kommunikation Netzwerkprogrammierung 34
M Server-Client-System für Browsergame Netzwerkprogrammierung 5
J Datei Download vom Server Netzwerkprogrammierung 8
izoards Mehrere TCP Verbindungen auf einen Server [alles Local] Netzwerkprogrammierung 2
Yonnig Threads mit Client/Server und GUI (laufend bis button-click) Netzwerkprogrammierung 9
J Client-Server und SOAP Netzwerkprogrammierung 23
K Threads/Server/telnet Fehler Netzwerkprogrammierung 2
J Multithreaded-Server Netzwerkprogrammierung 21
JaXnPriVate Java HTTPS Server (Secure Sockets) Netzwerkprogrammierung 15
L30nS RMI RMI-Server kann Dialog nicht volkommen anzeigen Netzwerkprogrammierung 2
L30nS RMI Aufruf einer Client-Methode von einem RMI-Server Netzwerkprogrammierung 3
L Server-Socket liest Input-Stream nicht Netzwerkprogrammierung 5
T String von Client zu Server kommt nicht an Netzwerkprogrammierung 92
D WebSocket Server mit HTML Client und Java Server Netzwerkprogrammierung 5
S Von Java auf passwortgeschützten Server zugreifen + Umgang mit Ports Netzwerkprogrammierung 28
S Probleme bei Java-Installation auf Server (Linux/Shell/Terminal) Netzwerkprogrammierung 6
S Java: Anbindung an einen realen Server? (+ Portfreigabe) Netzwerkprogrammierung 8
D Server - Client Informationsaustausch, Möglichkeiten Netzwerkprogrammierung 3
H Socket Kann ein Socket server 2 dimensionale Arrays empfangen und versenden? Netzwerkprogrammierung 3
H Socket Chat entwickeln mit Java Server Client Netzwerkprogrammierung 4
X Kann ich einen Client/Server verbindung hinkriegen die mir alle paar Sekunden die aktuellen Daten per Realtime zuschickt ? Netzwerkprogrammierung 9
Z Kann nicht Daten vom Server lesen Socket Netzwerkprogrammierung 10
S HTTP Post?!? - Java Server Netzwerkprogrammierung 7
F Verbindung zu einem LDAP Server über Java Netzwerkprogrammierung 4
D Slf4j - Logging - Client-Server Architektur Netzwerkprogrammierung 3
F NodeJs-Server auf Firebase hosten ? Netzwerkprogrammierung 3
J client server mit nur einem PC Netzwerkprogrammierung 33
M Socket Nachricht von TCP-Client an Server schicken Netzwerkprogrammierung 12
M Socket Verbindung Matlab(Server) Java(Client) Netzwerkprogrammierung 1
H HTTP Glassfish (v5) Application Server - Bibliothek zur Verfügung stellen Netzwerkprogrammierung 4
B HttpClient - Server (Jetty) - getInputStream - EOF Netzwerkprogrammierung 3
P TCP-Server Netzwerkprogrammierung 1
R Socket FATAL EXCEPTION MAIN bei Socket based client/server app Netzwerkprogrammierung 2
F Server für Java Applikationen Netzwerkprogrammierung 16
H Einfacher Server funktioniert nicht Netzwerkprogrammierung 1
G Server-Client IO Problem Netzwerkprogrammierung 6
T Mikrofonaudio über Java Server an Webbrowser streamen Netzwerkprogrammierung 13
I Socket Das erste Server-Client Programm Netzwerkprogrammierung 16
T HTTPS-Requests an Server: POST-Parameter kommen nicht an Netzwerkprogrammierung 5
L Socket Wie kann ich checken ob ein User eine Nachricht per Outputstream an den Server gesendet hat? Netzwerkprogrammierung 1
T Jetty Server LOGGING Netzwerkprogrammierung 1
L Strings an Server senden und in MYSQL speichern? Netzwerkprogrammierung 3
Aruetiise Socket Java Programm auf Server Netzwerkprogrammierung 3
T server empfängt nur 1 Buchstaben vom String Netzwerkprogrammierung 1
S Spiel mit Server programmieren Netzwerkprogrammierung 2
N Post u Head Request an Server Netzwerkprogrammierung 4
J Socket Ein Chat Server Tutorial Netzwerkprogrammierung 8
M Socket Server antwortet dem Client nicht Netzwerkprogrammierung 6
J Socket Tutorial zu Multiplayer Server schreiben? Netzwerkprogrammierung 5
S Java Chat Server Netzwerkprogrammierung 8
E Kurze Textnachrichten über einen Server von meinem Handy auf den Computer laden. Netzwerkprogrammierung 9
I Client/Server Kommunikation bei einem Spiel Netzwerkprogrammierung 4
E Objekte versenden, Client-Server Netzwerkprogrammierung 25
C Mini Client-Server-Anwendung funktioniert nicht Netzwerkprogrammierung 8
D Socket Message an einen Server senden? Netzwerkprogrammierung 8
J FTP FTP Zugriff über Proxy Server Netzwerkprogrammierung 1
KaffeeFan Programmierung mit Cloud-Server Netzwerkprogrammierung 0
L Socket Problem mit Server Netzwerkprogrammierung 1
cezary Socket Paralleler Server ? Netzwerkprogrammierung 1
I Socket Leicht zu DDosender Server Netzwerkprogrammierung 4
agent47 HTTPs Server Netzwerkprogrammierung 5
J Prüfen, ob remote UDT Server erreichbar ist Netzwerkprogrammierung 0
P Server als Client nutzen Netzwerkprogrammierung 8
S Server Kommunikation Netzwerkprogrammierung 1
V einfaches hin und her von Text über Server Netzwerkprogrammierung 2
D Socket Run Args Client/Server Socket Netzwerkprogrammierung 1
Cromewell Socket Multithreaded Server und Client Netzwerkprogrammierung 1
Y Client/Server/DB communication Netzwerkprogrammierung 3
JavaWolf165 Socket mit .writeUtf etwas vom Client zum Server schicken Netzwerkprogrammierung 13
P RMI Client Server Programm über Internet Netzwerkprogrammierung 2
brainless Client Server Kommunikation verschlüsseln Netzwerkprogrammierung 13
gamebreiti Socket Server / Client Anwendung Manipulation von Objekten durch Server Netzwerkprogrammierung 9
T Socket Server/Client Kommunikation Netzwerkprogrammierung 8
S Webservice - Server Netzwerkprogrammierung 0
M Java Eingabe auf FTP Server übergeben Netzwerkprogrammierung 4
F Server Client Anwendung mit UDP Netzwerkprogrammierung 2
A RMI Wo treten Exceptions bei RMI Aufrufen auf? Auf Client oder auf Server? Netzwerkprogrammierung 3
M Socket Java Server: NullPointerException Netzwerkprogrammierung 4
A ByteBuffer - Client/Server Netzwerkprogrammierung 9
J Java Server empfängt php inhalt nicht Netzwerkprogrammierung 1

Ähnliche Java Themen

Neue Themen


Oben