Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 同步Tcp连接性能问题_Vb.net - Fatal编程技术网

Vb.net 同步Tcp连接性能问题

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 =

我一直在尝试构建一个TCP服务器和客户端,并每500毫秒传输一个100.000字节的数组(100 KB的图像大约是100.000字节的数组),但每当我启动程序时,它会在内存(工作集)列上快速扩展到500.000 KB,这意味着它使用了大量内存

我的问题是,哪些是我的程序缺陷导致了这种内存问题,如果我的程序很好,那么异步TCP在这种情况下的性能更好吗?我重复一下,每300毫秒只有一个客户端向服务器发送一个100.000字节的数组

服务器代码:

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
欢迎使用堆栈溢出。谢谢你花时间回答这个问题。根据经验,不只是描述您提议的更改,而是在答案中实际包含代码和您提议的更改,这通常是一个好主意。