Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[WD11] Envoyer une image memo binaire par socket

3 réponses
Avatar
paratge
Bonjour,

Je reviens sur mon problème, car je sèche lamentablement :

j'ai une appli cliente qui envoie des informations sur un serveur via
sockets, et biensûr, un serveur qui les réceptionne.

Parmi toutes les infos envoyées, il y a les photos de l'utilisateur en
mémo binaire, et là, ça coince.

mon code coté client est :

IMAGE = SC_SelecteurFichier.SAI_FIC
HLit(INSCRIT,1)
gsImage1 = dSauveImageJPEG(IMAGE,enMémoire,60)
HAttacheMémo(INSCRIT,Image,SC_SelecteurFichier.SAI_FIC,hMémoImg)
HModifie(INSCRIT)


sNomSocket est une chaîne = "Ann_" + DateDuJour()+Maintenant()
sInfoUser, sOK est une chaîne
// Tentative de connexion
Message("Connexion au serveur.")
SocketConnecte(sNomSocket,cnPortSocketAjout,gsIpServeur,30000)
SI ErreurDétectée ALORS
// Erreur de connexion
Erreur("Impossible de joindre le serveur",ErreurInfo());Message()
RENVOYER Faux
SINON
HLit(INSCRIT,1)
sInfo est une chaîne
sInfo = Annonce+"&"+gsImage1+"&"+gsImage2+"&"+gsImage3+"&"+gsImage4
SocketEcrit(sNomSocket,"903 "+gnUser+"$"+sInfo)

sOK = SocketLit(sNomSocket,Faux,30000)
SI sOK = "103 OK3" ALORS
SocketFerme(sNomSocket)
Sablier(Faux)
FEN_ACCOUNT..Plan = 5
RENVOYER Vrai
SINON
Erreur("Une erreur a été détectée pendant la récupération des données.")
FIN
FIN

et le code coté serveur est :

sInfo = SocketLit(sNomCanal,Faux,30000)
SI sInfo[[A 3]] = "903" ET sInfo <>"" ALORS
nIdUser = sInfo[[5 A Position(sInfo,"$")-1]]
sLogin = sInfo[[Position(sInfo,"$")+1 A]]

// on détermine les buffers
nPosdeb1 = Position(sLogin,"&",1)
nPosdeb2 = Position(sLogin,"&",nPosdeb1+1)
nPosdeb3 = Position(sLogin,"&",nPosdeb2+1)
nPosdeb4 = Position(sLogin,"&",nPosdeb3+1)

sAnnonce = sLogin[[ A nPosdeb1-1]]
bufImage1 = sLogin[[nPosdeb1+1 A nPosdeb2-1]]
bufImage2 = sLogin[[nPosdeb2+1 A nPosdeb3-1]]
bufImage3 = sLogin[[nPosdeb3+1 A nPosdeb4-1]]
bufImage4 = sLogin[[nPosdeb4+1 A]]



HLitRecherche(INSCRIT,IDUTILISATEUR,nIdUser)
INSCRIT.Image = bufImage1
INSCRIT.image1 = bufImage2
INSCRIT.image2 = bufImage3
INSCRIT.image3 = bufImage4
INSCRIT.Annonce = sAnnonce

SectionCritiqueDébut("AA")
SI HModifie(INSCRIT)= Vrai ALORS
SocketEcrit(sNomCanal,"103 OK3")
SocketFerme(sNomCanal)
SectionCritiqueFin("AA")

Si je récupère bien l'annonce, les images ne s'enregistrent pas.

Une idée pour me sortir de la tourmente ?

Merci d'avance

3 réponses

Avatar
patrice
faut jamais utiliser de chaine avec des données binaire (au moindre 0 ca
tronque)
faut utiliser des buffers

"paratge" a écrit dans le message de
news:46a869f2$0$27389$
Bonjour,

Je reviens sur mon problème, car je sèche lamentablement :

j'ai une appli cliente qui envoie des informations sur un serveur via
sockets, et biensûr, un serveur qui les réceptionne.

Parmi toutes les infos envoyées, il y a les photos de l'utilisateur en
mémo binaire, et là, ça coince.

