为什么我的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]
您应该将Dim client As New TcpClient()
初始化移动到类级别。课程级别意味着您将其置于任何方法之外(即,在任何Sub
或Function
之外)。
既然这样,你的TcpClient
被垃圾收集器收集你退出后,你把它放在任何方法,你过去后End Sub
的TcpClient
技术上不再使用,因为你不能再访问该特定实例。垃圾收集器在运行时检查它,并且随着变量不再使用,它将被收集。
当垃圾收集器收集一个对象时,它开始释放该对象的未使用资源。如果对象(或任何子对象)实现了界面,垃圾收集器将首先调用该对象的方法Dispose()
。
TcpClients
构建在System.Net.Sockets.Socket
类的顶部。 Socket
类实现IDisposable
,这意味着it has got a Dispose()
method。垃圾收集器将为您的TcpClient
的底层套接字调用此方法。当它被调用时,套接字将自动关闭,并告诉端点它已断开连接 - 而这正是您正在经历的。
所以总结:
的
TcpClient
不再使用您通过End Sub
后。当垃圾收集器运行时,它将开始释放
TcpClient
的资源,并在底层套接字上调用Dispose()
。底层套接字将告诉端点它已断开连接,然后它将终止连接。
现在您的服务器连接不再打开。
@Nathaniel:现在你有一个更彻底的解释,为什么它发生在第一个地方:)。尽量保持在你的脑海里,当你想保持一个变量“活着”时,你应该总是在课堂上声明它**除非**它已经在其他地方引用了。 - 祝你的项目顺利! –
计时器导致问题,我在哪里启动计时器? – Nathaniel
当我把我的代码这样,TCP停止自己,但是当我删除计时器它的工作原理: – Nathaniel
再次测试它,每当我尝试检查某个进程是否在此计时器中运行它将杀死TCP – Nathaniel