Bild an VB-Server schicken

N

narox

Neues Mitglied
1
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:
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(buffer, 0, bytesRead);
            position+=bytesRead;
            
        } while (in.available() > 0);

Ich hab das nicht getested, aber sehr viel kürzer als der Weg über Listen
 
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.
 
Könnte sein das die Abbruchbedingung noch anders auszusehen hat, wie gesagt, habs nicht getestet.
 
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??
 
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.
 
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
 
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(buffer, 0, bytesRead);
            position+=bytesRead;
        }
 
Zuletzt bearbeitet:
  • Danke
Reaktionen: narox
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
 
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
 
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")
 
Ja, du sendest eine jpg und liesst eine Bitmap, so wie das aussieht.

Sent from my HTC Desire HD using Tapatalk
 
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 ^^
 

Ähnliche Themen

B
Antworten
6
Aufrufe
1.051
jogimuc
J
Jansenwilson
Antworten
1
Aufrufe
760
swa00
swa00
FabianDev
Antworten
5
Aufrufe
557
swa00
swa00
Zurück
Oben Unten