mon code coté client est :

IMAGE = SC_SelecteurFichier.SAI_FIC
HLit(INSCRIT,1)
gsImage1 = dSauveImageJPEG(IMAGE,enMémoire,60)
HAttacheMémo(INSCRIT,Image,SC_SelecteurFichier.SAI_FIC,hMémoImg)
HModifie(INSCRIT)


sNomSocket est une chaîne = "Ann_" + DateDuJour()+Maintenant()
sInfoUser, sOK est une chaîne
// Tentative de connexion
Message("Connexion au serveur.")
SocketConnecte(sNomSocket,cnPortSocketAjout,gsIpServeur,30000)
SI ErreurDétectée ALORS
// Erreur de connexion
Erreur("Impossible de joindre le serveur",ErreurInfo());Message()
RENVOYER Faux
SINON
HLit(INSCRIT,1)
sInfo est une chaîne
sInfo = Annonce+"&"+gsImage1+"&"+gsImage2+"&"+gsImage3+"&"+gsImage4
SocketEcrit(sNomSocket,"903 "+gnUser+"$"+sInfo)

sOK = SocketLit(sNomSocket,Faux,30000)
SI sOK = "103 OK3" ALORS
SocketFerme(sNomSocket)
Sablier(Faux)
FEN_ACCOUNT..Plan = 5
RENVOYER Vrai
SINON
Erreur("Une erreur a été détectée pendant la récupération des données.")
FIN
FIN

et le code coté serveur est :

sInfo = SocketLit(sNomCanal,Faux,30000)
SI sInfo[[A 3]] = "903" ET sInfo <>"" ALORS
nIdUser = sInfo[[5 A Position(sInfo,"$")-1]]
sLogin = sInfo[[Position(sInfo,"$")+1 A]]

// on détermine les buffers
nPosdeb1 = Position(sLogin,"&",1)
nPosdeb2 = Position(sLogin,"&",nPosdeb1+1)
nPosdeb3 = Position(sLogin,"&",nPosdeb2+1)
nPosdeb4 = Position(sLogin,"&",nPosdeb3+1)

sAnnonce = sLogin[[ A nPosdeb1-1]]
bufImage1 = sLogin[[nPosdeb1+1 A nPosdeb2-1]]
bufImage2 = sLogin[[nPosdeb2+1 A nPosdeb3-1]]
bufImage3 = sLogin[[nPosdeb3+1 A nPosdeb4-1]]
bufImage4 = sLogin[[nPosdeb4+1 A]]



HLitRecherche(INSCRIT,IDUTILISATEUR,nIdUser)
INSCRIT.Image = bufImage1
INSCRIT.image1 = bufImage2
INSCRIT.image2 = bufImage3
INSCRIT.image3 = bufImage4
INSCRIT.Annonce = sAnnonce

SectionCritiqueDébut("AA")
SI HModifie(INSCRIT)= Vrai ALORS
SocketEcrit(sNomCanal,"103 OK3")
SocketFerme(sNomCanal)
SectionCritiqueFin("AA")

Si je récupère bien l'annonce, les images ne s'enregistrent pas.

Une idée pour me sortir de la tourmente ?

Merci d'avance


Avatar
paratge
Merci pour ton aide, en fait j'avais oublié quelques chaines dans mon
code (la fatigue... certainement ;) )

Par contre, j'envoie 5 buffers en même temps, quel séparateur puis je
utiliser pour être certain qu'il ne sera pas dans les chaines envoyées,
j'ai choisi "&", mais j'ai peur que ce signe puisse être inclus dans un
des buffers.

Cordialement

patrice a écrit :
faut jamais utiliser de chaine avec des données binaire (au moindre 0 ca
tronque)
faut utiliser des buffers

"paratge" a écrit dans le message de
news:46a869f2$0$27389$
Bonjour,

Je reviens sur mon problème, car je sèche lamentablement :

j'ai une appli cliente qui envoie des informations sur un serveur via
sockets, et biensûr, un serveur qui les réceptionne.

