【问题标题】:Check proxy's from listbox从列表框中检查代理
【发布时间】:2011-06-08 03:30:34
【问题描述】:

所以我有一个用于代理列表的列表框。我有 4 个与之相关的按钮。它们是查找、加载、保存和检查

我已经完成了前 3 个并正在工作,但我没有发现任何与检查代理有关的有用信息,我发现的唯一一个每个代理大约需要 6 秒,因此需要很长时间才能获得一个体面的列表。

那么我怎么能在按下那个按钮的时候做到这一点,它会检​​查列表框中的所有代理,并删除慢的代理和那些完全不起作用的代理。并以不错的速度执行此操作(因此它可能是多线程的)

由于我无法弄清楚这一点,我没有与此相关的代码,除了按钮单击的子代码,我觉得没有必要发布代码

【问题讨论】:

    标签: vb.net multithreading proxy listbox


    【解决方案1】:

    我给你的建议是:

    1) 使用计时器控件并将其 Tick 属性设置为适当的值,例如 500;

    2) 创建一个 BackGroudWorkers 数组,例如 BackGroudWorker[20];

    3)当您的应用程序开始运行数组中的所有 BackGroudWorkers 并在 Timer 的滴答事件中检查此 BackGroudWorker 中的任何一个是否已完成。如果已完成并且您在列表中有其他项目,则使用新项目运行它。执行此操作直到所有列出检查的项目

    【讨论】:

    • 什么?我仍然需要知道如何实际检查它们,这似乎是我的问题
    • BackGroudWorker 有一个名为 IsBusy 的属性。你可以使用它
    • 对不起,我想你可能弄错了我在问什么,我不是在问具体如何多线程,我问的是我如何检查代理
    【解决方案2】:
    Public Shared Function CheckProxy(ByVal Proxy As String) As Boolean
        Dim prx As Uri = Nothing
        If Uri.TryCreate(Proxy, UriKind.Absolute, prx) Then
            Return CheckProxy(prx)
        ElseIf Uri.TryCreate("http://" & Proxy, UriKind.Absolute, prx) Then
            Return CheckProxy(prx)
        Else
            Return False
        End If
    End Function
    
    Public Shared Function CheckProxy(ByVal Proxy As Uri) As Boolean
        Dim iProxy As Socket = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
        iProxy.ReceiveTimeout = 500 : iProxy.SendTimeout = 500
        Try
            '' Connect using a timeout (1/2 second)
            Dim result As IAsyncResult = iProxy.BeginConnect(Proxy.Host, Proxy.Port, Nothing, Nothing)
            Dim success As Boolean = result.AsyncWaitHandle.WaitOne(500, True)
            If (Not success) Then
                iProxy.Close() : Return False
            End If
        Catch ex As Exception
            Return False
        End Try
    
        Dim bytData() As Byte, strData As String
        Dim iDataLen As Integer = 1024
        strData = String.Format("CONNECT {0}:{1} HTTP/1.0{2}{2}", "www.google.com", 80, vbNewLine)
    
        bytData = System.Text.ASCIIEncoding.ASCII.GetBytes(strData)
        If iProxy.Connected Then
            iProxy.Send(bytData, bytData.Length, SocketFlags.None)
            ReDim bytData(1024)
            Do
                Try
                    iDataLen = iProxy.Receive(bytData, bytData.Length, SocketFlags.None)
                Catch ex As Exception
                    iProxy.Close() : Return False
                End Try
                If iDataLen > 0 Then
                    strData = System.Text.ASCIIEncoding.ASCII.GetString(bytData)
                    Exit Do
                End If
            Loop
        Else
            Return False
        End If
        iProxy.Close()
    
        Dim strAttribs() As String
        strAttribs = strData.Split(" "c)
        If strAttribs(1).Equals("200") Then
            Return True
        Else
            Return False
        End If
    End Function
    

    您应该管理线程等代码,正如@Nima 为您的代理检查问题所建议的那样,我这里有 2 种方法,一个询问代理字符串并尝试连接它。 例如

    ProxyStatus = CheckProxy("http://192.168.1.1:8080/")
    

    ProxyStatus 是 True/False 取决于代理是否有效

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-01
      相关资源
      最近更新 更多