1. Nimm jetzt an unserem Uhans - 3. ADVENT - Gewinnspiel teil - Alle Informationen findest Du hier!

Bild an VB-Server schicken

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von narox, 07.12.2011.

  1. narox, 07.12.2011 #1
    narox

    narox Threadstarter Neuer Benutzer

    Beiträge:
    14
    Erhaltene Danke:
    1
    Registriert seit:
    13.05.2010
    Phone:
    Sony Ericsson Xperia X10
    Hey Leute,

    also ich habe ein Problem das ich kein Bild(2MB) an den Server schicken kann. Strings usw. kann ich problemlos senden, da diese ja sehr kleine bytes sind.

    Mein Lösungsweg wäre das Bild in 1024 Byte-Packete zu schicken, aber irgendwie funktioniert das nicht ganz.

    Vielleicht könnt ihr mir helfen :)

    mfg Narox

    Meine SendMethode:

    Code:
    public void sendData(byte[] data){
            Socket socket = null;
            DataOutputStream out = null;
            DataInputStream in = null;
            try {
                socket = new Socket("192.168.20.105", 8888);
                if(socket.isConnected()){
                    out = new DataOutputStream(socket.getOutputStream());
                    in = new DataInputStream(socket.getInputStream());
                    ArrayList<Byte> imgdata=new ArrayList<Byte>();
                    //Die Daten in eine ArrayList speichern,weil diese dynamsich ist
                    for(int i=0;i<data.length;i++){
                        imgdata.add(data[i]);
                    }
                    //Die Pakete aufteilen
                    int nOfPackets=imgdata.size()/1024;
                    if(imgdata.size()%1024!=0){
                        nOfPackets++;
                    }
                    //Die Pakete senden
                    byte[] buffer;
                    for(int i=0;i<nOfPackets;i++){
                        //Falls die anzahl der bytes kleine ist als die Paketgröße dann, die Paketgröße anpassen
                        if(imgdata.size()>1024){
                            buffer=new byte[1024];
                        }else{
                            buffer=new byte[imgdata.size()];
                        }
                        //Die bytes in den buffer schreiben
                        for(int pos=0;pos<1024;pos++){
                            buffer[pos]=imgdata.get(0);
                            imgdata.remove(0);
                        }
                        //an den Server schicken
                        out.write(buffer, 0, buffer.length);
                    }
                        /*userdata=in.readLine();
                        if(userdata.equals("FAILED")){
                            showToast("Identification failed!");
                        }else{
                            Intent pinIntent = new Intent(this, PinSend.class);
                            pinIntent.putExtra("userdata", userdata);
                            pinIntent.putExtra("amount", getIntent().getExtras().getString("amount"));
                            startActivity(pinIntent);
                        }*/
                }         
             } catch (UnknownHostException e) {
                showToast("Sending failed!");
                 e.printStackTrace();
             } catch (IOException e) {
                showToast("Sending failed!");
                 e.printStackTrace();
             }
             finally{
                 try {
                     if(socket!=null){
                         socket.close();
                     }
                     if(out!=null){
                         out.close();
                     }
                     if(in!=null){
                         in.close();
                     }
                 }catch (IOException e) {
                     e.printStackTrace();
                 }            
            }
        }
    Mein VB-Server:
    Code:
    Imports System.Net.Sockets
    Imports System.IO
    Imports System.Net
    Imports System.Drawing
    Imports System.Text
    
    Module Module1
    
        Private listener As TcpListener
        Private client As New TcpClient
        Private clients As New List(Of NetworkStream)
    
        Sub Main()
            Try
                listener = New TcpListener(IPAddress.Any, 8888)
                listener.Start()
            Catch ex As Exception
                Console.WriteLine(ex.Message)
            End Try
            Console.WriteLine("Server gestartet")
            While True
                client = listener.AcceptTcpClient()
                If (client.Connected) Then
                    Dim stream As NetworkStream = client.GetStream()
                    Console.WriteLine("Client angemeldet")
                    Dim t As New Threading.Thread(AddressOf ClientListener)
                    t.Start(stream)
                End If
            End While
        End Sub
    
        Private Sub ClientListener(ByVal stream As NetworkStream)
            Try
                Dim recData(1024) As Byte
                Dim recBytes As Integer
                Dim totalrecbytes As Integer = 0
                Dim memStream As MemoryStream = New MemoryStream()
                While ((recBytes = stream.Read(recData, 0, recData.Length)) > 0)
                    memStream.Write(recData, 0, recData.Length)
                    totalrecbytes += recBytes
                End While
                Dim bitImage As Bitmap = New Bitmap(System.Drawing.Image.FromStream(memStream))
                bitImage.Save("C:\test.bmp")
                Dim sendBytes As [Byte]() = Encoding.ASCII.GetBytes("OK")
                'stream.Write(sendBytes, 0, sendBytes.Length)
            Catch ex As Exception
    
            Finally
                stream.Close()
                client.Close()
                clients.Remove(stream)
            End Try
        End Sub
    
    End Module
     
    Zuletzt bearbeitet: 07.12.2011
  2. Unicate, 08.12.2011 #2
    Unicate

    Unicate Android-Experte

    Beiträge:
    473
    Erhaltene Danke:
    57
    Registriert seit:
    09.08.2010
    Was genau passiert denn wenn du das ausführst?

    Mein Tip:
    Statt List<Byte> könnten man auch ByteArrayInputStream verwenden ;)

    PHP:
            ByteArrayInputStream in = new ByteArrayInputStream(data);
            
    byte[] buffer = new byte[1024];
            
    int position 0;
            
    int bytesRead 0;
            do {
                
    bytesRead=in.read(buffer,position,1024);
                
    out.write(buffer0bytesRead);
                
    position+=bytesRead;
                
            } while (
    in.available() > 0);

    Ich hab das nicht getested, aber sehr viel kürzer als der Weg über Listen
     
  3. narox, 08.12.2011 #3
    narox

    narox Threadstarter Neuer Benutzer

    Beiträge:
    14
    Erhaltene Danke:
    1
    Registriert seit:
    13.05.2010
    Phone:
    Sony Ericsson Xperia X10
    habs gestan noch getestet und bin drauf gekommen das die laufzeit durch die arraylist extrem verlängert worden ist, ich werde es mal mit deiner methode probiern und schau was dabei herauskommt :)
    danke für die antwort

    mfg.
     
  4. Unicate, 08.12.2011 #4
    Unicate

    Unicate Android-Experte

    Beiträge:
    473
    Erhaltene Danke:
    57
    Registriert seit:
    09.08.2010
    Könnte sein das die Abbruchbedingung noch anders auszusehen hat, wie gesagt, habs nicht getestet.
     
  5. narox, 08.12.2011 #5
    narox

    narox Threadstarter Neuer Benutzer

    Beiträge:
    14
    Erhaltene Danke:
    1
    Registriert seit:
    13.05.2010
    Phone:
    Sony Ericsson Xperia X10
    ich glaube es gibt auch ein problem beim server. der geht erst gar nicht in die while-schleife hinein -.- hättest du da eine idee wie man es anders lösen könnte??
     
  6. Unicate, 08.12.2011 #6
    Unicate

    Unicate Android-Experte

    Beiträge:
    473
    Erhaltene Danke:
    57
    Registriert seit:
    09.08.2010
    Ich find VB nicht unbedingt die passendste Sprache um nen Server zu schreiben, da ein server meist sowieso keine GUI braucht.

    Ich würds in Java machen, weils einfach ist. :)

    Auf Anhieb seh ich keinen Fehler in deinem VB, aber ich bin auch nicht für VB zu haben.
     
  7. narox, 08.12.2011 #7
    narox

    narox Threadstarter Neuer Benutzer

    Beiträge:
    14
    Erhaltene Danke:
    1
    Registriert seit:
    13.05.2010
    Phone:
    Sony Ericsson Xperia X10
    wär ich auch stark dafür und hätte es auch schon längst gemacht(da auch android in java ist), das problem ist hald, das ich eine bilderkennungssoftware habe und daraus kann nur vb-code, c#...usw. exportiert werden ^^
    so habe den server ein bisschen geändert, es liegt wirklich noch an der bedingung
    werd mich ein bisschen spiele, danke für die hilfe
     
  8. Unicate, 08.12.2011 #8
    Unicate

    Unicate Android-Experte

    Beiträge:
    473
    Erhaltene Danke:
    57
    Registriert seit:
    09.08.2010
    np

    Das sollte klappen:
    PHP:
    ByteArrayInputStream in = new ByteArrayInputStream(data);
            
    byte[] buffer = new byte[1024];
            
    int position 0;
            
    int bytesRead 0;        
            while((
    bytesRead in.read(buffer,position,1024)) != 0) {
                
    out.write(buffer0bytesRead);
                
    position+=bytesRead;
            }
     
    Zuletzt bearbeitet: 08.12.2011
    narox bedankt sich.
  9. narox, 08.12.2011 #9
    narox

    narox Threadstarter Neuer Benutzer

    Beiträge:
    14
    Erhaltene Danke:
    1
    Registriert seit:
    13.05.2010
    Phone:
    Sony Ericsson Xperia X10
    habs zwar jetzt anders egschafft aber trotzdem danke :)

    Android:

    Code:
    public void sendData(byte[] data){
            Socket socket = null;
            DataOutputStream out = null;
            DataInputStream in = null;
            try {
                socket = new Socket("192.168.20.105", 8888);
                if(socket.isConnected()){
                    out = new DataOutputStream(socket.getOutputStream());
                    in = new DataInputStream(socket.getInputStream());
                    out.write(new Integer(data.length).toString().getBytes());
                    byte[] msgbuffer=new byte[1024];
                    in.read(msgbuffer, 0, msgbuffer.length);
                    servermsg=new String(msgbuffer).substring(0, 2);
                    Log.e("da", servermsg);
                    if(servermsg.equals("OK")){
                        byte[] buffer;
                        int pos = 0;
                        do {
                            if(pos+1024<data.length){
                                buffer=new byte[1024];
                                System.arraycopy(data, pos, buffer, 0, 1024);
                                out.write(buffer, 0, buffer.length);
                                pos+=1024;
                            }else{
                                buffer=new byte[data.length-pos];
                                System.arraycopy(data, pos, buffer, 0, data.length-pos);
                                out.write(buffer, 0, buffer.length);
                                pos=pos+(data.length-pos);
                            }                    
                            Log.e("position", new Integer(pos).toString());                   
                        } while (pos!=data.length);
                    }else{
                        
                    }
                }         
             } catch (UnknownHostException e) {
                showToast("Sending failed!");
                 e.printStackTrace();
             } catch (IOException e) {
                showToast("Sending failed!");
                 e.printStackTrace();
             }
             finally{
                 try {
                     if(socket!=null){
                         socket.close();
                     }
                     if(out!=null){
                         out.close();
                     }
                     if(in!=null){
                         in.close();
                     }
                 }catch (IOException e) {
                     e.printStackTrace();
                 }            
            }
        }
    VB-Server

    Code:
    Imports System.Net.Sockets
    Imports System.IO
    Imports System.Net
    Imports System.Drawing
    Imports System.Text
    
    Module Module1
    
        Private listener As TcpListener
        Private client As New TcpClient
        Private clients As New List(Of NetworkStream)
    
        Sub Main()
            Try
                listener = New TcpListener(IPAddress.Any, 8888)
                listener.Start()
            Catch ex As Exception
                Console.WriteLine(ex.Message)
            End Try
            Console.WriteLine("Server gestartet")
            While True
                client = listener.AcceptTcpClient()
                If (client.Connected) Then
                    Dim stream As NetworkStream = client.GetStream()
                    Console.WriteLine("Client angemeldet")
                    Dim t As New Threading.Thread(AddressOf ClientListener)
                    t.Start(stream)
                End If
            End While
        End Sub
    
        Private Sub ClientListener(ByVal stream As NetworkStream)
            Try
                Dim countbytes(client.ReceiveBufferSize) As Byte
                stream.Read(countbytes, 0, CInt(client.ReceiveBufferSize))
                Dim countStr As String = Encoding.UTF8.GetString(countbytes)
                Console.WriteLine(countStr)
                Dim count As Integer = Convert.ToInt32(countStr)
                Dim sendBytes As [Byte]() = Encoding.ASCII.GetBytes("OK")
                stream.Write(sendBytes, 0, sendBytes.Length)
                Console.WriteLine(count)
                Dim pos As Integer = 0
                Dim data(count) As Byte
                While (pos <> count)
                    If (pos + 1024 < count) Then
                        Dim buffer(1024) As Byte
                        stream.Read(buffer, 0, buffer.Length)
                        System.Array.Copy(buffer, 0, data, pos, buffer.Length)
                        pos += 1024
                    Else
                        Dim buffer(count - pos) As Byte
                        stream.Read(buffer, 0, buffer.Length)
                        System.Array.Copy(buffer, 0, data, pos, buffer.Length)
                        pos += (count - pos)
                    End If
                End While
                Console.WriteLine(pos)
                Dim memStream As MemoryStream = New MemoryStream(data)
    
                'Dim img As Image = Image.FromStream(memStream)
                'img.Save("C:\test.jpg")
                'stream.Write(sendBytes, 0, sendBytes.Length)
            Catch ex As Exception
                Console.WriteLine(ex.ToString)
            Finally
                stream.Close()
                client.Close()
                clients.Remove(stream)
            End Try
        End Sub
    
    End Module
     
  10. Unicate, 08.12.2011 #10
    Unicate

    Unicate Android-Experte

    Beiträge:
    473
    Erhaltene Danke:
    57
    Registriert seit:
    09.08.2010
    Ich kann dir empfehlen die bytearrays wieder zu verwenden und sie nicht in jedem schleifendurchlauf neu zu erstellen. Das ist sehr viel schneller, da du jetzt den gc zu sehr beanspruchst und Gefahr läufst einen OutOfMemoryError zu erzeugen.

    Sent from my HTC Desire HD using Tapatalk
     
  11. narox, 08.12.2011 #11
    narox

    narox Threadstarter Neuer Benutzer

    Beiträge:
    14
    Erhaltene Danke:
    1
    Registriert seit:
    13.05.2010
    Phone:
    Sony Ericsson Xperia X10
    oke, danke...
    ich hätte aber jz noch ein Problem, wenn ich das bild wieder decodieren will dann kommt nichts vernünftiges dabei heraus. hättest du vl eine idee??

    Android

    Code:
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
                    image.compress(Bitmap.CompressFormat.JPEG, 100, baos); 
                    byte[] imagebytes = baos.toByteArray();
                    sendData(imagebytes);
    Vb-Decodierung
    Code:
    Dim memStream As MemoryStream = New MemoryStream(data)
                Dim bitImage As Bitmap = New Bitmap(System.Drawing.Image.FromStream(memStream))
                bitImage.Save("C:\test.bmp")
     
  12. Unicate, 08.12.2011 #12
    Unicate

    Unicate Android-Experte

    Beiträge:
    473
    Erhaltene Danke:
    57
    Registriert seit:
    09.08.2010
    Ja, du sendest eine jpg und liesst eine Bitmap, so wie das aussieht.

    Sent from my HTC Desire HD using Tapatalk
     
  13. narox, 08.12.2011 #13
    narox

    narox Threadstarter Neuer Benutzer

    Beiträge:
    14
    Erhaltene Danke:
    1
    Registriert seit:
    13.05.2010
    Phone:
    Sony Ericsson Xperia X10
    an das habe ich auch gedacht und habe es dann mit folgenden code probiert
    Code:
    Dim img As Image = Image.FromStream(memStream)
                'img.Save("C:\test.jpg")
    
    aber wahrscheinlich werde ich irgendeinen jpeg konverter oder so ewtas benützen müssen ^^
     

Diese Seite empfehlen