Frage zu Threads & Server

coffeecups

Mitglied
Hallo,

hab wegen des Problems bereits einen Thread offen, aber ich denke mit dem FAQ Beitrag von euch lässt es sich besser erklären:

Netzwerkgrundlagen - ServerSocket und Socket

Ausgangspunkt ist also das anschauliche Beispiel bei 4. Threads und Server:

(Copy+Paste)
Server
Java:
    [...]
    // Server aufbauen
    ServerSocket server = new ServerSocket(1234);
    Socket s;
    while(true) {
    // Auf verbindung warten
    s = server.accept();
    // kommunikation an einen nebenläufigen Thread abgeben
    ServerThread t = new ServerThread(s);
    t.start();
    // und wieder auf neue Verbindungen warten
    }

ServerThread:
Java:
    public class ServerThread extends Thread {
    private Socket s;
    public ServerThread(Socket s) {
    this.s = s;
    }
     
    public void run() {
    // lesen
    BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));
    String text = in.readLine();
    // schreiben
    BufferedWriter out = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
    out.write(text.toUpperCase());
    out.newLine();
    out.flush();
    // aufräumen
    out.close();
    in.close();
    }
    }

Es geht mir darum, wenn mein Server gerade beschäftigt ist (z.B. durch einen einfachen Thread.sleep(5000)), funktioniert die parallele Threadabarbeitung nicht mehr. Grund dafür scheint der BufferedReader/InputStreamReader zu sein. Siehe dazu das folgende Beispiel (Ausgangspunkt der Sourcecode von oben):

ServerTest.java:
Java:
package servertest;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class ServerTest {

    public static void main(String[] args) throws IOException {
        ServerSocket server = new ServerSocket(1234);
        Socket s;
        while (true) {
            s = server.accept();
            ServerThread t = new ServerThread(s);
            t.start();
        }
    }
}

ServerThread.java:
Java:
package servertest;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.util.logging.Level;
import java.util.logging.Logger;

public class ServerThread extends Thread {

    private Socket s;
    public ServerThread(Socket s) {
        this.s = s;
    }

    @Override
    public void run() {
  
        try {
            BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));
            String text = in.readLine();
            BufferedWriter out = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
            
            System.out.println("Sleepy");
            Thread.sleep(8000);
            out.write(text.toUpperCase());
            out.newLine();
            out.flush();
            out.close();
            in.close();
        } catch (IOException | InterruptedException ex) {
            Logger.getLogger(ServerThread.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

Ich hab hier einfach nur zwei Zeilen hinzugefügt:
System.out.println("Sleepy");
Thread.sleep(8000);

Versuche ich jetzt mit 2 Threads gleichzeitig auf localhost:1234 zuzugreifen, dann wird die Anfrage nacheinander durchgeführt, d.h. erst nach 8 vollen Sekunden beginnt der Thread mit der zweiten Abarbeitung obwohl beide Anfragen fast gleichzeitig durchgeführt wurden.

Woran liegt das und vor allen Dingen: wie kann ich das umgehen?

In weiterer Folge geht es mir darum: ich hab einen Java Server der mir Daten aufbereitet. Während dieser Datenaufbereitung ist der Server busy und alle weiteren Anfragen sollen über diesen Zustand informiert werden. Derzeit werden einfach alle Anfragen "gestaut" und ich weiß nicht, wie ich damit umgehen kann/soll.
 
Zuletzt bearbeitet:

ChristianK

Aktives Mitglied
Idealerweise hast du eine Klasse, die nur Verbindungen annimmt. Dann eine Klasse, die als eigenständiger Thread agiert. Wenn dieser Thread schläft, können weiterhin neue Verbindungen aufgenommen werden oder mit anderen Verbindungen gearbeitet werden. Wichtig ist, das jede Verbindung in einem eigenen Thread ist.

Wenn du nun im Haupt-Thread - der die Verbindungen annimmt und die anderen Threads erzeugt -, eine Liste mit allen aktiven Clients führst, kannst du von den Verbindungs-Threads an alle Verbindungen eine Nachricht senden (statische Methode, durch alle iterieren und senden, ...).
 

coffeecups

Mitglied
Sorry habs noch nicht ganz überrissen, kannst dus bisschen genauer erklären wie das Ganze aufgebaut sein soll damit Inputstream nicht weiter blockiert, idealerweise mit Bsp?

Danke & LG
 

ChristianK

Aktives Mitglied
[Java]
public SocketServer {
private ArrayList<Socket> activeSockets = new ArrayList()<>;
public void run() {
// init & co ist schon ok
SocketServer socketServer;
while(true) {
Socket socket = socketServer.accept();
ServerThread thread = new ServerThread(socket);
activeSockets.add(thread);
thread.start();
}
}
}
public ServerThread extends Thread {
private Socket socket;
public ServerThread(Socket socket) { this.socket = socket; }
public void run() throws IOException {
try (
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream());
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream());
) {
String line;
while (true) {
line = in.readLine();
if (line == null) { throw IOException("connection lost"); }
// arbeite hier mit den informationen
}
} catch (IOException e) { throw e; }
}
}[/code]

