2012-05-15 2 views
1

J'ai un problème et j'étais curieux de savoir si quelqu'un pouvait m'aider à le résoudre. J'ai pris un tutoriel pour la programmation de socket client-serveur pour VB.NET. J'ai alors essayé de l'implémenter en utilisant un service plutôt qu'un programme. Je comprends comment cela fonctionne en tant que programme, mais quand j'essaie de le transférer vers un service, cela ne fonctionne pas. Quand je cours le service il commence et s'arrête immédiatement. Il ne fait jamais de connexion. Malheureusement, je ne suis pas très bon en programmation VB.net mais jusqu'à présent je l'aime beaucoup pour le développement rapide des programmes.Service VB.net Programmation et utilisation des sockets TCP

L'idée de ce service est de:

  1. course lorsque l'ordinateur démarre
  2. saisir le nom du PC
  3. Envoyer le nom du PC au serveur

    une . le serveur prend alors le nom et le regarde dans une base de données

    b. renvoie l'heure à laquelle la machine cliente est supposée sauvegarder

  4. La machine cliente effectue ensuite le calcul pour l'heure actuelle et le temps qu'elle est supposée sauvegarder & tout mettre en ms.

  5. Ensuite, la machine sauvegarde à ce moment précis en exécutant une commande DOS pour lancer le programme.

Maintenant, pour répondre à une question que j'ai trouvé commune dans les forums. Pourquoi n'utilise-t-on pas le planificateur de tâches? Eh bien, j'ai utilisé le calendrier des tâches et j'ai eu les temps de contrôle du serveur sur les machines de cette façon. Cependant, certains ordinateurs vont entrer dans un état dormant, je dirais que cet état dormant affecte 20% des machines. Non cet état dormant n'est pas en mode veille et non en hibernation. Les ordinateurs sont allumés et réagissent très rapidement au mouvement de la souris. J'ai créé un service qui écrit l'heure dans un fichier sur le C: \ et cela a toujours fonctionné. Alors maintenant, j'ai décidé d'avoir un service sur la machine client et de le faire communiquer avec le serveur.

J'ai recueilli très peu d'informations sur la création de service et la programmation de socket réseau. Malheureusement, je n'ai rien trouvé qui lie les 2 ensemble. J'ai trouvé un programme client-serveur vb.net qui fait ce que je veux, mais je le veux comme un service pas un programme. J'ai trouvé une solution temporaire avec la création de fichiers en utilisant PSEXEC à partir du serveur, mais ce processus est tellement simple. J'ai fait la meilleure chose suivante et je suis allé et a examiné la bibliothèque de Microsoft pour les sockets et j'ai essayé de construire mon propre service basé sur ce qui est logique. Toujours rien ne fonctionne. Si vous connaissez des livres, des ressources, des conseils, etc. toute aide que vous pouvez me donner sera grandement appréciée. Merci pour votre aide.

Ci-dessous vous trouverez mon code. À ce stade, tout ce que je tiens à faire est de faire les connexions entre les clients et le serveur. Je peux revenir à trouver le reste et tweek le code à partir de là.

Mike

Voici le code du serveur Je joue avec:

Imports System.Net.Sockets 
Imports System.Net 
Imports System.Text 

