Requests über ein Socket

Status
Nicht offen für weitere Antworten.
J

jacquipre79

Gast
Hallo,

ich hatte vor einigen Tagen schon mal einen Thread eröffnet, aber leider keine Antwort erhalten. Nun habe ich ein ähnliches Problem.

Es ist so, dass wir hier einen Webserver entwickelt haben, der Requests des Browsers (IE) empfängt und diese über jeweils eine Connection (Socket) via Servlets beantwortet. Der Socket wird anschließend geschlossen. Das Problem ist, dass dieses Neuaufbauen von Verbindungen und Schließen dieser zu Performance-Problemen geführt hat. Deshalb jetzt die Idee, eine Verbindung für mehrere Requests offen zu halten. Ich habe das soweit versucht, zu implementieren. In meinem Testbeispiel werden nun nicht mehr 8 Verbindungen geöffnet, also so:
Code:
Request A (Connection 1)
Request B (Connection 2)
Request C (Connection 3)
Request D (Connection 4)
Request E (Connection 5)
Request F (Connection 6)
Request G (Connection 7)
Request H (Connection 8)

Stattdessen werden jetzt 2 Verbindungen geöffnet, was ich nicht ganz verstehe, weil ich - so denke ich - den Code so geschrieben habe, dass nur eine Verbindung entstehen soll. Im Moment sieht das also so aus:


Code:
Request A  (Connection 1)
Request B (Connection 1)
----- Request C (Connection 2)
Request D (Connection 1)
----- Request E (Connection 2)
Request F (Connection 1)
----- Request G (Connection 2)
Request H  (Connection 1)

Habt ihr eine Ahnung woran das liegen könnte?

Hier mal Auszüge aus dem Code zum besseren Verständnis:

