我有一个问题,我很好奇是否有人可以帮助我解决它。我学习了 VB.NET 的客户端-服务器套接字编程教程。然后我尝试使用服务而不是程序来实现它。我了解它作为程序是如何工作的,但是当我尝试将它移植到服务时它不起作用。当我运行该服务时,它会立即启动和停止。它永远不会建立联系。不幸的是,我不是 VB.net 程序员那么出色,但到目前为止,我非常喜欢它,因为它可以快速开发程序。
这项服务的理念是:
- 计算机启动时运行
- 获取 PC 的名称
将 PC 的名称发送到服务器
一个。然后服务器获取名称并在数据库中查找
湾。返回客户端计算机应该备份的时间
然后,客户端计算机计算当前时间和假设备份的时间并将所有内容放在毫秒中。
- 然后机器在指定时间通过运行 dos 命令启动程序进行备份。
现在回答一个我在论坛中发现的常见问题。为什么我不使用任务调度程序。好吧,我确实使用了任务计划,并以这种方式让服务器控制机器的时间。但是,有些计算机会进入休眠状态,我会说这种休眠状态会影响 20% 的机器。不,这种休眠状态不是睡眠模式,也不是休眠。计算机已打开,它们对鼠标移动的反应非常迅速。我创建了一个服务,将时间写入 C:\ 上的文件,这一直有效。所以现在我决定在客户端机器上提供一个服务并让它与服务器通信。
我收集的关于创建服务和网络套接字编程的信息非常少。不幸的是,我还没有找到将两者联系在一起的任何东西。我找到了一个 vb.net 客户端-服务器程序,它可以满足我的需求,但我希望它作为服务而不是程序。我找到了一个使用 PSEXEC 从服务器创建文件的临时解决方案,但是这个过程实在是太简单了。
我做了下一件最好的事情,然后我去查看了 Microsoft 套接字库,并尝试基于有意义的内容构建我自己的服务。仍然没有任何效果。如果您知道任何书籍、资源、有任何建议等,您能给我的任何帮助将不胜感激。谢谢您的帮助。
您将在下面找到我的代码。在这一点上,我关心的只是在客户端和服务器之间建立连接。我可以回去找出其余的并从那里修改代码。
麦克风
这是我一直在玩的服务器代码:
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
客户代码(服务):
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
客户端代码(扩展模块)
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