为什么我的TCP连接关闭?

为什么我的TCP连接关闭?

问题描述:

我为我的游戏服务器开发了一个应用程序。现在,在这个应用程序中,当我按下“连接”时,它将数据发送到我的游戏服务器。它的确如此,但问题是,当它发送连接时它会自动关闭它,而我不想关闭它,因为我有一个套接字插件,在玩家离开游戏后杀死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

您应该将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:现在你有一个更彻底的解释,为什么它发生在第一个地方:)。尽量保持在你的脑海里,当你想保持一个变量“活着”时,你应该总是在课堂上声明它**除非**它已经在其他地方引用了。 - 祝你的项目顺利! –