在VB.NET中优化TCP / IP套接字实现

时间:2015-03-25 14:40:52

标签: vb.net sockets server tcp-ip

当连接两台联网的计算机时,我有一个约40毫秒的延迟,我试图找到原因。我怀疑服务器应用程序是原因。我已经使用其他软件(即Hercules)检查了滞后与我的软件有关,我考虑过传输位而不是字符串。拥塞可能不是原因,但可能是缓冲区和数据包大小 - 考虑到我在一些早期RFC文档中读到的内容。我认为延迟是由于服务器而不是客户端,虽然这只是我的猜测。我用ActionScript编写了客户端。

我问这个问题是关于关键字TCP / IP的Google搜索和优化会返回TCP / IP配置上的结果而不是实现。我是TCP / IP编程的新手,所以我希望这个错误很容易被一个更高级的程序员发现。

服务器应用程序在VB.NET中编程:

Public Class Form1

Public Shared remoteAddress As IPAddress = IPAddress.Any
Public Shared port As Int32 = 8080

Public Shared server As New TcpListener(remoteAddress, port)
Public client As TcpClient = Nothing

'....


While (True)
        Try

            Dim buffer(65536) As Byte

            Dim stuff As Integer = client.ReceiveBufferSize
            Console.WriteLine(stuff)

            networkStream.Read(buffer, 0, CInt(client.ReceiveBufferSize))

            Dim dataFromClient As String = System.Text.Encoding.ASCII.GetString(buffer)

            dataFromClient = dataFromClient.Substring(dataFromClient.IndexOf("/") + 1, dataFromClient.IndexOf("\") - 1)


            If dataFromClient Like "/END\" Or dataFromClient Like "/STOP\" Then
                Console.WriteLine("STOP REQUESTED")

                Exit While
            End If

            SetMarker(dataFromClient)

            Console.WriteLine(dataFromClient)

            Dim serverResponse As String = "Receiving marker #" + Convert.ToString(requestCount) + ":  " + dataFromClient
            Dim sendBytes As [Byte]() = System.Text.Encoding.ASCII.GetBytes(serverResponse)
            networkStream.Write(sendBytes, 0, sendBytes.Length)
            networkStream.Flush()
            Console.WriteLine(serverResponse)

        Catch illegalSyntax As System.ArgumentException
            Console.WriteLine("ERROR: Use correct syntax: /command\ Example: /S1\, /STOP\")
        Catch socketEx As SocketException
            Console.WriteLine(SocketError.Interrupted)

        Catch ex As Exception
            MsgBox(ex.ToString)
        End Try

        requestCount = requestCount + 1
    End While

1 个答案:

答案 0 :(得分:1)

一些想法: 从最小的可能程序开始,并测量性能。慢慢添加功能,当性能达到不可接受的水平时,您将知道程序的哪个部分花费的时间最多。

为此,您尝试添加一些基本的分析代码,以查看花费最多时间的位置,并意识到额外的代码需要额外的时间来处理。

为了做到这一点,也许使用Environment.TickCount来衡量时间。我认为还有其他一些高性能定时器。

那就是说,我开始在几个地方寻找:

- 您正在紧密循环的顶部分配一个数组。为什么不在循环外声明数组,然后清除它,或者更有效,跟踪正在使用的数组项,并相应地调整代码。

- 通过将字符串变量重新分配给自身,您将导致分配一个全新的字符串。而不是重新分配子字符串,也许做一个String.contains来检查你的条件

-Like是模式匹配关键字。尝试使用相等来测试您的情况。模式匹配比测试平等更昂贵。

- 你正在调用一个名为SetMarker的函数,我们没有定义。这个功能在做什么?写入数据库或文件?还有什么?也许这个功能很慢。