# Server Client Verbindung - Unexpected End of File - Invalid HTTP Response



## Dearbone (29. Mai 2012)

ich weiß nicht ob ich im richtigen Bereich dieses Forums bin, wenn nicht, würde ich mich freuen wenn die Admins meinen Beitrag gegebenenfalls verschieben =)

Hallo Leute, würde mich erstmal kurz vorstellen.
Bin 22 Jahre alt und studiere im moment Informatik im vierten Semester.
Bis jetzt keine Erfahrungen mit Netwerkgeschichten oder Java, dennoch gibt es nun eine kleine Praktikumsaufgabe die wir erledigen müssen, einen "Webservice" zu entwickeln der es ermöglicht, virtuelle Warenkörbe zu verwalten.

Auf Client Seite dürfen wir die Klasse HTTPUrlConnection verwenden, auf Server Seite nicht.
Soweit so gut.

Nach einigen ( ne menge ) Tagen programmieren, testen, und :bahnhof:
wollte ich mal hier nachfragen wo der Fehler liegt.

Der Client schickt 12 Anfragen zum Server, und dieser soll dementsprechend Antworten.
Ich habe auf Server Seite die erste Anfrage "bearbeitet" und die if Bedingung dafür programmiert, was er bei dieser tun soll.
Mein erstes Erfolgserlebnis hier, Es funktionierte :toll:

Daraufhin natürlich gleich an die nächsten Bedingungen gesetzt, damit alle Anfragen beantwortet werden können.
Alles ausprogrammiert, getestet und hier kommt das Problem:noe::

Keine der Anfragen wird richtig beantwortet, weder die restlichen 11, noch die erste, die vorher richtig beantwortet wurde. Es kommt entweder der Fehler : Invalid HTTPResponse oder Unexpected end of File.

Bin gerade am Verzweifeln und würde mich freuen, falls einer von euch mir helfen könnte 

Hier mein Quellcode:
Server

```
import java.net.*;

public class Server 
{
	public static void main(String[] args) 
	{	
	
		Threads T;
		ServerSocket serverSocket = null;
		Socket socket;
		Warenkorb test = new Warenkorb();
		try
		{
			serverSocket = new ServerSocket(8088);
		}
		catch (Exception e)
		{
			System.out.println("Fehler 1");
		}
		while (true)
		{
			try
			{
				socket = serverSocket.accept();
				T = new Threads(socket, test);
				T.Verbindung();
			}
			catch (Exception e)
			{
				System.out.println("Fehler 2");
			}
		}
	}
}
```

Threads:

```
import java.net.*;
import java.util.ArrayList;
import java.io.*;

public class Threads extends Thread 
{
	Socket socket;
	Warenkorb test = new Warenkorb();
	ArrayList<Warenkorb> Warenkörbe = new ArrayList<Warenkorb>();
	
	public Threads(Socket s, Warenkorb t)
	{
		socket = s;
		test = t;
	}
	public void Verbindung()
	{
		OutputStream out;
		InputStream in;
		String Rückgabe = "";
		StringBuilder build = new StringBuilder();
		
		try
		{
			System.out.println("Verbunden ");
			out = socket.getOutputStream();
			in = socket.getInputStream();
			
			do
			{
				build.append((char) in.read());
			}
			while (in.available() !=0);
			
			String StringInput = build.toString();
			String [] abschnitt = (StringInput.split("\\s+")[1]).split("/");
			
			if(StringInput.contains("GET /"))
			{	
				if(abschnitt[1].equals("Beschreibung"))
				{
					int abschnitt2= Integer.parseInt(abschnitt[2]);
					Rückgabe = test.Artikelbeschreibung(abschnitt2);
				}
				if(abschnitt[1].equals("Warenkorb"))
				{
					if(abschnitt[2].equals("Zeigen"))
					{
						for (int i = 0; i < Warenkörbe.size(); i++)
						{
							int abschnitt3= Integer.parseInt(abschnitt[3]);
							if(Warenkörbe.get(i).WKid() == abschnitt3 )
							{
								Warenkörbe.get(i).Ausgabe(i);
							}
						}
					}	
				}		
			}
			else if (StringInput.contains("PUT /"))
			{
				if (abschnitt[2].equals("Neu"))
				{
					Warenkörbe.add(new Warenkorb());
					Rückgabe = "Neuer Warenkorb wurde angelegt";
				}
				if(abschnitt[2].equals("Legen"))
				{
					for (int i = 0; i < Warenkörbe.size(); i++)
					{
						int abschnitt3= Integer.parseInt(abschnitt[3]);
						int abschnitt4= Integer.parseInt(abschnitt[4]);
						if(Warenkörbe.get(i).WKid() == abschnitt3);
						{
							Warenkörbe.get(i).Legen(abschnitt4, abschnitt3);
						}
					}
				}
				
			}
			else if(StringInput.contains("DELETE /"))
			{
				if(abschnitt[1].equals("Warenkorb"))
				{
					if(abschnitt[2].equals("Löschen"))
					{
						for (int i = 0; i < Warenkörbe.size(); i++)
						{
							int abschnitt3= Integer.parseInt(abschnitt[3]);
							if(Warenkörbe.get(i).WKid()== abschnitt3)
							{
								Warenkörbe.remove(i);
							}
						}
					}
				}
			}
			else 
			{
				Rückgabe = ("Falsches Kommando");
			}
			
			for (int i = 0; i < Rückgabe.length(); i++) 
			{
				out.write(Rückgabe.charAt(i));
			}	
			out.flush();
			System.out.println(("Empfangen:  ") + build);
			System.out.println(("Gesendet:	 ") + Rückgabe);
			socket.close();
		}
		catch (Exception e) 
		{
		System.out.println("Fehler 3");
		}
	}
}
```

