# HttpURLConnection



## Thaflasher (21. Dez 2011)

Hi Forum,

ich versuche eine HttpUrlConnection aufzubauen und möchte Strings verschicken. Leider ist irgendwas falsch und ich komm nicht drauf :noe:

Der "Sender":


```
URL url = new URL("http://localhost:8080/PercontatioServerModul/ControlPanel");
HttpURLConnection urlc = (HttpURLConnection) url.openConnection();
urlc.setDoOutput(true);
OutputStream os = urlc.getOutputStream();
DataOutputStream dos = new DataOutputStream(os);
			
for (int i = 0; i < fragen.size(); i++) {
	dos.writeUTF(fragen.get(i));
}
	dos.flush();
	dos.close();
```


und der Empfänger:


```
URL url = new URL("http://localhost:8080/PercontatioServerModul/ControlPanel");
			
			HttpURLConnection urlc = (HttpURLConnection) url.openConnection();
			
			urlc.setDoInput(true);
			
			urlc.connect();
			
			DataInputStream dis = new DataInputStream(urlc.getInputStream());
			
			while (true){
				try{
				String blabla = dis.readUTF();
				testlist.add(blabla);
				}
				catch (EOFException e) {
					dis.close();
					urlc.disconnect();
					break;
				}
			}
```

Das eine Verbindung besteht erkenne ich daran, das keine ConnectException fliegt. Der response code ist 200 d.h. Http_ok .

Leider kommt beim InputStream nie was an. 

Sieht jemand den Fehler?


----------



## irgendjemand (21. Dez 2011)

ja ... völlig falscher ansatz ...

selbst wenn der dienst der auf TCP/8080 eine art relay ist ... so sind nach HTTP bereits alle daten übertragen wenn du schon das HTTP 200 response bekommst *da du leider nicht gesagt hast auf welcher seite wird es schwer hier zu raten*

alles in allem verstehe ich nicht ganz was du da vor hast ...

interprozess-kommunikation über einen relay-dienst ? das geht anderst ...
versuch mit einem servlet *oder ähnlich* daten auszutauschen ? geht auch anderst ... zu mal hier dann auch der code des servlets nötig ist ...

alles in allem wird weder klar was du vorhast , noch wo genau fehler auftreten ...

vielleicht fängst du damit an uns zu erklären was du damit eigentlich machen willst ... dann kann man sich gedanken über mögliche fehler machen und diese durchgehen ... aber "funktioniert nicht" ist keine fehlerbeschreibung


----------



## SlaterB (21. Dez 2011)

solche komplizierten Dinge versuchst du ohne je im Internet ähnliche Beispiele gesehen zu haben?
du reihst da ja kreativ Befehle zusammen, aber ohne Chance auf Funktionalität,

URLConnections können absolut nur auf Client-Seite verwendet werden, bilden KEINEN Server jeglicher Art

für den Server braucht es schon komplizierten Code, der als Thread dauerhaft läuft und auf Verbindungen wartet,
könnte man sicher auch in fertigen Klassen weitgehend verstecken, aber habe ich Java noch nicht wirklich gesehen,
bleiben Internet-Beispiele wie
Lightweight HTTP Server : HTTP ServerJDK 6Java
(oh, com.sun.net.httpserver.HttpServer scheint ja tatsächlich was in die Richtung zu sein, Java 1.6)

oder deutlich rudimentärer mit ServerSocket
Creating a simple java web server

Suchebegriffe: java http server


----------



## Thaflasher (21. Dez 2011)

Ich habe ein Servlet, das eine ArrayList mit Strings hält, und ich möchte diese Liste an alle übertragen die sich mit dem Servlet verbinden.

Für den Test habe ich den Empfänger (bei hm hab ich auch den responsecode erhalten) geschrieben, weil ich mir ansehen wollte wie das mit der URLConnection genau funktioniert.

Der Code meines Servlets ( nicht lachen, ich teste noch  ):


