Datei Übertragung (Socket) klappt nicht bei Auslastung des PC

BuddaAtWork

Grünschnabel
Hallo Leute!

Ich bin dabei eine Datei über ein Socket von einem Rechner zu einem anderen zu senden.
Momentan teste ich noch nur lokal bei mir mittels "Localhost".
Dies geschieht bei mir folgendermaßen (Die größe der Datei sende ich vorab):

Senden:
Java:
            byte[] buffer = new byte[1024];
            InputStream inputStream = new FileInputStream(file);
            OutputStream outputStream = m_socket.getOutputStream();
            int len = 0;
            while ((len = inputStream.read(buffer)) > 0) {
                if (ServerControl.isCancelled())
                    break;
                outputStream.write(buffer, 0, len);
            }

Empfangen:
Java:
        byte[] buffer = new byte[1024];
        int len = 0;
        int currentFileSize = 0;
            do {
                len = (Integer) in.read(buffer);
                fileOut.write(buffer, 0, len);
                currentFileSize += len;
                System.out.println("received: " + currentFileSize + " fileSize: " + fileSize);
            } while ((currentFileSize)< fileSize);
            fileOut.close();
"in" ist hierbei ein BufferedInputStream vom Socket.

Dies funktioniert auch wunderbar wenn mein laptop nicht ausgelastet ist. Wenn ich allerdings den Vorgang starte, während ich beispielsweise SUPER PI laufen lasse, wird die Datei nie vollständig empfangen und der Empfänger bleibt in der while schleife hängen.

Hat jmd von euch einen Rat?

Gruß
BuddaAtWork
 
Zuletzt bearbeitet:
Hi,

ich würde dies pragmatisch angehen.

Die Ressourcenverwaltung dem Betriebssystem überlassen.
Abstand nehmen, von Programmen welche nicht sinnvoll über die Ressurcenverwaltung des Betriebssystem gesteuert werden.

Alternativ allerdings nicht empfehlenswert, erzwingen einer höheren Prozesspriorität für den Javaprozess als für die Konkurenz.
 
Ping Pong ;)

nicht verstanden? :D

Wenn du Daten Überträgst gibt es verschiedene Möglichkeiten sicher zu stellen das die Daten auf der anderen Seite ankommen.

Im Internet kommt es immer wieder zu Daten Verlusten die werden im Hintergrund ausgeglichen. Freund Google wird genauer helfen als ich.

Eine Möglichkeit: Dein Sender wartet auf eine Rückantwort das der Empfänger die Daten erhalten hat. Wenn dieser keine Antwort erhält sendet er die Pakete noch einmal. Der Empfänger Vergleicht eingehende Daten mit bereits erhaltenen und verwirft bereits erhaltene.
 
@wakoz
An den Datenverlusten sollte es eigentlich nicht liegen, wenn er an die LoopBack-Adresse (localhost) sendet, sonst hätte er grundlegende Hard- oder Softwareprobleme.

@BuddaAtWork
probier mal die priorität der beiden Threads zu erhöhen - oder besser die von SuperPi zu reduzieren. Oder du nutzt ein Betriebssystem mit besserem Resourcen-Management, wie z.B. ein Linux (Ubuntu ist gut für Einsteiger geeignet)
 
Vielen Dank für eure Antworten!

Zunächst möchte ich das Szenario genauer beschreiben.
Ich habe ein Programm (A) mit GUI und ein Programm (B), das als Service läuft.
A: läuft auf einem Rechner und verbindet sich falls gewünscht mit verschiedenen Rechnern, auf dem B läuft
B: läuft auf verschiedenen Rechnern und wartet auf Aufgaben von A
Es werden ausschließlich Windows Systeme sein! Kann ich nicht beeinflussen.
Super Pi verwende ich als Testszenario, da ich davon ausgehen kann, dass auf den Systemen mit B viel Last sein wird (durch einen JBOSS auf den ich auch keinen Einfluss habe).

Den Vorschlag mit den Prioritäten habe ich nun getestet.

1. A und B haben eine erhöhte Priorität, Super Pi normal [funktioniert nicht]
2. A und B haben eine erhöhte Priorität, Super Pi eine niedrige [funktioniert]
3. A normal B hat eine erhöhte Priorität, Super Pi eine niedrige [funktioniert nicht]
4. A erhöht B hat eine normale Priorität, Super Pi eine niedrige [funktioniert nicht]

Ich kann allerdings nicht einfach so die Priorität von dem JBOSS auf den Systemen von B runterstufen, dann bin ich einen Kopf kürzer ;-).

Ist es denn eher ein Problem seitens Windows (die angesprochene Resourcenverteilung)?
Oder kann man doch noch über java die beiden Programme verändern, dass die Übertragung auch bei Last funktioniert?


Ich werde mal Wakoz Vorschlag ausprobieren.
 
Ich bekomm es nicht hin....

Es kann doch nicht sein, dass während der Übertragung was verloren geht, nur weil der Rechner ausgelastet ist?

Bin über jede weitere Anregung zur Lösung des Problems glücklich...
 
… Kann ich mir auch nicht vorstellen. Aber die Pakete haben normalerweise eine TTL und Verbindungen werden automatisch nach eine festgesetzten Zeit abgebrochen.
Allerdings erzeugt SuperPi eine extrem hohe CPU-Last, was nicht ganz realistisch ist, ich glaube nicht, dass euere Server so überlastet sind.
 
Wenn ich SuperPi starte, hat das bei mir im TaskManager immer eine last von ca. 50%.

Jetzt kommt was kurioses...
Ich wollte mir einfach mal die byte Arrays ausgeben, die ich versende.
Dabei gebe ich einen Counter aus, der angibt bei dem wievielten byte Array ich bin und das Array selbst.

Nun das seltsame:
1. der Client empfängt ganz zu beginn ein byte Array, das vom Service gar nciht versendet wurde. -->
Client:
Counter: 0 - 54 , 48 , 48 , 13 , 10 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ....
Counter: 1 - 80 , 75 , 3 , 4 , 20 , 0 , 8 , 0 , 8 , 0 , -60 , 122 , 53 , 62 , 0 , 0 ....

Service:
Counter: 0 - 80 , 75 , 3 , 4 , 20 , 0 , 8 , 0 , 8 , 0 , -60 , 122 , 53 , 62 , 0 , 0 , ....
Counter: 1 - -27 , -59 , 63 , -58 , 62 , -26 , 79 , -92 , 120 , 124 , 120 , 38 , ....

2. WENN ich das tue, funktioniert das ganze auch unter Last :eek: Es reicht sogar aus die werte nur in einer HashMap zu speichern, ich muss sie nciht mal ausgeben und es funktioniert trotzdem unter Last. o.ô


Das soll mir mal einer erklären xD

Naja, das wars erstmal für mich, Wochenende ruft. Bis nächste Woche :)
 
So, nun habe ich das serverseitige Programm als Service auf zwei VMs laufen.
Port wird von denen belegt und kein anderer kann ihn verwenden.
Die VMs haben eine besch****** Leistung. Sie sind während der Bearbeitung eigentlich immer bei 100 % Auslastung.

Jedenfalls werden die Dateien wieder nicht komplett übertragen. Ich habe keine Ahnung was ich noch tun kann.
 
Zurück