Einen HandlerThread, der mehrere Verbindungen verwaltet?

Status
Nicht offen für weitere Antworten.

uNiKoMpLeX

Mitglied
Hallo zusammen!

Habe da ein kleines Problem, dass mir aber eine Menge Kopfzerbrechen bereitet:
Ich benutze derzeit für jeden Client, der bereits erfolgreich eingeloggt ist und sich in einem Raum befindet einen eigenen Thread, der diese Verbindung verwaltet. Sollte die Verbindung gekappt werden, wird eine IOException ausgegeben.
Wenn man nun davon ausgeht, dass sich zu Stoßzeiten ungefähr 500 User im Chat aufhalten, steigt die Anzahl der Threads natürlich auch auf 500. Nun sind ja Threads nicht unbedingt Ressourcensparer und es ist nun ja auch nicht unbedingt schonend für die CPU, wenn sie ein Programm mit mehr als 500 Threads verwalten müsste.

Ich habe nun versucht, einen einzigen Thread damit zu beauftragen, alle Verbindungen zu verwalten (die Clientdaten werden über 'ne HashMap gespeichert). Durch einen Iterator holt sich nun dieser Thread zuerst die Client-Klasse und überprüft dann den in der Klasse befindlichen InputStream, ob noch eine Verbindung besteht (
InputStream in;
.
.
.
if((in.read())!=-1)...
.
.
.
)(wenn ja, ist die Verbindung noch erhalten, wenn nein, erzeugt der Thread eine IOException).
Nun wird aber die Schleife, die den Iterator ausliest, solange durch die read() Methode blockiert, bis die Verbindung des ersten Clients geschlossen wurde; danach wird erst der nächste überprüft und dort blockiert diese read() wieder....

Nun grübel ich schon die ganze Zeit, wie man dieses Problem am besten lösen kann, komme aber auf keine Antwort.
Mein Ziel wäre ein Thread, der überprüft, ob die Verbindung zu den Clients noch steht, aber ohne dass die Schleife solange blockiert, bis dieser Zustand für den ersten wirklich zutrifft.

Hätte jemand einen Vorschlag?
:roll:

Liebe Grüße
Daniel


PS: Hier der Source des Threads


Code:
import java.util.HashMap;
import java.io.OutputStream;
import java.io.InputStream;
import java.io.IOException;
import java.util.Iterator;

public class Content extends Thread
{
    public static HashMap roomList=new HashMap(20),userList=new HashMap(50);

    public Content()
    {
        super("ContentThread");
        start();
        System.out.println("Content gestartet");
    }

    public void registerChannel(String id)
    {
        if(!roomList.containsKey(id))roomList.put(id,new Channel(id,false,true));
    }

    public void registerUser(String id,String nick)
    {
        if(!userList.containsKey(id))userList.put(id,new Client(id,nick));
    }

    public void deleteUser(String id)
    {
        if(userList.containsKey(id))userList.remove(id);
    }

    public void run()
    {
        Iterator it;
        Client cl=null;
        for(;;)
        {
            try
            {
                sleep(1000);
                it=userList.keySet().iterator();
                if(!userList.isEmpty())
                {
                    while(it.hasNext())
                    {
                        cl=(Client)userList.get((String)it.next());
                        if(cl.in.read()==-1)
                        {
                            System.out.println("Verbindung wurde unterbruchen");
                            deleteUser((String)cl.atr.get(0));
                            cl.close();
                        }
                    }
                }
            }catch(IOException e)
            {
                e.printStackTrace();
                deleteUser((String)cl.atr.get(0));
                cl.close();
            }catch(NullPointerException e11){/*ignore*/}
            catch(InterruptedException e1){/*ignore*/}
        }
    }
}
 
S

stev.glasow

Gast
erstmal:
mit aSocket.setSoTimeout(1000) [serverseitig] kannst du verhindern, dass er beim Lesen nicht blockiert. In diesem Fall würde er eine java.net.SocketTimeoutException werfen wenn nach einer Sekunden nichts vom Client geschreiben wurde.

aber: warum machst du nichts mit den gelesen Daten? willst du nicht wissen was der Client geschrieben hat?
Und die IOExceptions würde ich in der Schleife abfangen.

