VB.NET, Flux et XML

Résolu
moinarf Messages postés 4 Date d'inscription lundi 30 janvier 2006 Statut Membre Dernière intervention 29 avril 2006 - 11 avril 2006 à 19:58
moinarf Messages postés 4 Date d'inscription lundi 30 janvier 2006 Statut Membre Dernière intervention 29 avril 2006 - 29 avril 2006 à 18:43
Bonjour !!

Un soucis de socket en VB.Net (2005)... Je vous explique :
Je tente de faire un client Jabber, j'ai beaucoup avancé le travail pour
le traitement du XML, les fenetre de chat, etc, etc... mais je n'arrive pas a
me connecter correctement au serveur et a echanger des information.

Techniquement :
La connections doit etre un flux, si jamais on "coupe" le flux, la connection est arreté par le
serveur. Initialement, je me servais de socket... mais je n'arrivais pas a envoyer les données
sans rompre le flux.
Donc je tente avec un TCPClient...

Le serveur est jabber.fr, le port 5222
La connection la plus aboutie que j'ai pu avoir était avec ce code (récupéré ici-même si je me rapelle bien ) :

Public Function Test2()

Dim tcpClient As New System.Net.Sockets.TcpClient()
tcpClient.Connect("jabber.Fr", 5222)
Dim networkStream As NetworkStream = tcpClient.GetStream()
If networkStream.CanWrite And networkStream.CanRead Then
' Do a simple write.
Dim sendBytes As [Byte]() = Encoding.ASCII.GetBytes("<?xml version='1.0' encoding='UTF-8'?><stream:stream xmlns:stream='http://etherx.jabber.org/streams' version='1.0' xmlns='jabber:client' to='jabber.fr'>")
networkStream.Write(sendBytes, 0, sendBytes.Length)
' Read the NetworkStream into a byte buffer.
Dim bytes(tcpClient.ReceiveBufferSize) As Byte
networkStream.Read(bytes, 0, CInt(tcpClient.ReceiveBufferSize))
' Output the data received from the host to the console.
Dim returndata As String = Encoding.ASCII.GetString(bytes)

returndata = Encoding.ASCII.GetString(bytes)

MsgBox(("Host returned: " + returndata))

Else
If Not networkStream.CanRead Then
MsgBox("cannot not write data to this stream")
tcpClient.Close()
Else
If Not networkStream.CanWrite Then
MsgBox("cannot read data from this stream")
tcpClient.Close()
End If
End If
End If

Return True
End Function

Mais j'ai encore des problémes avec ce code, par exemple :
- la fonction Read est bloquante, je pense qu'il faut le mettre en "thread", mais je ne sait pas faire
- j'ai ecrit les fonction de traitement du XML recu, elles traitent des "XmlTextReader", il faudrait que ce que je récupére du reseaux soit dans ce format...

Et un dernier probléme qui demande de plus amples présentation :
Lorsque l'on se connecte, il faut envoyer un message de "presentation" :
<?xml version='1.0' encoding='UTF-8'?>
<stream:stream xmlns:stream='http://etherx.jabber.org/streams' version='1.0' xmlns='jabber:client' to='jabber.fr'>

Si tout ce passe bien, le serveur repond :
<stream:stream xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams' from='jabber.fr' id='1261087827' version='1.0'>
<stream:features>
<register xmlns='http://jabber.org/features/iq-register'/>

</stream:features>

Et la, j'arrive (treeees difficilement) a avoir la reponse, mais que du premier élèment, le "<stream:features>" est aprés, et le reste encore aprés (je présume)...

Voilou... J'annonce la couleur : je ne comprends pas grand chose au socket, ce projet était surtout l'occasion de faire un programme se basant sur des standart connu. Normalement, ca devrait etre un ami qui develloppe la fonction de connection et de lecture, mais il n'y arrive vraiment pas donc je tente de l'aider.

N'hésitez pas a me poser des questions, je repondrais volontier.

PS : ce client Jabber sera publié en GPL dés début mai... si on arrive a faire lire et ecrire ces satané connections
PS2 : je sait qu'il existe une dll jabber-net.dll, open-source, en C#, mais la connection est vraiment le seul point qui pose vraiment soucis, je doit reconnaitre que je trouverai assez frustrant de devoir intégré une dll etrangére que je ne comprend pas alors qu'il manque "si peu"...

En vous remerciant !!

1 réponse

moinarf Messages postés 4 Date d'inscription lundi 30 janvier 2006 Statut Membre Dernière intervention 29 avril 2006
29 avril 2006 à 18:43
Pour la connection :
    dim JibClient As New TcpClient(server, port)
    public JibStream As Stream = JibClient.GetStream
   
Pour envoyer un Message :
        Dim data As Byte() = System.Text.Encoding.ASCII.GetBytes(Message)
        JibStream.Write(data, 0, data.Length)
 
Pour lire le XML que l'on recoit :
dim JibStreamXML As XmlTextReader(JibStream)
while JibStreamXML.read()
    msgbox (JibStreamXML.name)
end while

Et pour déconnecter : 
        JibStream.Close()
        JibClient.Close()

Voila, c'était tout bete, mais j'ai eu du mal a trouver. J'espére que ca pourra aider quelqu'un !!
3
Rejoignez-nous