Public Class BackupService 

    Private Mythread As Threading.Thread 
    Private clientThread As Threading.Thread 
    Private listener As New TcpListener(IPAddress.Parse("#.#.#.252"), 8888) 



    Protected Overrides Sub OnStart(ByVal args() As String) 
     ' Add code here to start your service. This method should set things 
     ' in motion so your service can do its work. 

     listener.Start()   'Listener for clients 
     System.IO.File.WriteAllText("C:\test\listener.txt", My.Computer.Clock.LocalTime) 
     Mythread = New Threading.Thread(AddressOf listenerLoop) 
     Mythread.Start() 

    End Sub 

    Protected Overrides Sub OnStop() 
     ' Add code here to perform any tear-down necessary to stop your service. 
     Mythread.Abort() 
    End Sub 

    Protected Sub listenerLoop() 

     Dim client As TcpClient = listener.AcceptTcpClient() 
     Dim networkStream As NetworkStream = client.GetStream 
     Dim bytes(client.ReceiveBufferSize) As Byte 
     Dim dataReceived As String 


     While True 
      networkStream.Read(bytes, 0, CInt(client.ReceiveBufferSize))   'Receives data from client and stores it into bytes 
      dataReceived = Encoding.ASCII.GetString(bytes)       'Encodes the data to ASCII standard 
      System.IO.File.AppendAllText("C:\test\listener.txt", dataReceived)  'Copies information to text file 
      Threading.Thread.Sleep(1000) 

     End While 




     'Listening for incoming connections 
     'While True 
     ' If (listener.Pending = False) Then 
     '  System.IO.File.AppendAllText("C:\test\listener.txt", "Sorry, no connection requests have arrived") 
     ' Else 
     '  'Finds Incoming message and creates a thread for the client-server to pass information' 
     '  clientThread = New Threading.Thread(AddressOf clientConnection) 
     '  clientThread.Start() 

     ' End If 
     ' Threading.Thread.Sleep(1000) 'Let loop/thread sleep for 1 second to allow other processing and waits for clients 
     'End While 
    End Sub 

    'Protected Sub clientConnection() 
    ' Dim client As TcpClient = listener.AcceptTcpClient() 
    ' Dim networkStream As NetworkStream = client.GetStream 
    ' Dim bytes(client.ReceiveBufferSize) As Byte 
    ' Dim dataReceived As String 
    ' Dim datasent As Boolean = False 

    ' While datasent = False 'Continuously loops looking for sent data 
    '  If (networkStream.CanRead = True) Then 
    '   networkStream.Read(bytes, 0, CInt(client.ReceiveBufferSize))   'Receives data from client and stores it into bytes 
    '   dataReceived = Encoding.ASCII.GetString(bytes)       'Encodes the data to ASCII standard 
    '   System.IO.File.AppendAllText("C:\test\listener.txt", dataReceived)  'Copies information to text file 
    '   datasent = True 
    '  End If 
    '  Threading.Thread.Sleep(1000) 
    ' End While 

    ' networkStream.Close()  'Closes the network stream 
    ' client.Close()    'Closes the client 
    ' clientThread.Abort()  'Kills the the current thread 

    'End Sub 
End Class 

Code client (service):

Imports System.Net.Sockets 
Imports System.Net 
Imports System.Text 
Public Class TestWindowsService 

    Dim Mythread As Threading.Thread 

    Protected Overrides Sub OnStart(ByVal args() As String) 
     ' Add code here to start your service. This method should set things 
     ' in motion so your service can do its work. 


     'clientCommunication() 


     Mythread = New Threading.Thread(AddressOf KeepCounting) 
     Mythread.Start() 
    End Sub 

    Protected Overrides Sub OnStop() 
     ' Add code here to perform any tear-down necessary to stop your service. 

     Mythread.Abort() 
    End Sub 

    'Protected Sub KeepCounting() 
    ' Dim wait As Integer = 0 
    ' Dim hour As Integer = 0 
    ' Dim min As Integer = 0 

    ' System.IO.File.WriteAllText("C:\test\StartTime.txt", "Start Time: " & My.Computer.Clock.LocalTime) 


    ' Do While True 

    '  hour = My.Computer.Clock.LocalTime.Hour 

    '  If (hour = 1) Then 
    '   min = (My.Computer.Clock.LocalTime.Minute * 60) + 60000 
    '   Threading.Thread.Sleep(min)   'Sleeps for the number of minutes till 2am 
    '   file.FileTime() 
    '  Else 
    '   Threading.Thread.Sleep(3600000)  'Sleeps for 1 hour 
    '   System.IO.File.WriteAllText("C:\test\hourCheck\ThreadTime.txt", "Time: " & My.Computer.Clock.LocalTime) 

    '  End If 

    ' Loop 

    'End Sub 

    Protected Sub KeepCounting() 
     Dim tcpClient As New System.Net.Sockets.TcpClient() 
     tcpClient.Connect(IPAddress.Parse("#.#.#.11"), 8000) 
     Dim networkStream As NetworkStream = tcpClient.GetStream() 

     If networkStream.CanWrite And networkStream.CanRead Then 

      ' Do a simple write. 
      Dim sendBytes As [Byte]() = Encoding.ASCII.GetBytes("Is anybody there") 
      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) 
      Console.WriteLine(("Host returned: " + returndata)) 


     Else 
      If Not networkStream.CanRead Then 
       Console.WriteLine("cannot not write data to this stream") 
       tcpClient.Close() 
      Else 
       If Not networkStream.CanWrite Then 
        Console.WriteLine("cannot read data from this stream") 
        tcpClient.Close() 
       End If 
      End If 
     End If 
     ' pause so user can view the console output 
     Console.ReadLine() 


    End Sub 

