【问题标题】:Why is my TCP connection closing?为什么我的 TCP 连接关闭?
【发布时间】:2016-05-30 23:48:05
【问题描述】:

我为我的游戏服务器开发了一个应用程序。现在,在这个应用程序中,当我按下“连接”时,它会将数据发送到我的游戏服务器。确实如此,但是问题是,当它发送连接时它会自动关闭它,我不想关闭它,因为我有一个套接字插件,它会在玩家离开游戏后终止 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] 连接到 Socket 服务器。 |客户 ID:[0] | ClientIP: [92.241.153.29] [01:12:15] 远程客户端 [0] 已发送: Joan_Mackey [01:12:16] [LAUNCHER] 播放器套接字已断开| 客户 ID:[0] |玩家ID:[0]

【问题讨论】:

  • 计时器导致问题,我该从哪里开始计时器?
  • 当我这样写代码时,TCP 会自行停止,但是当我删除计时器时它会起作用:
  • 再次测试,每当我尝试检查某个进程是否在此计时器中运行时,它都会终止 TCP
  • 这缺少让我们能够判断问题所在的代码...您在哪些地方关闭了 TcpClient?你知道 TcpClient 是被普通代码关闭还是因为其他原因被显式终止?
  • 尝试使用断点单步执行您的代码。他们可能会帮助您了解正在发生的事情。

标签: vb.net tcp tcpclient


【解决方案1】:

您应该将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. 通过End Sub 后,TcpClient 将不再使用。

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

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

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

【讨论】:

  • @Nathaniel :现在你有一个更彻底的解释为什么它首先发生了:)。试着记住它,当你想保持一个变量“活着”时,你应该总是在类级别声明它除非它已经在其他地方引用。 -- 祝你的项目好运!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-17
  • 2018-07-02
  • 1970-01-01
  • 1970-01-01
  • 2013-09-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多