tcp fileübertragung -> fileunterscheidung

mundl

Grünschnabel
hi,

folgendes problem bei dem ich einfach auf keine lösung komme.
ich muss mehrere files, in diesem fall z.b. mp3s per tcp und einer tcp connection verschicken. auf der anderen seite, sobald 2 ankommen ein zip file erstellen. dazu verwende ich folgenden code für server und client.

mein problem ist, dass ich die files auf der anderen seite nicht auseinanderhalten kann. sobald ich die dateien so versende schreibt er alle mp3´s in ein grosses mp3 file anstatt in die einzelenen.... wäre klasse wenn mir da wer einen tip geben könnte was ich noch ausprobieren kann.

die connection immer öffnen und schliessen funktioniert( also mehrere tcp streams zu erzeugen sozusagen) zwar aber darf ich nicht als lösung hernehmen...

vielen dank!

Code:
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

public class PerformanceSendReceive {

	public static void main(String[] args) {

		String serverIp = "localhost";
		int port = 1234;

		int quantity = 8;
		int buffer_size = 1024;
		int len = 0;
		byte[] buffer = new byte[buffer_size];
		

		for (int i = 1; i <= quantity; i++) {
			try {
				String filename = i + ".mp3";
				InputStream inputStream = null;
				Socket socket = new Socket(serverIp, port);
				OutputStream outputStream = socket.getOutputStream();
				
				inputStream = new FileInputStream((filename));
				while ((len = inputStream.read(buffer)) > 0) {
					outputStream.write(buffer, 0, len);

				}

				inputStream.close();
				outputStream.close();
				socket.close();
			
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		System.out.println("fertisch");
	}

}



Code:
public class PerformanceReceiveSend {

	public static void main(String[] args) {

		String server_ip = "localhost";
		int port = 1234;
		String directory = "/home//Desktop/transfer/";
		int buffer_size = 1024;
		int quantity = 8;
		String filename = "";
		byte[] buffer = new byte[buffer_size];
		int len = 0;
		OutputStream outputStream = null;
		int i = 1;
		int counter = 1;
		try {

			while (true) {				
				filename = i + "mp3";
				File file = new File(directory, filename);

				ServerSocket serverSocket = new ServerSocket(port);
				Socket socket = serverSocket.accept();
				InputStream inputStream = socket.getInputStream();

				System.out.println(" receiving file... " + i + file);
				outputStream = new FileOutputStream(file);

				while (((len = inputStream.read(buffer)) > 0)) {
					if (len == buffer_size)
						outputStream.write(buffer, 0, len);
					
				}
				i++;
				
				if (i % 2 == 0) {					
					String command = "zip ";
					String zipfilename = "zipfile" + counter + " ";
					String mp3_1 = i - 1 + ".mp3 ";
					String mp3_2 = i + ".mp3";
					
					 String arguments =  command+zipfilename+mp3_1+mp3_2; 
					System.out.println(arguments);
					 Runtime.getRuntime().exec(arguments);
					 counter++;
				}
				socket.close();
				serverSocket.close();
				inputStream.close();

			}

			// outputStream.close();

		} catch (Exception e) {

			e.printStackTrace();
		}

	}
}
 
Hallo,

du musst dir halt ein Protokoll aus denken, das die Steuerungsinformationen mitbekommt.
... ungefähr so:
Java:
/**
 * 
 */
package de.tutorials;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

/**
 * @author Thomas.Darimont
 *
 */
public class ProtocolExample {

    /**
     * @param args
     */
    public static void main(String[] args) throws Exception{
        
        //Server ...
        Socket socket = null;
        OutputStream outputStream = socket.getOutputStream();
        DataOutputStream dataOutputStream = new DataOutputStream(outputStream);
        File[] mp3s = null;
        
        byte[] buffer = new byte[16384];
        int bytesRead =-1;
        
        
        //Number of mp3 files to be sent
        //for each mp3 file
        //  send name of current mp3 file
        //  send size of current mp3 file
        //  send actual data as byte[]
        //  flush()
        
        dataOutputStream.writeInt(mp3s.length);
        
        for(File mp3 : mp3s){
            
            readAndSendMp3ToStream(dataOutputStream, buffer, mp3);
        }
        dataOutputStream.close();
        
        //Client
        Socket clientSocket = null;
        byte[] clientBuffer = new byte[16384];
        int clientBytesRead =-1;
        
        InputStream inputStream = clientSocket.getInputStream();
        DataInputStream dataInputStream = new DataInputStream(inputStream);
        
        int numberOfMp3Files = dataInputStream.readInt();
        
        for(int i = 0; i < numberOfMp3Files;i++){
            readAndSaveMp3FromStream(dataInputStream);
        }
        

    }

    private static void readAndSendMp3ToStream(
            DataOutputStream dataOutputStream, byte[] buffer, File mp3)
            throws FileNotFoundException, IOException {
        int bytesRead;
        InputStream inputStream = new FileInputStream(mp3);
        
        dataOutputStream.writeUTF(mp3.getName());
        dataOutputStream.writeLong(mp3.length());
        
        while((bytesRead = inputStream.read(buffer))>0){
            dataOutputStream.write(buffer, 0, bytesRead);
        }
        dataOutputStream.flush();
    }

    private static void readAndSaveMp3FromStream(DataInputStream dataInputStream) throws Exception{
        String name = dataInputStream.readUTF();
        long sizeInBytes = dataInputStream.readLong();
        
        byte[] buffer = new byte[16384];
        int bytesRead = -1;
        
        OutputStream outputStream = new FileOutputStream(name);
        
        while((bytesRead = dataInputStream.read(buffer))>0){
            outputStream.write(buffer, 0, bytesRead);
        }
        outputStream.close();
    }

}

Gruß Tom
 
vielen dank für deine antwort :) . das klingt schon sehr gut. nur der teil ist mir nicht ganz klar wie er funktionieren soll.

File[] mp3s = null;
byte[] buffer = new byte[16384];
int bytesRead =-1;

//Number of mp3 files to be sent
//for each mp3 file
// send name of current mp3 file
// send size of current mp3 file
// send actual data as byte[]
// flush()

dataOutputStream.writeInt(mp3s.length);
for(File mp3 : mp3s){

readAndSendMp3ToStream(dataOutputStream, buffer, mp3);
}
dataOutputStream.close();

meinst du das in etwa so wenn ich z.b. 8 files schicken möchte?

Code:
 for (int i = 1; i <= 8; i++) { 
mp3[i]= testi.mp3 

	for (File mp3 : mp3s) {
        readAndSendMp3ToStream(dataOutputStream, buffer, mp3);

}

also ich speichere die name und grüsse in das file array? oder hab ich das falsch verstanden? bin mit File und DataOutputStream nicht wirklich bewandert ;)

oder is das eher so gedacht:

Code:
 for (int i = 1; i <= 8; i++) { 

		for (File mp3 : mp3s) {
                 mp3[i]= testi.mp3
		readAndSendMp3ToStream(dataOutputStream, buffer, mp3);
}
}

bin mir auch nicht ganz im klaren wie ich name und länge setzen kann im dataOutputStream.

sorry wenn ich da eventuell eine blöde frage stell. bin ein relativer java neuling...
 
Zuletzt bearbeitet:
Zurück