Client:

```
import java.io.*;
import java.net.*;

public class Client 
{

	public static void main(String[] args) 
	{
		String host = "http://localhost:8088";
		
		
		getservice("GET", host, "/Beschreibung/22545497/");
		getservice("GET", host, "/Beschreibung/12548947/");
		getservice("PUT", host, "/Warenkorb/Neu/");
		getservice("PUT", host, "/Warenkorb/Neu/");
		getservice("PUT", host, "/Warenkorb/Legen/1/22545497/");
		getservice("PUT", host, "/Warenkorb/Legen/1/12545497/");
		getservice("PUT", host, "/Warenkorb/Legen/1/12548947/");
		getservice("GET", host, "/Warenkorb/Zeigen/1/");
		getservice("DELETE", host, "/Warenkorb/Löschen/1/");
		getservice("PUT", host, "/Warenkorb/Legen/2/22545497/");
		getservice("GET", host, "/Warenkorb/Zeigen/1/");
		getservice("GET", host, "/Warenkorb/Zeigen/2/");
	}
	
	private static void getservice(String method, String host, String arg) {
		HttpURLConnection connection = null;
		OutputStreamWriter wr = null;
		BufferedReader rd = null;
		StringBuilder sb = null;
		String line = null;

		URL serverAddress = null;
		System.out.println("Anfrage: "+"\""+ method + " "+ arg +"\""+ "  an: " + host);
		try {
			serverAddress = new URL(host + arg);
			// set up out communications stuff
			connection = null;

			// Set up the initial connection
			connection = (HttpURLConnection) serverAddress.openConnection();
			connection.setRequestMethod(method);
			connection.setDoOutput(true);
			connection.setReadTimeout(5000);
			connection.setUseCaches(false);

			connection.connect();
			// get the output stream writer and write the output to the server
			// not needed in this example
			// wr = new OutputStreamWriter(connection.getOutputStream());
			// wr.write("");
			// wr.flush();

			// read the result from the server
			rd = new BufferedReader(new InputStreamReader(connection
					.getInputStream()));
			sb = new StringBuilder();

			while ((line = rd.readLine()) != null) {
				sb.append(line + '\n');
			}

			System.out.println("Antwort: " + '\n' + sb.toString());

		} catch (MalformedURLException e) {
			System.out.println(e.getMessage());
		} catch (ProtocolException e) {
			System.out.println(e.getMessage());
		} catch (IOException e) {
			System.out.println(e.getMessage());
		} finally {
			// close the connection, set all objects to null
			connection.disconnect();
			rd = null;
			sb = null;
			wr = null;
			connection = null;	
		}

	}
}
```


