从列表框中检查代理

时间:2011-06-08 03:30:34

标签: vb.net multithreading proxy listbox

所以我有一个列表框,我在那里有一个代理列表。我有4个按钮。他们找到,加载,保存和检查

我有前3个完成并正在工作,但我没有找到任何有用的检查代理,我找到的唯一一个代理每个代理6秒,所以它花了很多时间来一个体面的大小列表。

那么我怎么能做到这一点,按下那个按钮,它会检查列表框中的所有代理,它会删除慢速代码和那些扁平代码无效的代理。这样做的速度很快(所以它可能是多线程的)

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

2 个答案:

答案 0 :(得分:2)

我的建议是:

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

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

3)当您的应用程序开始运行阵列中的所有BackGroudWorkers并在Timer的tick事件中检查是否有任何BackGroudWorker完成。如果已完成并且您在列表中有其他项目,则使用新Item运行它。直到所有列表项目已选中

答案 1 :(得分: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个方法一个请求代理字符串并尝试连接它。 e.g。

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

ProxyStatus为True / False,具体取决于代理是否有效