2016-05-30 93 views
0

我爲我的遊戲服務器開發了一個應用程序。現在,在這個應用程序中,當我按下「連接」時,它將數據發送到我的遊戲服務器。它的確如此,但問題是,當它發送連接時它會自動關閉它,而我不想關閉它,因爲我有一個套接字插件,在玩家離開遊戲後殺死TCP連接。現在在我的本地主機上它工作,TCP不會「死」,但在我的VPS它斷開連接,有人可以請檢查我的代碼,看看我是否做錯了什麼?爲什麼我的TCP連接關閉?

Dim p() As Process 
          Dim gta() As Process 

          p = Process.GetProcessesByName("samp") 
          gta = Process.GetProcessesByName("gta_sa") 

          If p.Count > 0 Then 
           MsgBox("Vec imate pokrenut SAMP - ugasite ga.") 

          ElseIf gta.Count > 0 Then 
           MsgBox("Vec imate pokrenut GTA San Andreas - ugasite ga.") 

          Else 


           Try 
            Dim prozess As Process = Process.GetProcessesByName("samp")(0) 
            prozess.Kill() 
           Catch ex As Exception 

           End Try 
           My.Computer.Registry.SetValue("HKEY_CURRENT_USER\Software\SAMP", "PlayerName", TextBox1.Text) 
           Process.Start("samp://164.132.229.172:7777") 



           Dim client As New TcpClient() 
           client.Connect("164.132.229.172", 7775) 
           Dim sendBytes As [Byte]() = System.Text.Encoding.ASCII.GetBytes(TextBox1.Text) 

           Dim stream As NetworkStream = client.GetStream() 
           stream.Write(sendBytes, 0, sendBytes.Length) 

           Timer1.Start() 

          End If 

         End If 

定時器:

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick 
    Dim pd() As Process 
    pd = Process.GetProcessesByName("Aimbot By The2Gamers") 
    If pd.Count > 0 Then 
     Dim InternetExplorer() As Process = Process.GetProcessesByName("Aimbot By The2Gamers") 
     For Each Process As Process In InternetExplorer 
      Process.Kill() 
     Next 
    End If 
End Sub 

現在這部分到這裏是從我的VPS只服務器日誌:

[一點12分15秒] [啓動]連接到套接字服務器。 | ClientID:[0] | ClientIP:[92.241.153.29] [01:12:15]遠程客戶端[0]發送了: Joan_Mackey [01:12:16] [LAUNCHER] Player Socket disconnected | ClientID:[0] | PlayerID:[0]

+0

計時器導致問題,我在哪裏啓動計時器? – Nathaniel

+0

當我把我的代碼這樣,TCP停止自己,但是當我刪除計時器它的工作原理: – Nathaniel

+0

再次測試它,每當我嘗試檢查某個進程是否在此計時器中運行它將殺死TCP – Nathaniel

回答

0

您應該將Dim client As New TcpClient()初始化移動到類級別。課程級別意味着您將其置於任何方法之外(即,在任何SubFunction之外)。

既然這樣,你的TcpClient被垃圾收集器收集你退出後,你把它放在任何方法,你過去後End SubTcpClient技術上不再使用,因爲你不能再訪問該特定實例。垃圾收集器在運行時檢查它,並且隨着變量不再使用,它​​將被收集。

當垃圾收集器收集一個對象時,它開始釋放該對象的未使用資源。如果對象(或任何子對象)實現了界面,垃圾收集器將首先調用該對象的方法Dispose()

TcpClients構建在System.Net.Sockets.Socket類的頂部。 Socket類實現IDisposable,這意味着it has got a Dispose() method。垃圾收集器將爲您的TcpClient的底層套接字調用此方法。當它被調用時,套接字將自動關閉,並告訴端點它已斷開連接 - 而這正是您正在經歷的。

所以總結:

  1. TcpClient不再使用您通過End Sub後。

  2. 當垃圾收集器運行時,它將開始釋放TcpClient的資源,並在底層套接字上調用Dispose()

  3. 底層套接字將告訴端點它已斷開連接,然後它將終止連接。

  4. 現在您的服務器連接不再打開。

+0

@Nathaniel:現在你有一個更徹底的解釋,爲什麼它發生在第一個地方:)。儘量保持在你的腦海裏,當你想保持一個變量「活着」時,你應該總是在課堂上聲明它**除非**它已經在其他地方引用了。 - 祝你的項目順利! –