Parmi toutes les infos envoyées, il y a les photos de l'utilisateur en
mémo binaire, et là, ça coince.

mon code coté client est :

IMAGE = SC_SelecteurFichier.SAI_FIC
HLit(INSCRIT,1)
gsImage1 = dSauveImageJPEG(IMAGE,enMémoire,60)
HAttacheMémo(INSCRIT,Image,SC_SelecteurFichier.SAI_FIC,hMémoImg)
HModifie(INSCRIT)


sNomSocket est une chaîne = "Ann_" + DateDuJour()+Maintenant()
sInfoUser, sOK est une chaîne
// Tentative de connexion
Message("Connexion au serveur.")
SocketConnecte(sNomSocket,cnPortSocketAjout,gsIpServeur,30000)
SI ErreurDétectée ALORS
// Erreur de connexion
Erreur("Impossible de joindre le serveur",ErreurInfo());Message()
RENVOYER Faux
SINON
HLit(INSCRIT,1)
sInfo est une chaîne
sInfo = Annonce+"&"+gsImage1+"&"+gsImage2+"&"+gsImage3+"&"+gsImage4
SocketEcrit(sNomSocket,"903 "+gnUser+"$"+sInfo)

sOK = SocketLit(sNomSocket,Faux,30000)
SI sOK = "103 OK3" ALORS
SocketFerme(sNomSocket)
Sablier(Faux)
FEN_ACCOUNT..Plan = 5
RENVOYER Vrai
SINON
Erreur("Une erreur a été détectée pendant la récupération des données.")
FIN
FIN

et le code coté serveur est :

sInfo = SocketLit(sNomCanal,Faux,30000)
SI sInfo[[A 3]] = "903" ET sInfo <>"" ALORS
nIdUser = sInfo[[5 A Position(sInfo,"$")-1]]
sLogin = sInfo[[Position(sInfo,"$")+1 A]]

// on détermine les buffers
nPosdeb1 = Position(sLogin,"&",1)
nPosdeb2 = Position(sLogin,"&",nPosdeb1+1)
nPosdeb3 = Position(sLogin,"&",nPosdeb2+1)
nPosdeb4 = Position(sLogin,"&",nPosdeb3+1)

sAnnonce = sLogin[[ A nPosdeb1-1]]
bufImage1 = sLogin[[nPosdeb1+1 A nPosdeb2-1]]
bufImage2 = sLogin[[nPosdeb2+1 A nPosdeb3-1]]
bufImage3 = sLogin[[nPosdeb3+1 A nPosdeb4-1]]
bufImage4 = sLogin[[nPosdeb4+1 A]]



HLitRecherche(INSCRIT,IDUTILISATEUR,nIdUser)
INSCRIT.Image = bufImage1
INSCRIT.image1 = bufImage2
INSCRIT.image2 = bufImage3
INSCRIT.image3 = bufImage4
INSCRIT.Annonce = sAnnonce

SectionCritiqueDébut("AA")
SI HModifie(INSCRIT)= Vrai ALORS
SocketEcrit(sNomCanal,"103 OK3")
SocketFerme(sNomCanal)
SectionCritiqueFin("AA")

Si je récupère bien l'annonce, les images ne s'enregistrent pas.

Une idée pour me sortir de la tourmente ?

Merci d'avance






Avatar
patrice
pas top non plus.
vaut mieux transmettre la longeur puis le buffer
comme ca en face, tu lit longueur, puis [longeur] caractères
sinon faut prendre un séparateur assez long (au moins une 30 de caractères)
pour réduire les chances de le trouver dans le fichier.

"paratge" a écrit dans le message de
news:
Merci pour ton aide, en fait j'avais oublié quelques chaines dans mon
code (la fatigue... certainement ;) )

Par contre, j'envoie 5 buffers en même temps, quel séparateur puis je
utiliser pour être certain qu'il ne sera pas dans les chaines envoyées,
j'ai choisi "&", mais j'ai peur que ce signe puisse être inclus dans un
des buffers.

Cordialement