```
/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		perform(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		perform(request, response);
	}
	
	protected void perform(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		URL url = new URL("http://localhost:8080/PercontatioServerModul/ControlPanel");
		
		PrintWriter out = response.getWriter();
		
		HttpSession session = request.getSession(false);
		if(session!=null){
			fragen= (ArrayList<String>) session.getAttribute("fragenliste");;
			bewertung = (ArrayList<String[]>) session.getAttribute("bewertungsliste");
			path=(String) session.getAttribute("path");
			servlet=(String) session.getAttribute("servlet");
			rootdir=(String) session.getAttribute("rootdir");
			session.invalidate();
		}
		
		String run1 = request.getParameter("run1");
		String run2 = request.getParameter("run2");
		String lq = request.getParameter("lq");
		String auswertung = request.getParameter("auswertung");

		if(run1!=null){
			
			HttpURLConnection urlc = (HttpURLConnection) url.openConnection();
			urlc.setDoOutput(true);
			OutputStream os = urlc.getOutputStream();
			DataOutputStream dos = new DataOutputStream(os);
			
			for (int i = 0; i < fragen.size(); i++) {
				dos.writeUTF(fragen.get(i));
			}
			dos.flush();
			dos.close();
			
			currentrun="Lauf 1";
		}
		
		else if(run2!=null){
			currentrun="Lauf 2";
		}
		
		else if(lq!=null){
			currentrun="Frage wurde gestellt";
		}
		
		else if(auswertung!=null){
			//auswertung
		}
		
		out.println("<html>");
		out.println("<head>");
		out.println("<meta http-equiv=Content-Type content=text/html; charset=UTF-8>");
		out.println("<title>GlassFish JSP Page</title>");
		out.println("</head>");
		out.println("<form method=post accept-charset=UTF-8 target=_self>");
		out.println("<p>"+ currentrun + ":</p>");
		
		out.println("<table border=0");
		out.println("<tr>");
		out.println("<td><input type=submit name=run1 value="+"'"+"Lauf 1"+"'"+"></td>");
		out.println("<td><input type=submit name=run2 value="+"'"+"Lauf 2"+"'"+"></td>");
		out.println("<td><input type=submit name=lq value="+"'"+"Live Frage"+"'"+"></td>");
		out.println("<td><input type=submit name=auswertung value=Auswertung ></td>");
		out.println("</tr>");
		out.println("</table>");
	}
```

Bis jetzt bin ich noch bei "run1" deswegen können die anderen buttons noch nicht wirklich was.

Zuerst muss ich aber die Strings aus dieser ArrayListe verschicken können. 


Was ich nicht ganz verstehe: 

Bei Sockets wird mit accept() "gewartet" bis jemand connect() aufruft und anschließend wird in den Outputstream geschrieben.

Bei diesen HttpUrlConnections scheint es zwar ein connect zu geben, aber kein accept. So dachte ich, das der Outputstream die Daten in das url object schreibt, welche man dann durch den inputstream wieder bekommt.

Jetzt hab ich schon mehrere Beispiele gesehen, aber ich sehe keinen großen Unterschied zu meinem code.


Edit:
Danke Slater, ich bin ehrlich, ich habs mir einfacher vorgestellt  werde mich mal in die http server geschichte einlesen.


----------



## SlaterB (21. Dez 2011)

besteht eine Frage oder erläuterst du nur nebenbei deine Gedanken? 
Genauigkeit wäre schon ziemlich wichtig, wenn andere etwas davon verstehen sollen,


HttpURLConnection != Server, Ende der Geschichte, nichts mehr zu diskutieren oder welche konkrete Frage noch dazu?

in deinem neuen Code hast du ein J2EE-Servlet, wie ist das zu verstehen?
eine komplette J2EE-Anwendung ist natürlich für sich normalerweise ein Server, dann bräuchtest du weder (Server)Socket noch sonst irgendwas als Server, 
es sei denn du planst irgendwas mehrstufiges..

was genau soll die perform()-Methode des Servlets machen?
normalerweise bearbeitet sie einen ankommenden Request eines Clients, setzt paar Daten und fertig,
eine URL hat dort (normalerweise zum dritten) nichts zu suchen


----------



## irgendjemand (21. Dez 2011)

das ganze sollte auch mit eine JSP-servlet auch sicher ohne polling gehen ... nur nicht so wie du dir das gedacht hast ...

wenn ich jetzt mal so kurz drüberfliege sind mir das nach grundsätzlicher server-client architektur aus ...

ich weis das es vielleicht nicht ganz das thema ist ... aber vielleicht arbeitest du dir das hier mal durch : Kaffee & Kuchen - Datenbank-Anbindung mit JDBC
bitte nicht vom link-namen irritieren lassen ... der webmaster hat beim TITLE dieser seite gepennt ... daher wird er von jf.o falsch geparsed ...


----------



## Thaflasher (21. Dez 2011)

Danke Slater denn ohne 



> normalerweise bearbeitet sie einen ankommenden Request eines Clients, setzt paar Daten und fertig,



wäre ich wohl nicht drauf gekommen. 

Nun nehme ich den response OutputStream zum schreiben und siehe da, es geht.

Nochmals vielen Dank für deine Zeit


----------

