[.NET] Files/Images opsturen via socket

Pagina: 1
Acties:

  • Stimpy001
  • Registratie: Maart 2000
  • Laatst online: 16-09-2025
Ik ben momenteel bezig met een client-server model waarbij de client geschreven is in eVB (emBedded Visual Basic) en de server is geschreven in Visual Bsic .NET.

Ik wil graag files, met name plaatjes, op sturen van de server naar de client. Dus op het moment dat de client connectie maakt met de server moet de server een plaatje opsturen naar de client.

Ik krijg het niet voor elkaar om een plaatje of een andere file van de server te verzenden naar de client via de socket. Ik heb al rondgekeken bij bijvoorbeeld Google maar daar gaat het alleen maar over een file lezen/schrijven op hetzelfde systeem. Maar in dit geval moet de file oftewel het plaatje worden verzonden via de socket.

Wie weet de oplossing hiervoor?

Wat jij vergeten bent, hoeft voor mij geen spoed te zijn.


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Waar loop je op vast dan? Wat heb je allemaal al geprobeerd?

We adore chaos because we like to restore order - M.C. Escher


Verwijderd

Ik zie geen probleem? Ik zou gewoon een nieuwe NetworkStream aanmaken en het daarmee de binaire data sturen, niet moeilijk toch?

  • Stimpy001
  • Registratie: Maart 2000
  • Laatst online: 16-09-2025
Verwijderd schreef op 16 oktober 2002 @ 12:57:
Ik zie geen probleem? Ik zou gewoon een nieuwe NetworkStream aanmaken en het daarmee de binaire data sturen, niet moeilijk toch?
Dat is nou net hetgene wat ik dus niet voor elkaar krijg. Ik ben ook niet echt bekend met Visual Basic .NET. ;( Dus misschien iets meer uitleg hierover zou wel heel erg makkelijk zijn

Wat jij vergeten bent, hoeft voor mij geen spoed te zijn.


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Je blijkt al langer hier in PW rond te hangen aan je posts te zien en je bent er ook al voor gewaarschuwt, maar dit soort vage vragen kunnen hier echt niet hoor.

Of het is een scrip request of je moet eens een goed boek of handleiding zoeken. Of stel eens een gerichte vraag over een specifiek onderwerp en geef daarbij aan wat je zelf al geprobeerd hebt

We adore chaos because we like to restore order - M.C. Escher


  • Stimpy001
  • Registratie: Maart 2000
  • Laatst online: 16-09-2025
Schijnbaar is het niet geheel of helemaal niet duidelijk. Momenteel ben ik in staat om een String naar de client te sturen door middel van de onderstaande code.

Visual Basic:
1
2
3
4
5
6
7
8
9
10
Public Sub Send(ByVal Data As String)
        Dim arData(Len(Data) - 1) As Byte
        Dim intIndex As Integer

        For intIndex = 1 To Len(Data)
            arData(intIndex - 1) = Asc(Mid(Data, intIndex, 1))
        Next

        mobjSocket.BeginSend(arData, 0, Len(Data), SocketFlags.None, Nothing, Nothing)
End Sub


Nu wil ik ook graag in staat zijn om een plaatje of een file naar de client te sturen. door bijvoorbeeld te doen SendFile(ByVal File As String) maar ik weet niet hoe dit moet. Wie kijn mij hiervan een voorbeeld geven of uitleggen, liefst zo gedetaileerd mogelijk, hoe dit moet.

Wat jij vergeten bent, hoeft voor mij geen spoed te zijn.


Verwijderd

Het makkelijkst vind ik persoonlijk eerst een NetworkStream openen 'over' de Socket (zie NetworkStream constructor). Daarna moet je het te zenden bestand openen met een FileStream, uit deze filestream lees je een buffer die je dan vervolgens met de NetworkStream schrijft, dit herhaal je totdat je aan het eind van het bestand gekomen bent.

Sim-pel (als je weet hoe het moet ;))

  • Stimpy001
  • Registratie: Maart 2000
  • Laatst online: 16-09-2025
Bedankt Zef ik ben inderdaad een stuk verder gekomen met jouw informatie. Ik heb op de server nu hetvolgende:
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Public Sub SendFile()
        Try
            Dim networkStream As New NetworkStream(mobjSocket)
            Dim fileStream As New FileStream("<link naar image>", FileMode.Open)
            Dim filesize As Integer = fileStream.Length
            Dim buffer As Byte()
            buffer = New Byte(filesize) {}
            MsgBox(buffer.Length.ToString)
            fileStream.Read(buffer, 0, buffer.Length)
            networkStream.Write(buffer, 0, buffer.Length)
            fileStream.Close()
            networkStream.Close()
        Catch
            MsgBox(Err.Description)
        End Try
