# Problem mit Dateiversand Abbruch.



## Stefan1200 (29. Mai 2005)

Hallo,

ich habe ein kleines Problem.
JHTTPServ ist ein kleiner HTTP Server, JResume ein kleines Download Tool für HTTP und FTP.
Wenn ich mit einem Browser wie Opera eine 900 MB Datei von JHTTPServ runterlade,
aber nach 10 MB abgebrochen wird, bricht auch JHTTPServ das senden ab, durch die checkError()
Methode von PrintStream. Lade ich aber diese Datei mit JResume runter, und breche nach 10 MB
ab, hört JHTTPServ nicht auf, geht auf 100% CPU Belastung und liesst die Datei zuende.
Und das ist das Problem, warum ist das so?


Folgendes zum JHTTPServ:

Damit Ihr wisst, was was ist:

```
Socket socket;	// Bekommt er von ServerSocket übergeben.
PrintStream out = new PrintStream(socket.getOutputStream(), true, "UTF-8");
BufferedInputStream in = new BufferedInputStream(socket.getInputStream(), 4096);
```

So sende ich eine Datei:

```
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(lastFileAccess));
byte[] buf = new byte[256];
int len;
while ((len = bis.read(buf)) != -1)
{
	if (out.checkError())
	{
		break;
	}
	out.write(buf, 0, len);
}
```
Exceptions werden natürlich abgefangen.


Folgendes zu JResume:

Damit Ihr wisst, was was ist:

```
private Socket client = new Socket(host, port);
private BufferedInputStream in = new BufferedInputStream(client.getInputStream(), 4096);
private PrintStream out = new PrintStream(client.getOutputStream(), true);
```

So empfange ich eine Datei:

```
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(localFile, true));
bytesDownloaded = 0;
for (; bytesDownloaded < contentSize; bytesDownloaded++)
{
	if (Thread.currentThread().isInterrupted())
	{
		break;
	}

	if (isOnline())
	{
		bos.write(in.read());
	}
}
```
Auch hier: Exceptions werden natürlich abgefangen.

Die Methode isOnline():

```
boolean isOnline()
{
	if (client == null)
	{
		return false;
	}
	else
	{
		return client.isConnected();
	}
}
```

JResume macht folgendes, wenn der Download abgebrochen wird:

```
void closeConnection()
{
	try
	{
		if (client != null)
		{
			client.shutdownInput();    // Hatte ich erst später hinzugefügt, hilft auch nicht
			client.shutdownOutput();   // Hatte ich erst später hinzugefügt, hilft auch nicht
		}
		if (in != null)
		{
			in.close();
			in = null;
		}
		if (out != null)
		{
			out.close();
			out = null;
		}
		if (client != null)
		{
			client.close();
			client = null;
		}
	}
	catch (Exception e)
	{
		e.printStackTrace();
	}
}
```


----------



## stev.glasow (30. Mai 2005)

###
[edit] quatsch, das war grad nix   

 ???:L  Also ich sehe nur 2 Lösungsen: den Socket schließen oder nen extra port für Commandos zwischen Client und server 'einrichten', über dem dann dem Server mitgeteilt wird, dass er nicht mehr senden braucht.

Und bei if (isOnline()) würde ich noch eine break reinmachen, da er sonst in der Schleife hängen bleibt.


----------



## Stefan1200 (30. Mai 2005)

stevg hat gesagt.:
			
		

> ###
> [edit] quatsch, das war grad nix
> 
> ???:L  Also ich sehe nur 2 Lösungsen: den Socket schließen oder nen extra port für Commandos zwischen Client und server 'einrichten', über dem dann dem Server mitgeteilt wird, dass er nicht mehr senden braucht.
> ...



Ein extra port um mit einem HTTP Server zu "sprechen"...
Ähhh...hast du schonmal die HTTP RFC gelesen? Sowas gibt es nicht ;-) *g*

Wegen isOnline(): Oh thanks, habe ich vergessen.


----------



## stev.glasow (30. Mai 2005)

Stimmt ...  ???:L


----------



## Stefan1200 (23. Jun 2005)

Habe selbst die Lösung des Problems gefunden.
Ich habe in der API zu PrintStream übersehen, das er bei checkError selbst flush macht, um ein Fehler zu bemerken.
Allerdings habe ich beim Kontruktor ja autoFlush true übergeben.
Jetzt übergebe ich autoFlush false, so das durch checkError flush gemacht wird. Nun erkennt er zuverlässig solche Abbrüche.


----------

