Problem mit Dateiversand Abbruch.

Status
Nicht offen für weitere Antworten.

Stefan1200

Top Contributor
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:
Code:
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:
Code:
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:
Code:
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:
Code:
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():
Code:
boolean isOnline()
{
	if (client == null)
	{
		return false;
	}
	else
	{
		return client.isConnected();
	}
}

JResume macht folgendes, wenn der Download abgebrochen wird:
Code:
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();
	}
}
 
###
[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.
 
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.

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

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.
 
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.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben