file transfer problem

Status
Nicht offen für weitere Antworten.

virus

Aktives Mitglied
Ich hab ein Server und ein Client. die Transferieren files vom Server zum Client.

Der client sendet

FILE /path/to/the/file

Darauf antwortete der Server mit

--- START FILE TRANSMITION ---

nun wechselt er in binary mode und sendet zu erst 4 bytes die grösse des kommenden files und dann das file.

wenn der download fertig ist, sendet der client den nächsten FILE... befehl (aus einer Que).

nun das funktioniert perfekt beim 1. befehl
beim 2. befehl wird zwar alles korrekt gesendet aber beim empfangen stimmt die Dateigrösse nicht (also die 4 bytes werden falsch gelesen, oder es werden die falschen 4 bytes gelesen.) Was natürlich dazu führt das der download vorzeitig abbricht oder nie endet.

Server:
Code:
iwhile ((input = m_input.readLine()) != null && m_running) {
				if (input.startsWith("QUIT")) {
					closeClientConnection();
					break;
				} else if (input.startsWith("FILE")) {
					m_output.println("--- START FILE TRANSMITION ---");

					File f = new File(input.substring(5));
					FileInputStream fInput = new FileInputStream(f);
					OutputStream ous = m_socket.getOutputStream();
					
					
					//send file size
					long fileSize = f.length();
					byte [] b = new byte[4];
					for(int i= 0; i < 4; i++){
						b[3-i] = (byte)(fileSize >>> (i * 8));
					}
					System.out.println("Server side File Size:"+b[0]+" "+b[1]+" "+b[2]+" "+b[3]);
					ous.write(b);
					
					//send file
					byte[] nextBytes = new byte[m_socket.getSendBufferSize()];
					int bytesRead = 0;
					while ((bytesRead = fInput.read(nextBytes)) > 0) {
						ous.write(nextBytes, 0, bytesRead);
					}
				}
				
				else {
					m_output.println(input);
				}
			}

Client

Code:
while (m_connected && (msg = m_input.readLine()) != null) {

					System.out.println("Server:" + msg);

					if (msg.startsWith("--- START FILE TRANSMITION ---")) {

						

						InputStream input = m_socket.getInputStream();
						FileOutputStream output = new FileOutputStream("/download");
						byte[] outBuffer = new byte[m_socket.getReceiveBufferSize()];
						int bytesRead = 0;

						// receive fiel size
						byte[] b = new byte[4];
						long fileSize = 0;
						input.read(b);
						for (int i = 0; i < 4; i++) {
							fileSize <<= 8;
							fileSize ^= (long) b[i] & 0xFF;
						}
						System.out.println("Received File Size: "+b[0]+" "+b[1]+" "+b[2]+" "+b[3]);
						// receive file
						long transmittedSize = 0;
						while ((bytesRead = input.read(outBuffer)) > 0) {
							output.write(outBuffer, 0, bytesRead);
							transmittedSize += bytesRead;
							// abbort if file is finished
							if (transmittedSize >= fileSize)
								break;
						}
						output.close();
						//notify that the file downloaded is finished
						synchronized (m_downloadListeners) {
							for (DownloadListener dl : m_downloadListeners) {
								dl.downloadFinished(new File(download));
							}
						}
						// remove executed command
						// execute next
						synchronized (m_fileDownloadCommands) {
							m_fileDownloadCommands.removeFirst();
							if (!m_fileDownloadCommands.isEmpty())
								m_output.println((m_fileDownloadCommands.getFirst()).getCommand());
						}
					}
				}
 
T

tuxedo

Gast
Wenn du mit einem DataInput- und OutputStream arbeitest, musst du nicht selbst deinen Integer für's senden Zerlegen und nach dem Empfangen wieder zusammenbauen. Du könntest auch einen ObjectInput und OutputStream benutzen und die File durch die Leitung durchserialsieren (was für ein Wort ;-) ). Ist dann vielleicht weniger Fehleranfällig.

- Alex
 

virus

Aktives Mitglied
So ich hab jetzt mal ein bisschen umgebaut:

Server:
Code:
while ((input = m_input.readLine()) != null && m_running) {
	if (input.startsWith("QUIT")) {
		closeClientConnection();
		break;
	} else if (input.startsWith("FILE")) {
		m_output.println("--- START FILE TRANSMITION ---");
		File f = new File(input.substring(5));
		FileInputStream fInput = new FileInputStream(f);
					
		// send file size
		 ObjectOutputStream ous = new ObjectOutputStream(m_socket.getOutputStream());
		long fileSize = f.length();
		System.out.println(fileSize);
		ous.writeLong(fileSize);
		
		// send file				
		DataOutputStream dous = new DataOutputStream(m_socket.getOutputStream());
		byte[] nextBytes = new byte[m_socket.getSendBufferSize()];
		int bytesRead = 0;
		while ((bytesRead = fInput.read(nextBytes)) > 0) {
			dous.write(nextBytes, 0, bytesRead);
		}
	}
	else {
		m_output.println(input);
	}
}

Client:
Code:
while (m_connected && (msg = m_input.readLine()) != null) {

	System.out.println("Server:" + msg);

	if (msg.startsWith("--- START FILE TRANSMITION ---")) {

		synchronized (m_fileDownloadCommands) {
			m_actualLocalPath = m_fileDownloadCommands.getFirst().getLocal();
		}

		//read file size
		ObjectInputStream input = new ObjectInputStream(m_socket.getInputStream());
		long fileSize = input.readLong();
		System.out.println(fileSize);


		//read file from stream and store it to m_actualLocalPath
		FileOutputStream output = new FileOutputStream(m_actualLocalPath);
		DataInputStream dis = new DataInputStream(getSocket().getInputStream());

		byte[] outBuffer = new byte[getSocket().getReceiveBufferSize()];
		int bytesRead = 0;
		long transmittedSize = 0;
		while ((bytesRead = dis.read(outBuffer)) > 0) {
			output.write(outBuffer, 0, bytesRead);
			transmittedSize += bytesRead;

			// abbort if file is finished
			if (transmittedSize >= fileSize){
				break;
			}
		}
		output.close();

		synchronized (m_downloadListeners) {
			for (DownloadListener dl : m_downloadListeners) {
				dl.downloadFinished(new File(m_actualLocalPath));
			}
		}
		// remove executed command
		// execute next
			synchronized (m_fileDownloadCommands) {
				m_fileDownloadCommands.removeFirst();
				if (!m_fileDownloadCommands.isEmpty())
					m_output.println((m_fileDownloadCommands.getFirst()).getCommand());
			}
		}
	}
} catch (IOException ioe) {
	ioe.printStackTrace();
} finally {
	m_connected = false;
}

