Mehrere Bilder über Socket verschicken.

  • Themenstarter Themenstarter meeper
  • Beginndatum Beginndatum
M

meeper

Hi,

und war habe ich es hinbekommen über einen Socket ein Bild vom iPhone auf den Server zu schicken. Dort speichere ich dann das Bild auf dem Server. Das klappt auch. Nur möchte ich mehrere Bilder verschicken geht das nicht weil die Inputstream.read() blockt. Wie kann
das bewerkstelligen, das ich das Blocking weg bekomme? Ich habe schon gelesen, das man die Länge des übertragenen Bildes mitschicken soll. Ich konnte aber irgendwie kein kleines Beispiel finden, wie das in Java gemacht wird.

gruss
meeper
 
Hallo,

wie sendest du denn die Bilder mit dem IPhone zum Server? Wie sieht denn dein (objective-c) code dazu aus?

Gruß Tom
 
Hi,

so sieht das ganz vom iPhone aus:



Code:
NSData *data=UIImageJPEGRepresentation([UIImage imageNamed:@"IMG.jpg"],1);
	
	
	CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault, host, port,&readStream, &writeStream);
	
	
	if(!CFWriteStreamOpen(writeStream)) {
		
		NSLog(@"Error Opening Socket");
	
	}
	
	else{
		
		
		UInt32 bufLen = [data length];
		UInt8 *buf=(UInt8*)[data bytes];
		
		
		bool done=false;
		
		
		
		while (!done) {
			
			//NSLog(@"Error Opening Socket1");		

		
			int bytesWritten = CFWriteStreamWrite(writeStream,buf,bufLen);
			
			//CFWriteStreamWrite(writeStream,a,strlen((char*)a));
			

			
		
			if(bytesWritten != [data length]){
				bufLen = bufLen - bytesWritten;
				memmove(buf, buf + bytesWritten, bufLen);
			}
			
			if(bytesWritten==0){
				done=TRUE;
				NSLog(@"Error Opening Socket3");	
				//CFWriteStreamWrite(writeStream,b,strlen((char*)b));

			}
														   
			
		}
		
		
		/*CFWriteStreamClose(writeStream);
		CFRelease(writeStream);
		writeStream = NULL;		
		NSLog(@"Error Opening Socket2");	*/	
					
	
	}



Und der server sieht so aus:

[code|
public class Main {

static boolean done = true;
static int i=0;

public static void main(String[] args) throws IOException {

ServerSocket server = new ServerSocket(12345);
Socket client = null;
client = server.accept();
InputStream is = client.getInputStream();


while (done) {
System.out.println("Schleife");

try {


System.out.println("Client: " + client.getLocalSocketAddress()+ " succesfully connected.");


byte[] buffer = new byte[16384];



int bytesRead;
OutputStream outputStream = new FileOutputStream("blub.jpg");

//is.read(length);
//System.out.printf("%c", length[8]);



while ((bytesRead = is.read(buffer)) !=-1) {
outputStream.write(buffer, 0, bytesRead);

}

System.out.println("Schleife3");
outputStream.close();

//done = false;

} catch (IOException e) {
e.printStackTrace();
}finally{

System.out.println("Schleife3");

}




}
[/code|
 
Guten Abend,

wenn du den Socket einfach schließt nachdem du das Bild geschickt hast, wird bei dem Java-Code entweder eine Exception geworfen, oder das InputStream.read() liefert -1 zurück. Somit weißt du, wann die erste Datei übertragen wurde.
Die Größe musst du nicht unbedingt mitschicken ;)

Siehe deinen Code:
Java:
[...]
int bytesRead;
OutputStream outputStream = new FileOutputStream("blub.jpg");

//is.read(length);
//System.out.printf("%c", length[8]);


/*
 * Diese Schleife wird beendet, sobald alle Daten empfangen wurden
*/
while ((bytesRead = is.read(buffer)) !=-1) {
  outputStream.write(buffer, 0, bytesRead);
}

[...]

Gruß
BK
 
Zuletzt bearbeitet:
Hi,

muss ich den Socket auf der Serverseite schliessen oder clientseite? Wenn ich den socket schliesse wird dch die Verbindung getrennt. Wie soll ich dann das zweite Bild hinterher schicken?
 
Zurück