patrice a écrit :
> faut jamais utiliser de chaine avec des données binaire (au moindre 0 ca
> tronque)
> faut utiliser des buffers
>
> "paratge" a écrit dans le message de
> news:46a869f2$0$27389$
>> Bonjour,
>>
>> Je reviens sur mon problème, car je sèche lamentablement :
>>
>> j'ai une appli cliente qui envoie des informations sur un serveur via
>> sockets, et biensûr, un serveur qui les réceptionne.
>>
>> Parmi toutes les infos envoyées, il y a les photos de l'utilisateur en
>> mémo binaire, et là, ça coince.
>>
>> mon code coté client est :
>>
>> IMAGE = SC_SelecteurFichier.SAI_FIC
>> HLit(INSCRIT,1)
>> gsImage1 = dSauveImageJPEG(IMAGE,enMémoire,60)
>> HAttacheMémo(INSCRIT,Image,SC_SelecteurFichier.SAI_FIC,hMémoImg)
>> HModifie(INSCRIT)
>>
>>
>> sNomSocket est une chaîne = "Ann_" + DateDuJour()+Maintenant()
>> sInfoUser, sOK est une chaîne
>> // Tentative de connexion
>> Message("Connexion au serveur.")
>> SocketConnecte(sNomSocket,cnPortSocketAjout,gsIpServeur,30000)
>> SI ErreurDétectée ALORS
>> // Erreur de connexion
>> Erreur("Impossible de joindre le serveur",ErreurInfo());Message()
>> RENVOYER Faux
>> SINON
>> HLit(INSCRIT,1)
>> sInfo est une chaîne
>> sInfo = Annonce+"&"+gsImage1+"&"+gsImage2+"&"+gsImage3+"&"+gsImage4
>> SocketEcrit(sNomSocket,"903 "+gnUser+"$"+sInfo)
>>
>> sOK = SocketLit(sNomSocket,Faux,30000)
>> SI sOK = "103 OK3" ALORS
>> SocketFerme(sNomSocket)
>> Sablier(Faux)
>> FEN_ACCOUNT..Plan = 5
>> RENVOYER Vrai
>> SINON
>> Erreur("Une erreur a été détectée pendant la récupération des


données.")
>> FIN
>> FIN
>>
>> et le code coté serveur est :
>>
>> sInfo = SocketLit(sNomCanal,Faux,30000)
>> SI sInfo[[A 3]] = "903" ET sInfo <>"" ALORS
>> nIdUser = sInfo[[5 A Position(sInfo,"$")-1]]
>> sLogin = sInfo[[Position(sInfo,"$")+1 A]]
>>
>> // on détermine les buffers
>> nPosdeb1 = Position(sLogin,"&",1)
>> nPosdeb2 = Position(sLogin,"&",nPosdeb1+1)
>> nPosdeb3 = Position(sLogin,"&",nPosdeb2+1)
>> nPosdeb4 = Position(sLogin,"&",nPosdeb3+1)
>>
>> sAnnonce = sLogin[[ A nPosdeb1-1]]
>> bufImage1 = sLogin[[nPosdeb1+1 A nPosdeb2-1]]
>> bufImage2 = sLogin[[nPosdeb2+1 A nPosdeb3-1]]
>> bufImage3 = sLogin[[nPosdeb3+1 A nPosdeb4-1]]
>> bufImage4 = sLogin[[nPosdeb4+1 A]]
>>
>>
>>
>> HLitRecherche(INSCRIT,IDUTILISATEUR,nIdUser)
>> INSCRIT.Image = bufImage1
>> INSCRIT.image1 = bufImage2
>> INSCRIT.image2 = bufImage3
>> INSCRIT.image3 = bufImage4
>> INSCRIT.Annonce = sAnnonce
>>
>> SectionCritiqueDébut("AA")
>> SI HModifie(INSCRIT)= Vrai ALORS
>> SocketEcrit(sNomCanal,"103 OK3")
>> SocketFerme(sNomCanal)
>> SectionCritiqueFin("AA")
>>
>> Si je récupère bien l'annonce, les images ne s'enregistrent pas.
>>
>> Une idée pour me sortir de la tourmente ?
>>
>> Merci d'avance
>
>