Server Klasse
Code:
while (this.isRunning()) {
try {
    socket = serverSocket.accept();
    synchronized (socket) 
    {
           MyConnection connection = new MyConnection(this, socket);                        
           Thread thread = new Thread(connections, connection, "DEBUG_" + counter );
           counter++;
           thread.setDaemon(true);
...
    }
}

MyConnection - run()
Code:
try
{
while(true)
{
     if (socket == null || socket.isClosed()) break;
 
     line = in.readLine();
     if (line == null)  break;
     else if (!readFirstLine && (line.trim().length() > 0))
     {
	// parse the first Header line
	boolean ok = parseFirstHeaderLine(line);
	if (!ok) break;
	readFirstLine = true;
		                		
     }
     // read header values and add to header map
    else if (line.trim().length() > 0)
   {
	int colonPos = line.indexOf(":");
        if (colonPos > 0) 
        {
                String key = line.substring(0, colonPos);
                String value = line.substring(colonPos + 1);
                headers.put(key, value.trim());			
         }
     }
     else
     {
	         checkForPostRequest();
		 // process request (search servlet and send response)
		 processRequest();
		                		
		 // request ends, a new request will start
		 readFirstLine = false;
		 headers.clear();
		 requestParameters.clear();
	}
		                	
}
}
catch(IOException e)
{
...
}
finally
{
// close socket
}

Für Hinweise oder Hilfe wäre ich wirklich sehr dankbar.

jacquipre
 

kleiner_held

Top Contributor
Das Oeffnen der Verbindungen geht vom Browser aus - da kannst du nicht verhindern, dass der unter Umstaenden eine zweite Verbindung aufmacht.

PS: eine Mischung aus eigenem SocketServer und Servlets ist nunja sehr exotisch
 
T

tuxedo

Gast
Aber eigentlich sollte doch das öffnen und schließen von Sockets recht fix gehen... Wie stark ist der Server denn frequentiert?

- Alex
 
J

jacquipre79

Gast
kleiner_held hat gesagt.:
Das Oeffnen der Verbindungen geht vom Browser aus - da kannst du nicht verhindern, dass der unter Umstaenden eine zweite Verbindung aufmacht.

Aha, aber der Code sieht richtig aus? Ich habe da nichts falsch gemacht? Der Browser macht das also eher zufällig...?

kleiner_held hat gesagt.:
PS: eine Mischung aus eigenem SocketServer und Servlets ist nunja sehr exotisch

Das kann wohl sein, aber die Firma, für die ich arbeite, brauchte nun mal einen eigenen Webserver für eigene Implementierungen (auch eigener Servlets). Das lässt sich nicht ändern und funktioniert auch wunderbar...

Danke
 
G

Guest

Gast
alex0801 hat gesagt.:
Aber eigentlich sollte doch das öffnen und schließen von Sockets recht fix gehen... Wie stark ist der Server denn frequentiert?

- Alex

Das Problem ist, dass einige Kunden mit VPN arbeiten und das Schließen der Sockets zu Verbindungsabbrüchen führte. Deshalb wurde ein SocketLinger mit 100 Sekunden für jeden Socket gesetzt, was das VPN-Problem beseitigte, aber gleichzeitig dazu führte, dass das Schließen der Sockets länger dauert. D.h., um eine bestimmte Aktion clientseitig auszuführen, z.b. Auswahl eines Elementes aus einer Dropdownliste, wurden mehrere Sockets geöffnet und geschlossen (jeweils mit SocketLinger), so dass diese Anforderung fast 3 Sekunden lang ist. Also viel zu lang :(
 
T

tuxedo

Gast
Hmm, ich kenne keine Socket-Verbindung die eine VPN-Verbindung dermaßen beeinflusst dass sie abgerochen wird.

Ich habe schonm mit PPTP und IPSec (Cisco VPN) gearbeitet. Und wenn man das als VPN betrachten kann: Via SSH getunnelte Socketverbindungen.

Es gab, bis auf den Cisco VPN-Client, der in allen meinen Java-Programmen (und auch manche andere Programme, beispielsweise Du-Meter) NaN Fehler hervorgebracht hat, nie derartige Probleme.

Ich denke der Fehler ist beim VPN zu suchen und nicht am Java-Code.

Was ich aber auch nicht so ganz verstehe: Entkoppel doch das Schließen des Sockets mit einem Thread.. Das bremst die Anwendung dann nicht. Und in nem Thread isses dann wurscht ob der 3sek braucht oder nicht...

Ist generell etwas "ungeschickt" eine Anwendung vom Netzwerk abhängig zu machen. Ich mein was die GUI und Wartezeiten im Netzwerk betrifft.

- Alex
 
J

jacquipre79

Gast
alex0801 hat gesagt.:
Hmm, ich kenne keine Socket-Verbindung die eine VPN-Verbindung dermaßen beeinflusst dass sie abgerochen wird.
Naja, so richtig abgebrochen wird sie durch VPN nicht, nur werden die Daten nicht vollständig gesendet, d.h. wenn die Response gesendet wurde, wurde der Socket schon geschlossen, aber es kam halt noch vor, dass einige Pakete noch "unterwegs" waren. Deshalb mußte der SocketLinger eingebaut werden. Ich bin auch später zu dem Projekt zugestoßen, dass ich die genauen, detaillierten Gründe nicht kenne, sondern nur generell weiß, warum das so gemacht wurde. Also sorry, wenn ich mich da etwas ungenau oder mißverständlich ausgedrückt habe.

Das, was ich jetzt teste, passiert ganz unabhängig von einem VPN. Mittlerweile habe ich gelesen, dass der Internet Explorer maximal 2 Persistent Connections aufbaut, d.h. dies würde ja meinem Szenario entsprechen. Ich vermute einfach, dass ich - wie kleiner_held schon meinte - keinen Einfluss darauf habe, wieviele Connections der Client (also IE) öffnet. Ich kann mir aber sicher sein, dass es max. nur 2 werden. Im tcpTrace sehe ich dann auch diese 2 Verbindungen mit Status "connected". Wenn keine weiteren Requests mehr vom Client kommen, dann werden diese Verbindungen nach einem Timeout geschlossen; der IE hat dafür standardmäßig 60 Sekunden vorgesehen. So die Theorie... Oder weiß jemand mehr?
 
T

tuxedo

Gast
Naja, wie gesagt:

Netzwerke sollten ein Programm nicht lahmlegen können. Sowas sollte man entsprechend mit Threads entkoppeln.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M HTTP Http requests aufzeichnen Netzwerkprogrammierung 2
T HTTPS-Requests an Server: POST-Parameter kommen nicht an Netzwerkprogrammierung 5
N CURL requests in Java Netzwerkprogrammierung 6
N Selbes URL Objekt für alle Requests nutzen Netzwerkprogrammierung 7
N SOCKET mehrere Requests, keep Alive serverspezifisch? Netzwerkprogrammierung 3
D HTTP nochne frage zu http requests Netzwerkprogrammierung 6
D HTTP Bräuchte hilfe mit Http Requests Netzwerkprogrammierung 6
A Jakarta Commons HTTPClient: Mehrere Requests gleichzeitig Netzwerkprogrammierung 2
M HTTP Requests verarbeiten und Response senden mit Java Netzwerkprogrammierung 14
K Tabelle im Web über Listener aufrufen Netzwerkprogrammierung 1
F Verbindung zu einem LDAP Server über Java Netzwerkprogrammierung 4
S Socket Bilder über Socket Senden Netzwerkprogrammierung 0
B Zip Dateien über FTP laden Netzwerkprogrammierung 2
x46 byte[] über BufferedReader auslesen Netzwerkprogrammierung 18
E Socket Parameter über Sockets übergeben und auslesen ! Netzwerkprogrammierung 5
L Webbasierte Anwendung - Authentifizierung über LDAP/ActiveDirectory Netzwerkprogrammierung 5
J Probleme mit Multicast über IPv6, DatagramChannel Netzwerkprogrammierung 1
S Daten über TCP/IP senden Netzwerkprogrammierung 3
T Broadcast-message über spez. Netzwerk-Schnittstelle Netzwerkprogrammierung 1
T Mikrofonaudio über Java Server an Webbrowser streamen Netzwerkprogrammierung 13
M Erstelltes Programm über Internet Browser ausführen Netzwerkprogrammierung 26
T VPN-Verbindung über Java Netzwerkprogrammierung 4
V Einfachen Javaserver über das Internet erreichbar machen Netzwerkprogrammierung 2
J FTP Upload über Proxy funktioniert nicht Netzwerkprogrammierung 1
E Kurze Textnachrichten über einen Server von meinem Handy auf den Computer laden. Netzwerkprogrammierung 9
J FTP FTP Zugriff über Proxy Server Netzwerkprogrammierung 1
Thallius Java Application über ZScaler benutzer? Netzwerkprogrammierung 0
J Chat Server starten über GUI problem Netzwerkprogrammierung 4
V einfaches hin und her von Text über Server Netzwerkprogrammierung 2
P RMI Client Server Programm über Internet Netzwerkprogrammierung 2
antonbracke Multiuser Software über XMPP Server Netzwerkprogrammierung 1
Z Verbindung zwischen 2 Rechnern über ServerSockets nicht möglich Netzwerkprogrammierung 3
cezary Socket ServerSocket starten über GUIIm unterstehenden Code versuche Netzwerkprogrammierung 6
I ASCII über serielle Schnittstelle Netzwerkprogrammierung 1
N RMI "RMI über Lan funktioniert nicht" & "RMI-Server im Lan scannen" Netzwerkprogrammierung 13
L Mit Java über PHP in MySQL anmelden (Login script) Netzwerkprogrammierung 3
M Socket String Arrays über Socket an Server schicken Netzwerkprogrammierung 2
T Socket Methoden über Internet aufrufen Netzwerkprogrammierung 1
S Socket Kommunikation über Internet Netzwerkprogrammierung 1
X Problem mit vielen Bytes über Socket Netzwerkprogrammierung 23
K ByteArray über Netzwerk senden klappt nicht Netzwerkprogrammierung 5
M allgemeine Frage über Server-Client-Kommunikation Netzwerkprogrammierung 5
P RMI Threads die über RMI auf Datenbank zugreifen Netzwerkprogrammierung 2
S Datei schreiben über Applet Netzwerkprogrammierung 8
G Klassen über Netzwerk kommunizieren lassen Netzwerkprogrammierung 6
J Erster Server-Client läuft auf lokalem Rechner problemlos. Zwei Rechner über das Internet nicht Netzwerkprogrammierung 8
Kjubert Synchronisieren von Objekten über Client/Server - bester Weg? Netzwerkprogrammierung 7
S ImageIcon über Socket schicken (Serialisierung) Netzwerkprogrammierung 6
H Socket Objekte über Socket? Allgemeine Verständnisprobleme in Sachen Socket Netzwerkprogrammierung 3
S Seltsames Verhalten beim Empfangen von Daten über DataInputStream Netzwerkprogrammierung 12
A TCP über UDP Verbindung? Netzwerkprogrammierung 10
C Datei über Socket schreiben und Ereignis lesen Netzwerkprogrammierung 9
D Socket Class über Netzwerk verschicken Netzwerkprogrammierung 2
D JNLP über Webstart funktioniert nicht... Netzwerkprogrammierung 2
J Socket Dateien über Socket auf Server speichern Netzwerkprogrammierung 3
D Socket Datei nur stückweise über Socket verschicken Netzwerkprogrammierung 6
G Bild über Socket schicken - Client/Server Netzwerkprogrammierung 10
A Computer über Internet verbinden Netzwerkprogrammierung 12
N über Java in eine Text-Datei auf einem Server schreiben Netzwerkprogrammierung 2
c_sidi90 ideale Lösung, Screen Capture über Netzwerk Netzwerkprogrammierung 3
S Socket Verschiedene Exceptions beim Übertragen von Bildern über Socket Netzwerkprogrammierung 20
T ArrayList über Netzwerk senden! Netzwerkprogrammierung 5
N Problem über http eine Datei zu senden Netzwerkprogrammierung 4
T Verbindungsversuche über TCP Sockets von mehreren Threads führt zu Serverabsturz Netzwerkprogrammierung 2
V Authentifikation über mehrere Server? Netzwerkprogrammierung 3
C Verbindung zu einem Hostrechner über das Internet herstellen Netzwerkprogrammierung 15
M Map über Webservice übertragen Netzwerkprogrammierung 3
D Mehrere Clients über Java-Sockets Netzwerkprogrammierung 13
P Socket Verbindung über das Internet Netzwerkprogrammierung 2
Z Socket Connection reset by peer nur per IP nicht über localhost Netzwerkprogrammierung 13
ruffio1978 Telnet über ein socket ansprechen Netzwerkprogrammierung 8
F Socket Verbindungen über mehrere Server Netzwerkprogrammierung 4
U Datei über das Netzwerk einlesen und speichern Netzwerkprogrammierung 8
G Klassen über JMX per URLClassloader laden? Netzwerkprogrammierung 2
E Zwei PCs über das Internet miteinander verbinden? Netzwerkprogrammierung 3
E Socketverbindung über das Internet - Timeout? Netzwerkprogrammierung 28
M Socket Bilder über das Netzwerk übertragen Netzwerkprogrammierung 4
E Java über Socket ins Internet? Netzwerkprogrammierung 4
F Socket Daten über verschiedene IP's schicken Netzwerkprogrammierung 5
M Socket JavaProg über einen Clienten steuern Netzwerkprogrammierung 5
M Mail über Exchange versenden Netzwerkprogrammierung 13
F C/S über HTTPS Netzwerkprogrammierung 2
D ...class.getResourceAsStream("/meine.properties") funktioniert nicht über RMI? Netzwerkprogrammierung 3
M ganymed-ssh2.har: ftp-Verbindung über ftp-Proxy Netzwerkprogrammierung 2
J Probleme bei RSA mit byte[] bei Versand über RMI Netzwerkprogrammierung 2
Z File über Socket lesen Netzwerkprogrammierung 3
A HTTP Binärdaten über PHP-Skript in Datenbank schreiben bzw auslesen Netzwerkprogrammierung 2
M Objekt über Object-Stream, empfange "alte" Daten Netzwerkprogrammierung 2
P FTP isFile() über FTP Netzwerkprogrammierung 3
I Socket HTTP Nachrichten über Sockets verschicken Netzwerkprogrammierung 2
N String als byte Array über Socket versenden Netzwerkprogrammierung 8
M Objekt über socket senden/empfangen Netzwerkprogrammierung 3
N Socket File über Socket vom Server an Client versenden Netzwerkprogrammierung 15
P Socket Problem mit Netzwerkverbindung über TCP Netzwerkprogrammierung 12
A UCP Connection über Proxy möglich? Netzwerkprogrammierung 7
V Verbindung zweier Rechner über das Internet mit Sockets Netzwerkprogrammierung 8
F Char über Netzwerk senden Netzwerkprogrammierung 6
S HTTP Login mit CAS Authentisierung über SSL Netzwerkprogrammierung 2
C Befehle über ein GUI an Server senden Netzwerkprogrammierung 15
M Socket Datei über Socket versenden Netzwerkprogrammierung 5

Ähnliche Java Themen

Neue Themen


Oben