Erst Connection Reset dann Broken Pipe

H3llGhost

Mitglied
Hallo Leute,

ich habe eine ganz einfach Filetransfering Server-Client-Applikation geschrieben.
Mein Problem ist nur dass wenn mehrere Clients gleichzeitig connecten es bei einem Client meistens einen Connection Reset und danach ein Broken Pipe gibt.
Leider kann ich nicht nachvollziehen warum, denn das tritt nicht immer auf.

Meine Run aus dem Server sieht wie folgt aus:

Java:
	public void run()
	{
		try
		{
			ss = new ServerSocket(this.port);
		}
		catch (java.net.BindException e)
		{
			JOptionPane.showMessageDialog(
							null,
							"Der benötigte Port ist schon belegt.\n\nServer wird nun beendet!",
							"Fehler", JOptionPane.ERROR_MESSAGE);
			System.exit(0);
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}

		this.setProperty("Listening on File" + ss);

		while (!isInterrupted())
		{
			try
			{
				Socket s = ss.accept();
				if (this.checkDoubleIP(s))
					s.close();
				else
				{
					DataOutputStream dout = new DataOutputStream(s
							.getOutputStream());
					outputStreams.put(s, dout);

					clients.put(s, new SharingThread(this, s, this.version));

					this.setProperty("Client-Add: " + s);
				}
			}
			catch (SocketException e)
			{
				// Ignoriere
			}
			catch (Exception e)
			{
				this.printTrace(e);
			}
		}
	}

Der SharingThread selber beinhaltet nur die Verarbeitung von eingehenden Befehlen und verarbeitet unter anderem eine Dateianfrage wie folgt:

Java:
//nf ist das Objekt File
			FileInputStream fis = new FileInputStream(nf);
			BufferedInputStream bis = new BufferedInputStream(fis);
			DataInputStream dis = new DataInputStream(bis);

			this.server.sendToClient(this.socket, "file-Valid");

			while ((b = dis.read(schreib)) != -1)
				this.server.sendToClientData(this.socket, schreib, b);

			fis.close();

Das Senden habe ich wie folgt geregelt:
Java:
	void sendToClientData(Socket s, byte[] data, int l)
	{
		synchronized (outputStreams)
		{
			DataOutputStream dout = (DataOutputStream) outputStreams.get(s);
			try
			{
				System.out.println(data + " " + l);
				dout.write(data, 0, l);
				dout.flush();
				System.out.println("Sende ... " + data);
			}
			catch (Exception ie)
			{
				// This doesn't need an error message
				this.printTrace(ie);
				ie.printStackTrace();
			}
		}
	}

In der Methode tritt die Exception immer auf.


Kann es eventuell daran liegen, wenn mehrere Clients auf eine und dieselbe Datei zugreifen?
Sonst habe ich leider keine Ideen mehr ... :(

Würde mich über jede Antwort freuen.
Danke im Vorraus. :)
 
Zurück