Jetzt kostenlos registrieren. Mitglieder surfen ohne Werbung auf Android-Hilfe.de!
Zurück   Android-Hilfe.de > Android Developer > Android App Entwicklung

Bild an VB-Server schicken

Das Thema "Bild an VB-Server schicken" befindet sich unter Android App Entwicklung auf Android-Hilfe.de.


Antwort

 

Themen-Optionen Ansicht
Alt 07.12.2011, 19:09   #1 (permalink)
Neuer Benutzer

Modell: Sony Ericsson Xperia X10

Registriert seit: 13.05.2010
Beiträge: 14
Abgegebene Danke: 3
Erhielt 1 Danke für 1 Beitrag
Standard Bild an VB-Server schicken

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

Geändert von narox (07.12.2011 um 19:21 Uhr)
narox ist offline   Mit Zitat antworten
Alt 08.12.2011, 14:12   #2 (permalink)
Fortgeschrittenes Mitglied

Modell: HTC Desire HD

Registriert seit: 09.08.2010
Beiträge: 345
Abgegebene Danke: 11
Erhielt 40 Danke für 38 Beiträge
Standard AW: Bild an VB-Server schicken

Was genau passiert denn wenn du das ausführst?

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

PHP-Code:
        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
Unicate ist offline   Mit Zitat antworten
Alt 08.12.2011, 14:22   #3 (permalink)
Neuer Benutzer

Modell: Sony Ericsson Xperia X10

Registriert seit: 13.05.2010
Beiträge: 14
Abgegebene Danke: 3
Erhielt 1 Danke für 1 Beitrag
Standard AW: Bild an VB-Server schicken

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.
narox ist offline   Mit Zitat antworten
Alt 08.12.2011, 14:29   #4 (permalink)
Fortgeschrittenes Mitglied

Modell: HTC Desire HD

Registriert seit: 09.08.2010
Beiträge: 345
Abgegebene Danke: 11
Erhielt 40 Danke für 38 Beiträge
Standard AW: Bild an VB-Server schicken

Könnte sein das die Abbruchbedingung noch anders auszusehen hat, wie gesagt, habs nicht getestet.
Unicate ist offline   Mit Zitat antworten
Alt 08.12.2011, 14:31   #5 (permalink)
Neuer Benutzer

Modell: Sony Ericsson Xperia X10

Registriert seit: 13.05.2010
Beiträge: 14
Abgegebene Danke: 3
Erhielt 1 Danke für 1 Beitrag
Standard AW: Bild an VB-Server schicken

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??
narox ist offline   Mit Zitat antworten
Alt 08.12.2011, 14:36   #6 (permalink)
Fortgeschrittenes Mitglied

Modell: HTC Desire HD

Registriert seit: 09.08.2010
Beiträge: 345
Abgegebene Danke: 11
Erhielt 40 Danke für 38 Beiträge
Standard AW: Bild an VB-Server schicken

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.
Unicate ist offline   Mit Zitat antworten
Alt 08.12.2011, 14:40   #7 (permalink)
Neuer Benutzer

Modell: Sony Ericsson Xperia X10

Registriert seit: 13.05.2010
Beiträge: 14
Abgegebene Danke: 3
Erhielt 1 Danke für 1 Beitrag
Standard AW: Bild an VB-Server schicken

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
narox ist offline   Mit Zitat antworten
Alt 08.12.2011, 14:41   #8 (permalink)
Fortgeschrittenes Mitglied

Modell: HTC Desire HD

Registriert seit: 09.08.2010
Beiträge: 345
Abgegebene Danke: 11
Erhielt 40 Danke für 38 Beiträge
Standard AW: Bild an VB-Server schicken

np

Das sollte klappen:
PHP-Code:
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;
        } 

Geändert von Unicate (08.12.2011 um 14:49 Uhr)
Unicate ist offline   Mit Zitat antworten
Folgender Benutzer bedankt sich bei Unicate für diesen Beitrag:
narox (08.12.2011)
Alt 08.12.2011, 17:01   #9 (permalink)
Neuer Benutzer

Modell: Sony Ericsson Xperia X10

Registriert seit: 13.05.2010
Beiträge: 14
Abgegebene Danke: 3
Erhielt 1 Danke für 1 Beitrag
Standard AW: Bild an VB-Server schicken

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
narox ist offline   Mit Zitat antworten
Alt 08.12.2011, 18:08   #10 (permalink)
Fortgeschrittenes Mitglied

Modell: HTC Desire HD

Registriert seit: 09.08.2010
Beiträge: 345
Abgegebene Danke: 11
Erhielt 40 Danke für 38 Beiträge
Standard

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
Unicate ist offline   Mit Zitat antworten
Antwort

Stichworte
-

Themen-Optionen
Ansicht


Ähnliche Themen

Thema Autor Forum Antworten Letzter Beitrag
[Gelöst] Mit Kamera Bild machen, speichert aber nur eine schwarzes bild Tomy91 Motorola Defy Forum 2 15.07.2011 19:11
Bild per MMS verschicken -> Bild wird auf die Seite gedreht Tiger-Chrisi Samsung Galaxy S (I9000) Forum 8 31.05.2011 11:19
Facebook app und Freund Bild schicken? Outlaw Kommunikation 0 15.02.2011 10:37
ImageView Bild teilweise durch zweites bild überschreiben missG Android App Entwicklung 0 25.10.2010 15:39
Twonky Server Mobile (Streaming Server) nodch Sonstige Apps & Widgets 5 03.02.2010 00:14




Du liest gerade: "Bild an VB-Server schicken" unter "Android App Entwicklung" auf Android-Hilfe.de.


Powered by vBulletin®
Copyright ©2000 - 2012, vBulletin Solutions, Inc.
Search Engine Friendly URLs by vBSEO
© Android-Hilfe.de 2012 - All rights reserved.