End Sub


En op de client op PocketPC heb ik het volgende staan:
Visual Basic:
1
2
3
4
Private Sub tcpClient_DataArrival(ByVal bytesTotal As Long)
    tcpClient.GetData Data
    MsgBox Data
End Sub


Hierbij is tcpClient een Winsock-control en Data een String. De output van de MsgBox is nu gif98a en dit snap ik niet. Op de een of andere manier laat de server inderdaad wel de goede image in maar op de client wordt alleen maar de extensie afgedrukt. Ik wil eigenlijk dat data de bytes van het plaatje bevat. Wie weet wat ik fout doe?

Wat jij vergeten bent, hoeft voor mij geen spoed te zijn.


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Wat jouw client laat zien zijn gewoon de eerste paar bytes van het gif bestand. Op zich lijkt hij dus gewoon te werken. Je leest alleen niet alle data in.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • Stimpy001
  • Registratie: Maart 2000
  • Laatst online: 16-09-2025
Nu is mijn vraag zijn het de eerste en of de laatste bytes die alleen maar worden weergegeven door de MsgBox. Of wordt er soms ook iets niet goed opgestuurd?

Wat jij vergeten bent, hoeft voor mij geen spoed te zijn.


  • Sjaaky
  • Registratie: Oktober 2000
  • Laatst online: 22-08 16:45
Dan kijk je met een hexeditor in het gifje. Dan wordt vrij snel duidelijk of het 'gif98a' vooraan of achteraan het bestand staan.
Als je de data op de client meteen weer wegschrijft naar een bestand, kan je trouwens kijken of de gegevens _echt_ goed zijn aangekomen.

  • Twilight Burn
  • Registratie: Juni 2000
  • Laatst online: 21-08 22:41
Jekunt een binair bestand niet zomaar in een messagebox frotten, het beste wat je kunt doen is het saven naar een file, en dan kijken of het gelukt is.

Ik denk dat er na 'gif98a' (wat de header is van een gif-file) een '0' (als waarde, niet als getal) komt, en dat de messagebox het bericht daarna afkapt.

  • Stimpy001
  • Registratie: Maart 2000
  • Laatst online: 16-09-2025
Ik denk zelfs dat alles hierna wordt afgekapt omdat als ik de lengte op vraag in bytes dan krijg ik 14 terug terwijl ik er volgens de server 1058 heb verzonden. Volgens mij worden dus de bytes niet allemaal opgenomen in de string.

Het wegschrijven naar een bestand krijg ik niet voor elkaar op de Pocket PC. Ik weet trouwens niet of dit komt door die "brakke' emulator die bij de SDK zit.

Wat jij vergeten bent, hoeft voor mij geen spoed te zijn.


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Twilight Burn heeft gelijk. gif98a zijn de eerste tekens in een header file en daarna komt waarschijnlijk een \0 wat het einde van een string betekend. Behandel het niet als een string.

We adore chaos because we like to restore order - M.C. Escher


  • Stimpy001
  • Registratie: Maart 2000
  • Laatst online: 16-09-2025
Ik heb inderdaad, samen met mijn collega trouwens, ook het idee dat de String afgekapt wordt. Alleen ben ik nog niet tot de oplossing gekomen. Het handigste is natuurlijk om er voor te zorgen dat Data niet van het datatype String is maar iets anders. Ik ga er naar opzoek, rekening houdend met het feit dan eVB wel beperkter is. Als iemand het antwooord kan geven dan graag.

Ik heb wel het volgende gevonden in de documentatie wat wel belangrijk is:
GetData supports only strings and arrays of integers. It is common to use the GetData method with the DataArrival event.

If you receive data as a string, the bytes are converted from ASCII characters to Unicode characters. The conversion will stop if the data contains a NULL byte (ASCII code 0); data may be lost as a result. If you need to receive data that contains NULL bytes, you must use (vbByte + vbArray).

Wat jij vergeten bent, hoeft voor mij geen spoed te zijn.


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Nou, het staat al gewoon in je eigen quote allemaal :p

Gebruik de array zoals daar staat. Maar belangrijker: Wat wil je er mee nu je het aan de andere kant hebt?! Misschien hoe je het niet eens tussen door op te slaan en kan je de stream direct in je image component pompen...

We adore chaos because we like to restore order - M.C. Escher


  • Stimpy001
  • Registratie: Maart 2000
  • Laatst online: 16-09-2025
Ik heb de oplossing inmiddels gevonden, zie hier

Wat jij vergeten bent, hoeft voor mij geen spoed te zijn.

Pagina: 1