我为我的游戏服务器开发了一个应用程序。现在,在这个应用程序中按下" 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]
答案 0 :(得分:0)
您应该将Dim client As New TcpClient()
初始化移至类级别。类级别意味着您将其置于任何方法之外(即,在任何Sub
或Function
之外)。
按照目前的情况,垃圾收集器会在您退出放入的任何方法后收集TcpClient
。在您通过End Sub
后,TcpClient
在技术上是否定的使用时间更长,因为您无法再访问该特定实例。垃圾收集器在运行时会检查它,并且当您的变量不再使用时,它将被收集。
当垃圾收集器收集对象时,它开始释放对象的未使用资源。如果对象(或任何子对象)实现IDisposable
接口,则垃圾收集器将首先调用该对象的Dispose()
方法。
TcpClients
构建于System.Net.Sockets.Socket
类之上。 Socket
类实现IDisposable
,这意味着it has got a Dispose()
method。垃圾收集器将为TcpClient
的底层套接字调用此方法。当它被调用时,套接字将自动关闭并告诉端点它正在断开连接 - 这就是你遇到的情况。
总结一下:
传递TcpClient
后,End Sub
不再使用。
当垃圾收集器运行时,它将开始释放TcpClient
的资源,并在底层套接字上调用Dispose()
。
底层套接字将告诉端点它正在断开连接,然后它将终止连接。
现在您与服务器的连接已不再打开。