# SOCKET mehrere Requests, keep Alive serverspezifisch?



## newbie2009 (27. Sep 2012)

hey Leute, 

bräuchte mal ganz dringend Hilfe  

Also ich versuche einen Socket zu erstellen, der dann eine Anfrage versendet. Ich möchte , dass der Socket nicht geschlossen wird, um dann weitere Anfragen zu verschicken. Allerdings wird der Socket immer geschlossen.  Das Problem ist, dass ich das beim Webservice von geocoder.us es hinbekomme im response, ein "keep-alive" zu bekommen, aber es trotzdem bei der zweiten Anfrage zur Exception kommt, die besagt, dass der Socket schon geschlossen sei.


Beim Webservice von Flickr bekomme ich es nicht mal hin im Response ein keep-alive zu erhalten:


```
HTTP/1.1 200 OK
Date: Wed, 26 Sep 2012 22:49:16 GMT
P3P: policyref="http://info.yahoo.com/w3c/p3p.xml", CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV"
Content-Length: 186
Cache-Control: private
X-Served-By: www190.flickr.mud.yahoo.com
Vary: Accept-Encoding
Connection: close
Content-Type: text/xml; charset=utf-8
```



```
static String geoURL ="http://geocoder.us/";
	static String geoRequest ="/service/rest/geocode?address=1600+Pennsylvania+Ave,+Washington+DC";
	Socket socket;
	String host;
	
	public static void main(String [] args){
		
		iptransformer transformer = new iptransformer();
		transformer.openSocket(geoURL);
		transformer.makeGETRequest();
		
		transformer.makeGETRequest();
			
		
		
		
		
	}
	
	
	public void openSocket(String URL){
		try{
		InetAddress address = InetAddress.getByName(new URL(URL).getHost());
		int port =80;
		host = address.getHostName();
		String ipAddress = address.getHostAddress();
		socket = new Socket(ipAddress, port);
		
		System.out.println(socket.isConnected());
		}catch (Exception e){
			e.printStackTrace();
		}
		
		
		
	}
	
	
	public  void makeGETRequest(){

		try {
			
		
		
	
			
		    // Construct data
		  // String data =  "GET " + requestString + " HTTP/1.1 \r\n" + "Host: " + host + "\r\n";  
		
		    String data =  "GET " + geoRequest + " HTTP/1.1 \r\n" + "Host: " + host + "\r\n"+"Connection: keep-alive"+"\r\n";  
		    
		    socket.setKeepAlive(true);
		
		  System.out.println(data);

		    BufferedWriter wr = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "UTF8"));
		    wr.write(data);
		    wr.write("Content-Length: "+data.length()+"\r\n");
		    wr.write("Content-Type: application/x-www-form-urlencoded\r\n");
		    wr.write("\r\n");

		    // Send data
		    wr.write(data);
		    wr.flush();

		    // Get response
		    BufferedReader rd = new BufferedReader(new InputStreamReader(socket.getInputStream()));
		    String line;
		    while ((line = rd.readLine()) != null) {
		       System.out.println(line);
		    }
		    wr.close();
		    rd.close();
		} catch (Exception e) {
			System.out.println(e);
		}
	}
```

Sowohl das Aufrufen der Methode setkeepAlive(true), als auch das setzen des Connectionswertes im Header zeigt keine Wirkung.  Meine Frage ist es vielleicht serverspezifisch, dass flickr es einfach nicht erlaubt offene Verbindungen zu halten?




Vielen Dank im Voraus 

mfg newbie


----------



## Gast2 (27. Sep 2012)

newbie2009 hat gesagt.:


> Sowohl das Aufrufen der Methode setkeepAlive(true), als auch das setzen des Connectionswertes im Header zeigt keine Wirkung.  Meine Frage ist es vielleicht serverspezifisch, dass flickr es einfach nicht erlaubt offene Verbindungen zu halten?



Mit ziemlicher Sicherheit werden Dienste wie Flickr keep-alive Requests ignorieren... stell dir mal vor andere Programmierer machen das Gleiche und wie sich das auf den Dienst auswirken würde.

Zumal mei da momentan auch nicht klar ist warum du die Connection offen halten willst?


----------



## newbie2009 (28. Sep 2012)

fassy hat gesagt.:


> Mit ziemlicher Sicherheit werden Dienste wie Flickr keep-alive Requests ignorieren... stell dir mal vor andere Programmierer machen das Gleiche und wie sich das auf den Dienst auswirken würde.
> 
> Zumal mei da momentan auch nicht klar ist warum du die Connection offen halten willst?



Das war auch mein erster Gedanke, aber war mir nicht sicher. Naja der Sinn sei mal dahingestellt, aber ich untersuche gerade die SOAP-Schnittstelle von Webservices am Beispiel von flickr und einigen anderen Diensten. Ich wollte halt testen, ob ich eine Effizienzsteigerung erreichen kann, wenn ich die Verbindung offen halten kann und diese nicht immer wieder auf und abgebaut werden muss. 

mfg newbie


----------



## troll (4. Okt 2012)

KeepAlive ist eine HTTP/1.1 erweiterung und soll eigentlich die geschwindigkeit steigern da ständiges auf- und abbauen von TCP-verbindungen ziemlich langsam ist > TCP-SlowStart ...
in der regel kann der client (normalerweise browser) KeepAlive beim server anfragen ... dieser muss es allerdings auch unterstützen und es muss in der server-kofing auch aktiviert sein ...

um auf die frage zurück zu kommen : JA, KeepAlive ist server-spezifisch


----------

