PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Netzwerkverbindung auslasten mit Java Sockets


Micha80
2006-10-29, 09:48:15
Hallo,

ich versuch schon das ganze WE über einen kontinuierlichen Datenstrom (Client - Server) hin zu bekommen.

Aufbau 1:

Der Client schickt einen DataOutputStream Richtung Server. Dieser wiederum schickt die Zeichen zurück (Echo). Funktioniert auch - allerdings nur wenn die Zeichenkette nicht zu lang ist und/oder nicht zu oft gesendet wird.

Aufbau 2:

Der Client verbindet sich mit dem Server. Der Server schickt das Aktuelle Datum/Uhrzeit zurück.
Der Client läuft in einer Endlosschleife - allerdings bricht die Verbindung nach kurzer Zeit ab wenn beide JVMs auf einem PC laufen.
Mit 2 PCs ist der Datenstrom stabil - allerdings ist die CPU Auslastung auf beiden Rechnern >60%, aber die LAN Auslastung liegt nur bei rund 4% (100MBit).


Ziel:

Ich möchte einen kontinuierlichen Datenstrom zwischen Client - Server generieren, dessen Dauer ich bestimme ;) und der eine "echte" Netzwerkauslastung erzeugt.


Vielen Dank für die Hilfe

Micha

Gast
2006-10-29, 10:05:49
Hallo, Java ist dafür leider zu langsam. Da musst du schon zu C oder C++ greifen.

Monger
2006-10-29, 10:44:39
Ich bin mir nicht ganz sicher, ob das überhaupt geht.

Bei Java sitzt ja erst der Connection Pool vorne dran, und dahinter halt die Netzwerkschnittstelle von Windows. Afaik achten beide darauf, dass über die Verbindung nicht zu viel Unsinn angestellt wird. Ständige Verbindungsanfragen vom Client könnten als Attacke gewertet, und nach einer Weile einfach ignoriert werden. Und genau das versuchst du doch hier, oder? ;)
Außerdem darf ein ausgelastetes Netzwerk nicht andere Programme beeinträchtigen, also werden Anfragen niederprior behandelt. Da wird dann auch schonmal eine Anfrage abgelehnt, wenn es grad wichtigeres zu tun gibt.

Trap
2006-10-29, 13:41:56
Netzwerk auslasten ist sehr einfach:
UDP Socket nehmen und größere byte[] (>4 kB) als Puffer benutzen.

Die richtigen Klassen für highperformance-Netzwerkzeug findet man in Java da: http://java.sun.com/j2se/1.4.2/docs/guide/nio/ aber für einfaches Netzwerk zumüllen sollte das normale Interface noch reichen.

Micha80
2006-10-29, 19:02:01
Danke für die Hinweise! Ich werde weiter probieren und testen.

HellHorse
2006-10-30, 22:50:08
Netzwerk auslasten ist sehr einfach:
UDP Socket nehmen und größere byte[] (>4 kB) als Puffer benutzen.

Die richtigen Klassen für highperformance-Netzwerkzeug findet man in Java da: http://java.sun.com/j2se/1.4.2/docs/guide/nio/ aber für einfaches Netzwerk zumüllen sollte das normale Interface noch reichen.
Solange du jeweils einen Thread hast der konstant reinschreibt und einen der konstant rausliest sollte das recht simpel sein. Wenn du aber ständig Verbindungen auf- und abbaust, und im ping-pong Verfahren arbeitest ......
Ausserdem ist laut einem Tomcat Entwicker NIO erst ab 1.6 ausserhalb von Solaris sinnvoll nutzbar.

Micha80
2006-11-01, 15:07:38
So, jetzt rennts wie die Sau ;)

Volle LAN Auslastung. Mir hat nur ein Buffer gefehlt.

Client:

// Versuche Socket Port zu öffnen
clientSocket = new Socket(DateClient.getHost(), DateClient.getPORT());

// Öffnet input und output Stream
output = new DataOutputStream(clientSocket.getOutputStream());
inFile = new DataInputStream(new BufferedInputStream(new FileInputStream("Test")));

// Buffer dimensionieren
byte[] buffer = new byte[1024];

if (clientSocket != null && output != null && (isInterrupted() != true)) {
try {
// Schleife schreibt Output
for (int n; (n = inFile.read(buffer)) != -1; output.write(buffer, 0, n));
} catch (IOException e) {
System.out.println(e);
}
}

Server:

// Versuche Socket Port zu öffnen
socket = new ServerSocket(DateServer.getPORT());

// Erzeugt ein Objekt von ServerSocket
while (((clientSocket = socket.accept()) != null) && (isInterrupted())!= true){

// Öffnet input und output Stream
input = clientSocket.getInputStream();
outFile = new FileOutputStream("TestServer");

// Buffer dimensionieren
byte[] buffer = new byte[1024];

// Schreibt Client Adresse ins Textfeld
DateServer.txtDayTime.setText("" + clientSocket.getInetAddress());

// Speicher Prozedur
for (int n; (n = input.read(buffer)) != -1; outFile.write(buffer, 0, n));
}

WerWolf
2006-11-02, 13:08:54
Hallo, Java ist dafür leider zu langsam. Da musst du schon zu C oder C++ greifen.
Was also nun widerlegt wurde... sauber! ;D