2013-10-14 45 views
0

因此,我的程序從計算「XProcess」的多少個進程開始,並有一個定時器每隔1秒檢查一次,這很好用!我有輸入設置變量的計數。然後我有一個子例程,它接受該設置變量以及一個IF語句來輸出TCPClient正在發送字符串(「One Process」)。VB.NET TCPClient /服務器問題 - 在定時器上發送

那麼問題是,我沒有事件用於子例程,所以我把它與計時器綁定,每隔1秒發送一次消息。 TCPClient現在將它發送到本地地址(127.0.0.1),並將其發送到文本框。那麼問題!

它重複(「一個進程」)一遍又一遍,我可以看到爲什麼會發生這種情況。

所以在下面的代碼中,TCPClient如何向TCPServer和TCPSERVER發送「XProcess」有多少進程吐出一個或多個進程正在運行的通知?(服務器不斷重複字符串(整數運行如此)一遍又一遍)

下面的工作,但重複有多少進程作爲字符串運行。

MainWindow.xaml.vb

Imports System.Windows.Threading 
Imports System.Net.Sockets 

Public Class MainWindow 
    Private Run_ProgramRunCheck_timer As New DispatcherTimer 
    Private Run_RecieveCheck_timer As New DispatcherTimer 
    Dim processCount As Integer 
    Private Sub Window_Loaded(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles MyBase.Loaded 
     ServerStart() 

     'Check for program changes every second 

     ' Set interval for timer 
     Run_ProgramRunCheck_timer.Interval = TimeSpan.FromMilliseconds(1000) 


     'Start timer on button click 
     Run_ProgramRunCheck_timer.Start() 

     AddHandler Run_ProgramRunCheck_timer.Tick, AddressOf __ProgramCheck 


     'Check for Message Recieve every second 

     ' Set interval for timer 
     Run_RecieveCheck_timer.Interval = TimeSpan.FromMilliseconds(1000) 


     'Start timer on button click 
     Run_RecieveCheck_timer.Start() 

     AddHandler Run_RecieveCheck_timer.Tick, AddressOf _RecieveMessageConvert 
     TCPClientSender() 


    End Sub 
    Public Sub __ProgramCheck() 
     'This sub will be checked every 1 seconds for changes 

     'Count number of processes 
     processCount = Process.GetProcessesByName("tvnviewer").Count() 
     My.Settings.TotalProcesses = processCount 


    End Sub 

    Public Sub TCPClientSender() 
     My.Settings.TotalProcesses = 0 
     If My.Settings.TotalProcesses = 1 Then 
      Dim port As Int32 = 50000 
      Dim client As New TcpClient("127.0.0.1", port) 
      ' Translate the passed message into ASCII and store it as a Byte array. 


      Dim data As [Byte]() = System.Text.Encoding.ASCII.GetBytes("One Process") 

      ' Get a client stream for reading and writing. 
      ' Stream stream = client.GetStream(); 
      Dim stream As NetworkStream = client.GetStream() 

      ' Send the message to the connected TcpServer. 
      stream.Write(data, 0, data.Length) 
     End If 



    End Sub 

    Public Sub _RecieveMessageConvert() 

     TextBlock1.Text = My.Settings.StoreSentMessage 
    End Sub 
End Class 

TCPServer.vb

Imports System.Net 
Imports System.Threading 
Imports System.Net.Sockets 
Imports System.IO 

Public Module TCPServer 

    Dim Server = New TcpListener(IPAddress.Any, 50000) ' <-- Listen on Port 50,000 
    Dim Client As New TcpClient 
    Private ServerThread As Thread = Nothing 
    Dim Message As String = "" 
    Private Threads As New List(Of Thread) 

    Public Sub ServerStart() 
     ServerThread = New Thread(AddressOf ConnectionListener) 
     ServerThread.IsBackground = True 
     ServerThread.Start() 
    End Sub 
    Private Sub ConnectionListener() 
     Try 
      Server.Start() 

      While True 

       Dim client As TcpClient = Server.AcceptTcpClient ' Blocks until Connection Request is Received 



       Dim Reader As New StreamReader(client.GetStream()) 

       While Reader.Peek > -1 
        Message = Message + Convert.ToChar(Reader.Read()).ToString 


       End While 


       My.Settings.StoreSentMessage = Message 



      End While 
     Catch ex As Exception 

     End Try 

    End Sub 




End Module 
+0

注意:「XPROCESS」表示任何過程。是的,我有tvnviewer作爲進程,但進程名稱並不重要。 –

+0

你的代碼有點混亂,你的指示不太清楚。你能解釋一下兩個計時器有什麼作用嗎?您正在啓動第一個計時器(填充.TotalProcesses),然後執行更多代碼並調用另一個計時器(填充TextBlock1.Text)。只要沒有任何一個.Stop()方法(儘管在邏輯上不執行上述中間操作),兩個定時器都會保持運行(每秒一次)。你能詳細闡述一下你想要的東西嗎? – varocarbas

回答

1

不要你只是想這樣做:

Dim data As [Byte]() = System.Text.Encoding.ASCII.GetBytes(My.Settings.TotalProcesses) 

我不知道你曾經得到它如果將該值設置爲零,然後檢查下一行的值是否爲1,請說「One Process」?

My.Settings.TotalProcesses = 0 
If My.Settings.TotalProcesses = 1 Then