Nun hab ich aber das Problem das die applikation bei "DataInputStream dis = new DataInputStream(getSocket().getInputStream());" hängen bleibt und nicht mehr weiter macht.
Irgendwo muss hier der hund drinn sein.. ich bin jetzt schon zig stunden an dem ding und kriegs einfach nicht zum laufen :-([/code]
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
N File Transfer Netzwerkprogrammierung 5
D CSV File Upload Netzwerkprogrammierung 5
D Socket Gute Idee?: File als byte[] per ObjectIOStream übertragen Netzwerkprogrammierung 3
S Webserver für Jar File Netzwerkprogrammierung 4
H Applet soll XML-File auf Server speichern Netzwerkprogrammierung 6
R Apache HttpClient File Download? Netzwerkprogrammierung 3
0 Apache Commons File Object bekommen Netzwerkprogrammierung 4
D Server Client Verbindung - Unexpected End of File - Invalid HTTP Response Netzwerkprogrammierung 4
M HTTP File Upload mit Prozessbar Funktioniert nicht. Netzwerkprogrammierung 8
5 File Upload/ ClassNotFoundException Netzwerkprogrammierung 9
S RSS-Feed aus ini File Netzwerkprogrammierung 4
Z File über Socket lesen Netzwerkprogrammierung 3
N Socket File über Socket vom Server an Client versenden Netzwerkprogrammierung 15
F Protokoll file:/// Netzwerkprogrammierung 2
B JNLP File -> Web Application Netzwerkprogrammierung 10
R HTTP HttpURLConnection Large File Upload Netzwerkprogrammierung 1
DStrohma RMI Security Manager & Policy-File Netzwerkprogrammierung 8
DeviAn Über ein Linux Server ein Windows Server nach einer File fragen Netzwerkprogrammierung 6
P java file.exists() zuzerstörbar Netzwerkprogrammierung 7
E java.net.SocketException: Unexpected end of file from server Netzwerkprogrammierung 2
G SMB-File ausführen Netzwerkprogrammierung 15
J Problem beim Senden von File Netzwerkprogrammierung 4
J Mit der File Api Dateien von anderen Rechnern lesen ? Netzwerkprogrammierung 3
I unc pfad für die klasse file? Netzwerkprogrammierung 4
E upload progress bei einem http file post Netzwerkprogrammierung 5
L file upload / download über http Netzwerkprogrammierung 5
P File von http-Server kopieren Netzwerkprogrammierung 5
D wie kann ich rmic ein .jar file übergeben? Netzwerkprogrammierung 3
R File chooser übers Netzwerk Netzwerkprogrammierung 3
J File upload mit ftp Netzwerkprogrammierung 4
G file download über https mit p12 Zertifikat Netzwerkprogrammierung 4
D Performance Problem beim File senden, empfangen Netzwerkprogrammierung 4
T file auf einen server laden Netzwerkprogrammierung 4
M RMI AbstractTableModel als Data Transfer Object (DTO) nutzen Netzwerkprogrammierung 0
N Socket TCP Datei Transfer Netzwerkprogrammierung 2
A einfacher Transfer mit Applets Netzwerkprogrammierung 4
G HTTP Response mit Transfer-Encoding:chunked einlesen Netzwerkprogrammierung 4
I Socket Problem mit den WebSocket Antworten der Discord API Netzwerkprogrammierung 0
K Java Websocketserver Problem | Android to Pi Netzwerkprogrammierung 1
C RMI Produzent-Verbraucher-Problem - Code review Netzwerkprogrammierung 12
B Socket Bilder verschicken via Sockets. Heap-Problem. Netzwerkprogrammierung 2
S Problem bei dem Bluetoothverbindungsaufbau Netzwerkprogrammierung 2
G Server-Client IO Problem Netzwerkprogrammierung 6
M Netty - TCP Problem Netzwerkprogrammierung 4
L Socket Problem mit Server Netzwerkprogrammierung 1
J Chat Server starten über GUI problem Netzwerkprogrammierung 4
M Problem bei Socket (MultiplayerSpiel) Netzwerkprogrammierung 4
M Socket CDI, Websocket reference Problem ! Netzwerkprogrammierung 2
Shams Problem mit Eventbus in Verbindung mit Server Netzwerkprogrammierung 0
G apache httpClient Problem. Netzwerkprogrammierung 5
H Problem mit ObjectStreams Netzwerkprogrammierung 3
A Problem beim Senden von Client zu Server Netzwerkprogrammierung 10
D Socket BufferedWriter/Reader Problem Netzwerkprogrammierung 1
Maxim6394 Problem mit Socks5 Implementierung Netzwerkprogrammierung 0
C Handle Connection Problem Netzwerkprogrammierung 3
E HttpUrlConnection Cookie Problem Netzwerkprogrammierung 0
X Problem mit vielen Bytes über Socket Netzwerkprogrammierung 23
O 4Gewinnt Multiplayer - Netzwerk Problem (TCP) Netzwerkprogrammierung 1
A Socket Socket-Problem - Object wird nicht übertragen Netzwerkprogrammierung 3
R Problem beim Programmieren eines Chatprogramms Netzwerkprogrammierung 5
E einfaches Problem: Session-Handling bei Servlets Netzwerkprogrammierung 5
G Problem mit einem FileWatcher Netzwerkprogrammierung 7
T Socket Server starten Thread Problem Netzwerkprogrammierung 12
B Client/Server Connection Problem Netzwerkprogrammierung 2
G Problem mit STATIC-Verständnis Netzwerkprogrammierung 8
S Umstellung AS400 auf Postgre - Problem beim Arbeiten mit Metadaten Netzwerkprogrammierung 2
J Facelets Include Rendered Problem Netzwerkprogrammierung 2
J Socket Problem mit C++/Java Netzwerkprogrammierung 20
P Problem mit Datagram-Sockets Netzwerkprogrammierung 2
G Socket NIO2 Problem mit AsynchronousSocketChannel beim Schließen Netzwerkprogrammierung 3
G Cookie Verwaltungs Problem nach Login auf InetSeite (Wo utma-Cookie?) Netzwerkprogrammierung 18
C Socket Problem mit ObjectInput/OutputSream Netzwerkprogrammierung 7
B Socket Problem mit Netzwerkchat Netzwerkprogrammierung 21
D RMI Problem beim shutdown von verteilter CORBA-Anwendung Netzwerkprogrammierung 6
Maxim6394 ipv6 Problem Netzwerkprogrammierung 2
Maxim6394 Proxyserver Performance Problem Netzwerkprogrammierung 11
M Problem Client - Server Sockets: .ready() wird nie true! Netzwerkprogrammierung 6
C Socket Problem mit ObjectInput/OutputSream Netzwerkprogrammierung 5
B RMI und Problem mit rmic-Tool Netzwerkprogrammierung 3
C FTP storeFileStream Problem Netzwerkprogrammierung 3
N Problem über http eine Datei zu senden Netzwerkprogrammierung 4
D JavaMail - Mailsabrufen Problem (imap) Netzwerkprogrammierung 12
J HTTP Übersetzung yahoo babelfish - Zeichensatz-Problem Netzwerkprogrammierung 6
D Apache CXF, JAX-WS Problem bei Arrays - einfacher Server Netzwerkprogrammierung 2
M Problem beim Datenempfang Netzwerkprogrammierung 2
X Problem mit Server-Client-Kommunikation Netzwerkprogrammierung 14
M Problem mit Socket-Verbindung Netzwerkprogrammierung 2
N NIO Problem beim speziellen Behandeln von einzelnen Benutzern Netzwerkprogrammierung 13
D Thread problem Netzwerkprogrammierung 3
T Servlets JSP: Tomcat Problem Netzwerkprogrammierung 4
K Client - Server Problem Netzwerkprogrammierung 16
T RMI Problem Client-Server Netzwerkprogrammierung 2
P RMI Stub Problem Netzwerkprogrammierung 3
D Socket UDP Übertragungs Problem Netzwerkprogrammierung 7
I HTTP Post aus html in Java einlesen - Problem Netzwerkprogrammierung 2
I HTTP Post aus html in Java einlesen - Problem Netzwerkprogrammierung 6
D Problem mit ObjectInputStreams Netzwerkprogrammierung 10
D Socket Problem mit InputStreamReader Netzwerkprogrammierung 3
N CRC32 CheckSum Problem bei UDP Netzwerkprogrammierung 2
V Java Mail Api - IMAP Problem Netzwerkprogrammierung 6

Ähnliche Java Themen

Neue Themen


Oben