----------



## Runtime (29. Mai 2012)

[Ich hab den Quelltext nicht gelesen]
1. Setze den Code in Java-Tags (ganz gross und rot über dem Editor), damit man auch die Zeile ablesen kann, in dem der Fehler geworfen wird.
2. Gib bitte den ganzen Fehler an, der ausgegeben wird, damit man die Zeilennummer, in der der Fehler geworfen wird, kennt.


----------



## Dearbone (30. Mai 2012)

Der Fehler der auf Client Seite ausgegeben wird, ist : "Invalid HTTP Response"
auf Server Seite ist es: "Software caused connection abort: socket write error"


Server:


```
import java.net.*;

public class Server 
{
	public static void main(String[] args) 
	{	
	
		Threads T;
		ServerSocket serverSocket = null;
		Socket socket;
		Warenkorb test = new Warenkorb();
		try
		{
			serverSocket = new ServerSocket(8088);
		}
		catch (Exception e)
		{
			System.out.println("Fehler 1");
		}
		while (true)
		{
			try
			{
				socket = serverSocket.accept();
				T = new Threads(socket, test);
				T.Verbindung();
			}
			catch (Exception e)
			{
				System.out.println("Fehler 2");
			}
		}
	}
}
```

Threads:


```
import java.net.*;
import java.util.ArrayList;
import java.io.*;

public class Threads extends Thread 
{
	Socket socket;
	Warenkorb test = new Warenkorb();
	ArrayList<Warenkorb> Warenkörbe = new ArrayList<Warenkorb>();
	
	public Threads(Socket s, Warenkorb t)
	{
		socket = s;
		test = t;
	}
	public void Verbindung()
	{
		OutputStream out;
		InputStream in;
		String Rückgabe = "";
		StringBuilder build = new StringBuilder();
		
		try
		{
			System.out.println("Verbunden ");
			out = socket.getOutputStream();
			in = socket.getInputStream();
			
			do
			{
				build.append((char) in.read());
			}
			while (in.available() !=0);
			
			String StringInput = build.toString();
			String [] abschnitt = (StringInput.split("\\s+")[1]).split("/");
			
			if(StringInput.contains("GET /"))
			{	
				if(abschnitt[1].equals("Beschreibung"))
				{
					int abschnitt2= Integer.parseInt(abschnitt[2]);
					Rückgabe = test.Artikelbeschreibung(abschnitt2);
				}
				if(abschnitt[1].equals("Warenkorb"))
				{
					if(abschnitt[2].equals("Zeigen"))
					{
						for (int i = 0; i < Warenkörbe.size(); i++)
						{
							int abschnitt3= Integer.parseInt(abschnitt[3]);
							if(Warenkörbe.get(i).WKid() == abschnitt3 )
							{
								Warenkörbe.get(i).Ausgabe(i);
							}
						}
					}	
				}		
			}
			else if (StringInput.contains("PUT /"))
			{
				if (abschnitt[2].equals("Neu"))
				{
					Warenkörbe.add(new Warenkorb());
					Rückgabe = "Neuer Warenkorb wurde angelegt";
				}
				if(abschnitt[2].equals("Legen"))
				{
					for (int i = 0; i < Warenkörbe.size(); i++)
					{
						int abschnitt3= Integer.parseInt(abschnitt[3]);
						int abschnitt4= Integer.parseInt(abschnitt[4]);
						if(Warenkörbe.get(i).WKid() == abschnitt3);
						{
							Warenkörbe.get(i).Legen(abschnitt4, abschnitt3);
						}
					}
				}
				
			}
			else if(StringInput.contains("DELETE /"))
			{
				if(abschnitt[1].equals("Warenkorb"))
				{
					if(abschnitt[2].equals("Löschen"))
					{
						for (int i = 0; i < Warenkörbe.size(); i++)
						{
							int abschnitt3= Integer.parseInt(abschnitt[3]);
							if(Warenkörbe.get(i).WKid()== abschnitt3)
							{
								Warenkörbe.remove(i);
							}
						}
					}
				}
			}
			else 
			{
				Rückgabe = ("Falsches Kommando");
			}
			
			for (int i = 0; i < Rückgabe.length(); i++) 
			{
				out.write(Rückgabe.charAt(i));
			}	
			out.flush();
			System.out.println(("Empfangen:  ") + build);
			System.out.println(("Gesendet:	 ") + Rückgabe);
			socket.close();
		}
		catch (Exception e) 
		{
		System.out.println("Fehler 3");
		}
	}
}
```