und: Weiß nicht ob wie du beschrieben hast 500 Thread zum Problem werden, aber einer wird es auf jeden Fall, denn selbst mit diesem SocketTimeout würde das Kommunizieren mit 500 Clients ewig dauern. Kannst du nicht pro Thread 10 Clients verwalten?
 

uNiKoMpLeX

Mitglied
ja eben genau dass möchte ich erreichen (x Clients durch einen Thread verwalten).

Die Anfrage wird bereits von einem Thread abgefangen und dort behandelt. Sollte sich User x nun einlogen wollen, erstellt der Server ein Clientobjekt mit den diversen Variablen, die dann im Chat benutzt werden sollen (ID, Farbe, Socket). Es wird die "Eingangs"-Seite an den Client geschickt und die ClientKlasse wird dann in der userList registriert.

Somit hat der Thread nichts anderes zu tun als zu prüfen, ob die Verbindung überhaupt noch steht.
Danke für die Antwort, du hast mich gerade auf eine Idee gebracht :)

Lg Daniel
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
F http Post auf einen Grafana Server Netzwerkprogrammierung 3
izoards Mehrere TCP Verbindungen auf einen Server [alles Local] Netzwerkprogrammierung 2
S Java: Anbindung an einen realen Server? (+ Portfreigabe) Netzwerkprogrammierung 8
X Kann ich einen Client/Server verbindung hinkriegen die mir alle paar Sekunden die aktuellen Daten per Realtime zuschickt ? Netzwerkprogrammierung 9
E Kurze Textnachrichten über einen Server von meinem Handy auf den Computer laden. Netzwerkprogrammierung 9
D Socket Message an einen Server senden? Netzwerkprogrammierung 8
C Inhalt einer .JPG Datei in einen OutputStream schreiben? Netzwerkprogrammierung 10
M jsf-seite beim hinzufügen einer csv-datei in einen ordner aktualiseren Netzwerkprogrammierung 0
C Client connection per Portforwarding auf einen lokalen Serverport Netzwerkprogrammierung 3
P Wie spreche ich einen Thread an? Netzwerkprogrammierung 20
P Was brauche ich alles / wo sollte ich einen Blick drauf werfen? Netzwerkprogrammierung 17
E Wie kann man einen einfachen E-Mail Server schreiben Netzwerkprogrammierung 2
T HTTP Einen HTTP Server erstellen Netzwerkprogrammierung 20
Z Socket [Chatprogramm] Mehrere Clients an einen Server Netzwerkprogrammierung 10
N Einen Server als ausführbare Datei exportieren Netzwerkprogrammierung 15
C Socket Probleme beim Lesen und Schreiben aus/in einen Socket Netzwerkprogrammierung 2
M Socket JavaProg über einen Clienten steuern Netzwerkprogrammierung 5
I HTTP Grundlagen um einen Webserver zu erstellen Netzwerkprogrammierung 17
C An WebDAV einen "MKCOL" Befehl versenden Netzwerkprogrammierung 4
D Schreiben auf einen TCP/IP Socket Netzwerkprogrammierung 2
K HTTP-Anfrage an einen Server wird nicht beantwortet Netzwerkprogrammierung 3
H String Array durch einen Stream schicken. Netzwerkprogrammierung 4
L Mit Java auf Forum einloggen und dann einen Threat erstellen Netzwerkprogrammierung 4
R Mehrere Dateien über einen Socket senden Netzwerkprogrammierung 2
L mehrere Streams über einen Socket? Netzwerkprogrammierung 8
A Wichtig für einen Chat? Netzwerkprogrammierung 4
V Mehrere Streams durch einen Stream senden Netzwerkprogrammierung 14
V PC der an einen Router angeschlossen ist aus dem... Netzwerkprogrammierung 13
V Einen Eintrag aus einer Zip Datei von einem Server laden Netzwerkprogrammierung 2
M Wie programmiere ich einen FTP - Server Netzwerkprogrammierung 2
André B. In einen InputStream schreiben? Netzwerkprogrammierung 6
T Html-Source über URL in einen String speichern? Netzwerkprogrammierung 16
P Verschiedene Daten über einen Stream Netzwerkprogrammierung 4
T Mit FTP verbinden, einen Ordner erstellen und Datei löschen Netzwerkprogrammierung 3
M Socket Verbindungen für einen Chat Netzwerkprogrammierung 10
T file auf einen server laden Netzwerkprogrammierung 4
A Zugriff auf einen fremden Monitor im lan Netzwerkprogrammierung 3
Aruetiise Socket Mehrere Clients Netzwerkprogrammierung 4
E Mehrere Sockets Netzwerkprogrammierung 2
C Mehrere Spielewelten im Multiplayer Netzwerkprogrammierung 2
J Framework mehrere Clients/ Server-Broadcast/oracle XE/ XML Netzwerkprogrammierung 1
V Server / mehrere Clients / MySQL / Konzept Netzwerkprogrammierung 2
S Server - Mehrere Klassen sollen Daten senden und empfangen Netzwerkprogrammierung 25
Creylon Socket Mehrere gleichzeitig eingehende Nachrichten Netzwerkprogrammierung 8
N SOCKET mehrere Requests, keep Alive serverspezifisch? Netzwerkprogrammierung 3
7 Mehrere Verbindungen gleichzeitig in einem Thread mit ApacheHTTP Netzwerkprogrammierung 7
V Authentifikation über mehrere Server? Netzwerkprogrammierung 3
G Socket Mehrere Clientanmeldungen am Server Netzwerkprogrammierung 13
D Mehrere Clients über Java-Sockets Netzwerkprogrammierung 13
cedi Socket Mehrere Clients an einem Server Netzwerkprogrammierung 4
B SSH mit Jsch, mehrere Befehle senden Netzwerkprogrammierung 4
F Socket Verbindungen über mehrere Server Netzwerkprogrammierung 4
M Jetty Konfiguration mehrere Handler? Netzwerkprogrammierung 2
F UDP Server - mehrere Pakete auf einmal Netzwerkprogrammierung 12
A Mehrere gleich Packete behandeln Netzwerkprogrammierung 4
L Socket Chat Server für mehrere Clients Netzwerkprogrammierung 7
R mehrere MySQL-Zugriffe Netzwerkprogrammierung 3
B Paralleler Dateitransfer: Ein Client - Mehrere Sockets? Wie connecten? Netzwerkprogrammierung 16
S Mehrere Attachments mit JavaMail API auslesen Netzwerkprogrammierung 3
O Mehrere Datei per DataInput/OutputStream über Socket Netzwerkprogrammierung 12
A Datenverteilung: Mehrere Threads verwenden? Netzwerkprogrammierung 4
T Netzwerkchat Problem: Mehrere Nachrichten ~ Anfängerproblem Netzwerkprogrammierung 3
W Bestimmt IP Adresse verwenden wenn man mehrere hat Netzwerkprogrammierung 5
D Clients sollen mehrere Sessions starten Netzwerkprogrammierung 11
A Jakarta Commons HTTPClient: Mehrere Requests gleichzeitig Netzwerkprogrammierung 2
G Nachricht an mehrere Clients schicken Netzwerkprogrammierung 10
E Mehrere / bestimmte Netzwerkkarten ansteuern Netzwerkprogrammierung 10
F Mehrere Attachments mit JavaMail API Netzwerkprogrammierung 2
G Proxy und mehrere Verbindungen Netzwerkprogrammierung 4
G Mehrere SSL Verbindungen Netzwerkprogrammierung 2
A Mit Client auf mehrere Server zugreifen Netzwerkprogrammierung 5
M Mehrere Ports gleichzeitig abhören Netzwerkprogrammierung 5
TRunKX Ein Port mehrere Verbindungen? Netzwerkprogrammierung 7
G Server an mehrere Clients Netzwerkprogrammierung 15
L JavaMail: Automatisches Email Versand (mehrere Empfänger) Netzwerkprogrammierung 4
X mehrere Request über eine HttpURLConnection Netzwerkprogrammierung 2

Ähnliche Java Themen

Neue Themen


Oben