So ungefähr. Da hat jede Verbindung ihren eigenen Thread und kann unabhängig von anderen Verbindungen agieren. Verstehe ich richtig, dass das etwa das war, was du wolltest?
 
Zuletzt bearbeitet:

Sen-Mithrarin

Gesperrter Benutzer
@TO
ähm ... was genau meinst du jetzt ?

"Es geht mir darum, wenn mein Server gerade beschäftigt ist (z.B. durch einen einfachen Thread.sleep(5000)), funktioniert die parallele Threadabarbeitung nicht mehr."

HÄ ? WAT IS ?

was genau meinst du mit "funktioniert die parallel Threadabarbeitung nicht mehr" ???
und was hat das mit deinem code zu tun ?

das was du gepostet hast ist das du genau den einen connection-thread der für die kommunikation mit dem client zuständig ist schlafen legst ... und auch nur diesen
ergo : genau diese verbindung macht erstmal "pause"

alle anderen verbindungen die du offen hast laufen ja in ihren eigenen threads weiter ...
außer : du verwendest die selbe klasse auch für andere connections ... weil dann machen die genau so pause ...

das, was du beschreibst, das zwei clienten pause machen, liegt einfach darin das du das auch so in der klasse geschrieben hast


du brauchst aber gar kein sleep() ... weil read() blockiert, genau wie accept(), und nur dann weiterlaufen wenn was passiert, ansonsten bleibt der thread an dieser stelle eh stehen