Client:


```
import java.io.*;
import java.net.*;

public class Client 
{

	public static void main(String[] args) 
	{
		String host = "http://localhost:8088";
		
		
		getservice("GET", host, "/Beschreibung/22545497/");
		getservice("GET", host, "/Beschreibung/12548947/");
		getservice("PUT", host, "/Warenkorb/Neu/");
		getservice("PUT", host, "/Warenkorb/Neu/");
		getservice("PUT", host, "/Warenkorb/Legen/1/22545497/");
		getservice("PUT", host, "/Warenkorb/Legen/1/12545497/");
		getservice("PUT", host, "/Warenkorb/Legen/1/12548947/");
		getservice("GET", host, "/Warenkorb/Zeigen/1/");
		getservice("DELETE", host, "/Warenkorb/Löschen/1/");
		getservice("PUT", host, "/Warenkorb/Legen/2/22545497/");
		getservice("GET", host, "/Warenkorb/Zeigen/1/");
		getservice("GET", host, "/Warenkorb/Zeigen/2/");
	}
	
	private static void getservice(String method, String host, String arg) {
		HttpURLConnection connection = null;
		OutputStreamWriter wr = null;
		BufferedReader rd = null;
		StringBuilder sb = null;
		String line = null;

		URL serverAddress = null;
		System.out.println("Anfrage: "+"\""+ method + " "+ arg +"\""+ "  an: " + host);
		try {
			serverAddress = new URL(host + arg);
			// set up out communications stuff
			connection = null;

			// Set up the initial connection
			connection = (HttpURLConnection) serverAddress.openConnection();
			connection.setRequestMethod(method);
			connection.setDoOutput(true);
			connection.setReadTimeout(5000);
			connection.setUseCaches(false);

			connection.connect();
			// get the output stream writer and write the output to the server
			// not needed in this example
			// wr = new OutputStreamWriter(connection.getOutputStream());
			// wr.write("");
			// wr.flush();

			// read the result from the server
			rd = new BufferedReader(new InputStreamReader(connection
					.getInputStream()));
			sb = new StringBuilder();

			while ((line = rd.readLine()) != null) {
				sb.append(line + '\n');
			}

			System.out.println("Antwort: " + '\n' + sb.toString());

		} catch (MalformedURLException e) {
			System.out.println(e.getMessage());
		} catch (ProtocolException e) {
			System.out.println(e.getMessage());
		} catch (IOException e) {
			System.out.println(e.getMessage());
		} finally {
			// close the connection, set all objects to null
			connection.disconnect();
			rd = null;
			sb = null;
			wr = null;
			connection = null;	
		}

	}
}
```


----------



## Runtime (30. Mai 2012)

java - Official reasons for "Software caused connection abort: socket write error" - Stack Overflow


> To start a TCP's normal connection termination sequence, the client (and server) should call Socket.shutdownOutput(), see the javadoc here. This causes the other side to get an EOF if reading from the Socket, which should also be followed by a call to *shutdownOutput() before closing*.



Sollte funktioniert, habs aber nicht ausprobiert/ausprobieren können.


----------



## Lumaraf (30. Mai 2012)

Du ignorierst das HTTP-Protokoll einfach komplett in deinem Code, das kann so unmöglich funktionieren. Du mußt auch entsprechende HTTP Header zurückschicken. In der ersten Zeile muß die HTTP-Version stehen und ein Statuscode folgen. Danach kommen weiter Header wie z.b. die Länge des Bodys und ein Content-Type. Danach folgen zwei Zeilenumbrüche und dann kannst du deinen Inhalt schicken. Die Zeilenumbrüche müßen bei HTTP immer \r\n sein. Unter Hypertext Transfer Protocol ? Wikipedia gibts noch Beispiele zu den Headern die dir evtl weiterhelfen.


----------

