Vb.net 同步Tcp连接性能问题
我一直在尝试构建一个TCP服务器和客户端,并每500毫秒传输一个100.000字节的数组(100 KB的图像大约是100.000字节的数组),但每当我启动程序时,它会在内存(工作集)列上快速扩展到500.000 KB,这意味着它使用了大量内存 我的问题是,哪些是我的程序缺陷导致了这种内存问题,如果我的程序很好,那么异步TCP在这种情况下的性能更好吗?我重复一下,每300毫秒只有一个客户端向服务器发送一个100.000字节的数组 服务器代码:Vb.net 同步Tcp连接性能问题,vb.net,Vb.net,我一直在尝试构建一个TCP服务器和客户端,并每500毫秒传输一个100.000字节的数组(100 KB的图像大约是100.000字节的数组),但每当我启动程序时,它会在内存(工作集)列上快速扩展到500.000 KB,这意味着它使用了大量内存 我的问题是,哪些是我的程序缺陷导致了这种内存问题,如果我的程序很好,那么异步TCP在这种情况下的性能更好吗?我重复一下,每300毫秒只有一个客户端向服务器发送一个100.000字节的数组 服务器代码: Dim server As TcpListener =
Dim server As TcpListener = New TcpListener(IPAddress.Parse("192.168.1.2"), 15000)
Dim serverclient As TcpClient
Dim stream As NetworkStream = Nothing
Dim thread1 As Threading.Thread
Dim thread2 As Threading.Thread
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Control.CheckForIllegalCrossThreadCalls = False
server.Start()
Form2.Show()
thread1 = New Threading.Thread(AddressOf ListenClient)
thread1.Start()
End Sub
Sub ListenClient()
serverclient = server.AcceptTcpClient()
thread2 = New Threading.Thread(Sub() Me.listenData(stream))
thread2.Start()
Exit Sub
End Sub
Sub listenData(ByVal st As NetworkStream)
Sleep(200)
st = serverclient.GetStream()
Dim array(1100) As Byte
Dim i As Integer = st.Read(array, 0, array.Length)
listenData(st)
End Sub
客户端代码:
Dim client As TcpClient = New TcpClient
Dim array(1000) As Byte
Dim thread As New Threading.Thread(Sub() Me.send(stream, array))
Dim stream As NetworkStream
Sub send(ByVal st As NetworkStream, arr As Byte())
Sleep(300)
st = client.GetStream()
st.Write(arr, 0, arr.Length)
st.Flush()
send(st, arr)
End Sub
Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
client.Connect("192.168.1.2", 15000)
For i = 0 To array.Length - 10
array(i) = 200
Next
thread.Start()
End Sub
您需要将缓冲区数组移动到listenData的外部,为每个客户机创建一个缓冲区,如果有客户机,则为他创建一个缓冲区并始终使用它
Dim array(1100) As Byte
Sub listenData(ByVal st As NetworkStream)
Sleep(200)
st = serverclient.GetStream()
Dim i As Integer = st.Read(array, 0, array.Length)
listenData(st)
End Sub
为什么Listenda会递归地调用自己?这将导致大问题。是的,这将为每个递归创建一个1100字节的数组,这将很快耗尽内存。这是一个典型的内存泄漏,似乎毫无意义。它是必需的吗?我怎样才能修好它?有计时器吗?我经常使用套接字,但在.NET中没有。通常,服务器会阻塞,直到客户端有可用数据,然后读取,直到不再有可用数据。如果您仍然无法使其工作,我将稍后尝试设置测试jig。您应该重新考虑这一行
Control.CheckForIllegalCrossThreadCalls=False
欢迎使用堆栈溢出。谢谢你花时间回答这个问题。根据经验,不只是描述您提议的更改,而是在答案中实际包含代码和您提议的更改,这通常是一个好主意。