Bonjour,
Mon objectif est d'envoyer des informations à un service pour qu'il effectue des opérations.
J'ai donc créé deux fonctions:
une pour l'allé-retour (l'application envoie un texte qui va être lu par le service qui va effectuer l'opération et renvoyer une information) et une pour l'allé (l'application envoie l'information et le service exécute l'opération demandée et il n'y a pas de variable retournée).
Voici le code de ses fonctions :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
|
Public Sub alle(ByVal valEnv As String)
Dim Log As New LogGenerator
Try
Dim textFinal As String = PreparEnvoie(valEnv)
Dim content(1024) As Byte
content = System.Text.Encoding.ASCII.GetBytes(textFinal.ToCharArray())
Dim client As New Net.Sockets.TcpClient()
'Le client va lancer la fonction SendCallBack'
Dim EndPoint As Net.IPEndPoint
Dim ipLocale As Long = 16777343
EndPoint = New Net.IPEndPoint(ipLocale, 1039)
client.Connect(EndPoint)
Dim flux As Net.Sockets.NetworkStream = client.GetStream()
flux.Write(content, 0, content.Length)
flux.Flush()
flux.Close()
client.Close()
Catch ex As Exception
Log.trace(ex.ToString)
End Try
End Sub
Public Function alleRetour(ByVal valEnv As String) As String
Dim log As New LogGenerator
Try
Dim textFinal As String = PreparEnvoie(valEnv)
Dim content(1024) As Byte
Dim content2(1024) As Byte
content = System.Text.Encoding.ASCII.GetBytes(textFinal.ToCharArray())
Dim client As New Net.Sockets.TcpClient()
'Le client va lancer la fonction SendCallBack'
Dim EndPoint As Net.IPEndPoint
Dim ipLocale As Long = 16777343
EndPoint = New Net.IPEndPoint(ipLocale, 1039)
client.Connect(EndPoint)
Dim flux As Net.Sockets.NetworkStream = client.GetStream()
flux.Write(content, 0, content.Length)
flux.Read(content2, 0, content2.Length)
Dim retour As String = System.Text.Encoding.ASCII.GetString(content2)
Dim retour2 As String() = retour.Split("#")
Return retour2(0)
flux.Flush()
flux.Close()
client.Close()
Catch ex As Exception
Log.trace(ex.ToString)
End Try
End Function |
(la fonction prepareenvoie n'a pas d'importance, le probleme ne venant pas de là)
Il est à noter que j'envoie au service un nom d'opération à exécuter sous la forme : "operation#" ce qui me permet de rajouter des données après le # dans le cas où j'ai des données à joindre (par exemple pour une fonction de set).
Maintenant le service qui est sous cette forme
Ici aussi la fonction decrypt n'a pas d'importance, ce n'est pas là qu'est le problème.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
|
Public Class Service1
'--------------------------------- Declaration de variables -----------------------------------
Public reception As New Threading.ManualResetEvent(False)
Private listener As Net.Sockets.TcpListener
Const PORT_NUM As Integer = 1039
Dim EndPoint As Net.IPEndPoint
Dim valArenvoyer As String
'---Fonction au demarrage du service :Lancement du thread correspondant à la fonction "General" et qui va tourner en boucle---
Protected Overrides Sub OnStart(ByVal args() As String)
Dim thread As New System.Threading.Thread(AddressOf General)
thread.IsBackground = True
thread.Start()
End Sub
'----------------------------Thread qui va tourner en boucle et attendre une connexion d'un client-------------------
Public Sub General()
Dim ipLocale As Long = 16777343
EndPoint = New Net.IPEndPoint(ipLocale, 1039)
Dim listener As New TcpListener(EndPoint)
listener.Start()
While True
reception.Reset()
listener.BeginAcceptTcpClient(New AsyncCallback(AddressOf AcceptCallback), listener)
reception.WaitOne()
End While
End Sub
Public Sub AcceptCallback(ByVal ar As IAsyncResult)
Try
Dim log As log4Raid
log = New log4Raid("C:\User\U349428\Documents\Visual Studio 2005\Projects\EssServ\log", "Log")
Dim bit(1024) As Byte
Dim biit(1024) As Byte
Dim listener As TcpListener = CType(ar.AsyncState, TcpListener)
Dim client As TcpClient = listener.EndAcceptTcpClient(ar)
Dim stream As NetworkStream = client.GetStream()
stream.Read(bit, 0, bit.Length)
Dim valeurrecue As String = System.Text.Encoding.ASCII.GetString(bit)
Dim valeurrecue2 As String = Decrypt(valeurrecue)
Select Case valeurrecue2
(cas d'un aller sans donnee)
Case "operation1"
setAutoSystem("true") 'on effectue l'opération associée'
stream.Flush()
stream.Close()
client.Close()
(cas d'un allerretour)
Case "operation2"
Dim droitAdm As String = verifieDroitAdmin() + "#"
biit = System.Text.Encoding.ASCII.GetBytes(droitAdm.ToCharArray())
stream.Write(biit, 0, biit.Length)
stream.Flush()
stream.Close()
client.Close()
(cas d'un allerr vec donnees)
Case Else
If (valeurrecue2.StartsWith("operation3")) Then
Dim valeur As String = valeurrecue2.Substring(11)
' le substring sert à récupérer la valeur de l'aller avec donnée)
runApplication(valeur) 'on effectue l'operation
stream.Flush()
stream.Close()
client.Close()
End If
End Select
reception.Set()
Catch ex As Exception
End Try
End Sub |
Mon problème est que quand je lance une opération d'aller retour je récupère bien la valeur dans mon application. Cependant si je la relance plus tard, je ne récupère rien et le programme ne répond plus.
Prenons un exemple,
dans mon code j'ai cela en bleu qui me renvoie bien une valeur true :
If (CBool(alleRetour("verifDroitAdmin")) = False)
Or, apres, quand j'effectue cette operation, cela plante :
"MajVariablesEnvironnements(getidAddinByLibapp(MenuApp13.Text),
CBool(alleRetour("verifDroitAdmin")))"
(si je remplace le CBool(alleRetour("verifDroitAdmin")) par True ou False, cela marche ce qui signifie que le probleme vient de là normalement)
Merci d'avance pour votre aide et vos conseils
Partager