End Class 

Code client (module étendu)

Imports System.Net.Sockets 
Imports System.Net 
Imports System.Text 

Module Client_TCP_Communication 

    Public Sub clientCommunication() 
     Dim tcpClient As New System.Net.Sockets.TcpClient() 
     tcpClient.Connect("127.0.0.1", 8000) 
     Dim networkStream As NetworkStream = tcpClient.GetStream() 

     If networkStream.CanWrite And networkStream.CanRead Then 

      ' Do a simple write. 
      Dim sendBytes As [Byte]() = Encoding.ASCII.GetBytes("Is anybody there") 
      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) 
      Console.WriteLine(("Host returned: " + returndata)) 


     Else 
      If Not networkStream.CanRead Then 
       Console.WriteLine("cannot not write data to this stream") 
       tcpClient.Close() 
      Else 
       If Not networkStream.CanWrite Then 
        Console.WriteLine("cannot read data from this stream") 
        tcpClient.Close() 
       End If 
      End If 
     End If 
     ' pause so user can view the console output 
     Console.ReadLine() 





     'Dim clientSocket As New System.Net.Sockets.TcpClient() 
     'Dim serverStream As NetworkStream 

     'While True 
     ' serverStream = clientSocket.GetStream() 
     ' Dim outStream As Byte() = System.Text.Encoding.ASCII.GetBytes("Message from client$") 
     ' Dim inStream(1024) As Byte 
     ' Dim returnData As String 

     ' System.IO.File.WriteAllText("C:\test\client\ClientStarted.txt", "Time: " & My.Computer.Clock.LocalTime) 
     ' clientSocket.Connect(IPAddress.Parse("#.#.#.11"), 8999) 
     ' System.IO.File.WriteAllText("C:\test\client\ClientConnected.txt", "Time: " & My.Computer.Clock.LocalTime) 

     ' serverStream.Write(outStream, 0, outStream.Length) 
     ' serverStream.Flush() 

     ' serverStream.Read(inStream, 0, CInt(clientSocket.ReceiveBufferSize)) 
     ' returnData = System.Text.Encoding.ASCII.GetString(inStream) 
     ' System.IO.File.WriteAllText("C:\test\client\returnData.txt", "Time: " & returnData) 

     'End While 

    End Sub 

End Module 

Répondre

1

Pour f Indiquez pourquoi il démarre et s'arrête, vous pouvez essayer de rechercher dans le journal des événements d'application après avoir essayé de démarrer le service. Peut être en cours d'exécution dans une erreur sur (ou juste après) le démarrage qui provoque l'arrêt du service. J'ai rencontré ce problème en essayant d'écrire un service similaire - dans mon cas, j'essayais de détecter automatiquement l'adresse IP à utiliser, et il s'est avéré qu'il sélectionnait par inadvertance mon adresse de bouclage IPv6 et ne parvenait pas à lier . Une erreur dans le journal des événements a fait allusion à cela pour moi.