entweder hast du irgendwie was mit den grundlagen der parallelen programmierung bzw socket-programmierung nicht verstanden ... oder dich einfach so undeutlich ausgedrückt das nicht klar wird was jetzt eigentlich dein problem ist
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Frage zum Keystore Netzwerkprogrammierung 21
E Socket Frage Netzwerkprogrammierung 6
T Frage bzgl. Socket-API Netzwerkprogrammierung 1
C Jetty 9 Non Blocking Handler Frage... Netzwerkprogrammierung 1
O log4j Appender Frage Netzwerkprogrammierung 6
T Frage zu Client-Server Applikation Netzwerkprogrammierung 2
M Theoretische Frage zu Server - Client Netzwerkprogrammierung 2
P Eine etwas andere Frage: Sicherheit Netzwerkprogrammierung 5
M allgemeine Frage über Server-Client-Kommunikation Netzwerkprogrammierung 5
M allgemeine Frage zu einem Web Service Client Netzwerkprogrammierung 2
Q Frage zur Socketprogrammierung Netzwerkprogrammierung 12
D HTTP Frage zu Login & Session ID Netzwerkprogrammierung 5
D HTTP nochne frage zu http requests Netzwerkprogrammierung 6
D "Fileserver" Frage + Mit Java zugreifen Netzwerkprogrammierung 9
S Socket-Frage zu einem LAN-Spiel. Netzwerkprogrammierung 3
Helgon Socket Socket IP Frage + Tutorial/Bücher Netzwerkprogrammierung 5
C Webservice Frage Netzwerkprogrammierung 2
M RMI Code Frage: Netzwerkprogrammierung 4
C Frage zur Klasse DatagramPacket Netzwerkprogrammierung 2
S Einfache Server Frage Netzwerkprogrammierung 5
xDarkSunx Kleine Frage authentifizierung Netzwerkprogrammierung 13
G Frage zu Servlets und deren Objekte + Bilder in Servlets anzeigen? Netzwerkprogrammierung 11
H Input-/OutputStream Frage Netzwerkprogrammierung 6
N Frage zu JNDI Netzwerkprogrammierung 2
B Frage zu einer Lösung (RMI) Netzwerkprogrammierung 2
X FAQ Frage - Netzwerkgrundlagen - ServerSocket und Socket Netzwerkprogrammierung 4
G Netzwerk IP Frage Netzwerkprogrammierung 4
S NanoHTTPD Server frage Netzwerkprogrammierung 5
E einfache Frage: wie Fehler untersuchen mit Tomcat Netzwerkprogrammierung 5
E Einfache Frage zu servlets und netbeans 6.5 Netzwerkprogrammierung 41
N Frage/Problem mit RMI Netzwerkprogrammierung 3
Kr0e Frage zu SO_TIMEOUT Netzwerkprogrammierung 3
K SCP und die Frage: Wie geh ich damit um? Netzwerkprogrammierung 7
K Frage zum Verhalten von SocketChannel.write(.) Netzwerkprogrammierung 9
G Frage zu Serversocket-Beispiel aus der FAQ Netzwerkprogrammierung 17
A Frage zur Verschlüsselung mit CipherInputStream Netzwerkprogrammierung 7
H Frage zu RMI Netzwerkprogrammierung 4
5 Grundlegende Design-Frage zu Webservices Netzwerkprogrammierung 16
C Frage zur ipcam WVC54GC von linksys ? Netzwerkprogrammierung 1
ven000m Mittlere Wartezeit Frage Netzwerkprogrammierung 5
T Frage bei Irc Verbindung Netzwerkprogrammierung 10
ven000m Frage aus einer mündl. Prüfung - wer kennt die Antwort? Netzwerkprogrammierung 6
S Serveranfrage - allgemeine Frage Netzwerkprogrammierung 2
ven000m Thread Frage Netzwerkprogrammierung 11
D Frage: Buffered Reader --> Wie komm ich an die Daten (Byt Netzwerkprogrammierung 3
H Frage zur Performance Netzwerkprogrammierung 10
flashfactor Frage zu HTML-Response Netzwerkprogrammierung 4
S GEHT DAS? - Nur eine Frage! (Printer Port direkt ansteuern?) Netzwerkprogrammierung 4
K Frage zu Net Send Netzwerkprogrammierung 7
G Frage zu JNDI / RMI Netzwerkprogrammierung 4
A ServerSocket prinzipielle Frage Netzwerkprogrammierung 5
M generelle Frage zum Versenden Netzwerkprogrammierung 4
L Frage nach Socket Netzwerkprogrammierung 4
E frage zu streams Netzwerkprogrammierung 2
Luma Verschiedene Frage zu nem Netzwerkprog Netzwerkprogrammierung 6
G einfache Frage zu ServerSocket ... Netzwerkprogrammierung 5
T TCP mit und ohne Threads Netzwerkprogrammierung 1
Yonnig Threads mit Client/Server und GUI (laufend bis button-click) Netzwerkprogrammierung 9
K Threads/Server/telnet Fehler Netzwerkprogrammierung 2
D Exception Handling bei In/Outputsockets in eigenen Threads Netzwerkprogrammierung 1
K Threads closen und Sockets schliessen Netzwerkprogrammierung 5
J Threads & Streams Netzwerkprogrammierung 9
P RMI Threads die über RMI auf Datenbank zugreifen Netzwerkprogrammierung 2
S HTTP ServerSockets und Threads Netzwerkprogrammierung 5
B Sockets, Threads & Plugins Netzwerkprogrammierung 7
T Verbindungsversuche über TCP Sockets von mehreren Threads führt zu Serverabsturz Netzwerkprogrammierung 2
R Threads mit einem WebService Netzwerkprogrammierung 4
M Verständnisfrage zu RMI und Threads Netzwerkprogrammierung 2
L einfacher server ohne threads Netzwerkprogrammierung 4
A Threads auflisten und nacheinander ansprechen Netzwerkprogrammierung 6
C I/O - Synchronisation durch Threads in einem ChatClient Netzwerkprogrammierung 4
J Probleme mit Threads (Client terminiert) Netzwerkprogrammierung 4
P Threads einbinden Netzwerkprogrammierung 11
P RMI Callback (mit Threads?) Netzwerkprogrammierung 3
T RMI Threads und Synchronized Netzwerkprogrammierung 13
A Datenverteilung: Mehrere Threads verwenden? Netzwerkprogrammierung 4
S Threads beim Server koordinieren Netzwerkprogrammierung 5
L ClientServer mit 2 Threads Netzwerkprogrammierung 5
N Threads und Socketprogrammierung Netzwerkprogrammierung 4
G 1 Socket 2 Threads problem Netzwerkprogrammierung 13
K Problem mit Threads Netzwerkprogrammierung 3
S Threads bei Web Service sinnvoll oder Alternative? Netzwerkprogrammierung 2
K Hintergrund - Threads Netzwerkprogrammierung 3
G Socket Programmierung - Max. Threads Netzwerkprogrammierung 5
C NetScanner arbeitet trotz Threads langsam Netzwerkprogrammierung 6
L UDP-Server mit Threads Netzwerkprogrammierung 8
K Windows 10 Threads gleichzeitig Netzwerkprogrammierung 18
C Join von Threads bei I/O-Operation Netzwerkprogrammierung 6
F Threads synchronisieren mit Pipes Netzwerkprogrammierung 3
G benötige Beispiel für parallel ablaufende Threads Netzwerkprogrammierung 3
F Problem mit Threads und Sockets Netzwerkprogrammierung 3
TRunKX Threads beenden sich selber? Netzwerkprogrammierung 6
T Kleiner Chatserver: Threads oder Multiplex? Netzwerkprogrammierung 18
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

Ähnliche Java Themen

Neue Themen


Oben