为什么我的TCP连接关闭?

时间:2016-05-30 23:48:05

标签: vb.net tcp tcpclient

我为我的游戏服务器开发了一个应用程序。现在,在这个应用程序中按下" Connect"它将数据发送到我的游戏服务器。确实如此,问题是,当它发送连接时它会自动关闭它,我不想关闭它,因为我有一个套接字插件,可以在玩家离开游戏后杀死TCP连接。现在在我的本地主机上工作,TCP没有"死亡"但是在我的vps上断开连接,有人可以查看我的代码并查看我是否做错了什么?

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的服务器日志:

  

[01:12:15] [LAUNCHER]与套接字服务器的连接。 | ClientID:[0] |   ClientIP:[92.241.153.29] [01:12:15]远程客户端[0]已发送:   Joan_Mackey [01:12:16] [发射器]播放器插座断开连接|   ClientID:[0] |玩家ID:[0]

1 个答案:

答案 0 :(得分:0)

您应该将Dim client As New TcpClient()初始化移至类级别。类级别意味着您将其置于任何方法之外(即,在任何SubFunction之外)。

按照目前的情况,垃圾收集器会在您退出放入的任何方法后收集TcpClient。在您通过End Sub后,TcpClient在技术上是否定的使用时间更长,因为您无法再访问该特定实例。垃圾收集器在运行时会检查它,并且当您的变量不再使用时,它将被收集。

当垃圾收集器收集对象时,它开始释放对象的未使用资源。如果对象(或任何子对象)实现IDisposable接口,则垃圾收集器将首先调用该对象的Dispose()方法。

TcpClients构建于System.Net.Sockets.Socket类之上。 Socket类实现IDisposable,这意味着it has got a Dispose() method。垃圾收集器将为TcpClient的底层套接字调用此方法。当它被调用时,套接字将自动关闭并告诉端点它正在断开连接 - 这就是你遇到的情况。

总结一下:

  1. 传递TcpClient后,End Sub不再使用。

  2. 当垃圾收集器运行时,它将开始释放TcpClient的资源,并在底层套接字上调用Dispose()

  3. 底层套接字将告诉端点它正在断开连接,然后它将终止连接。

  4. 现在您与服务器的连接已不再打开。