vb.net中的代理服务器应用程序 [英] proxy server application in vb.net
问题描述
Imports System '
Imports System.Net
Imports System.Net.Sockets
Imports System.Text
Imports System.IO
Imports System.Threading
Namespace WebProxy2
Class WebProxy2
Private clientSocket As Socket
Private read() As [Byte] = New Byte(1024) {}
Private Buffer As [Byte]() = Nothing
Private ASCII As Encoding = Encoding.ASCII
Private HTTP_VERSION As String = "HTTP/1.0"
Private CRLF As String = ControlChars.Cr + ControlChars.Lf
Private RecvBytes(4096) As [Byte]
Public Sub New(ByVal socket As Socket)
Me.clientSocket = socket
End Sub 'New
Public Sub run()
Dim clientmessage As [String] = " "
Dim sURL As [String] = " "
Dim bytes As Integer = readmessage(read, clientSocket, clientmessage)
If bytes = 0 Then
Return
End If
Dim index1 As Integer = clientmessage.IndexOf(" "c)
Dim index2 As Integer = clientmessage.IndexOf(" "c, index1 + 1)
If index1 = -1 Or index2 = -1 Then
Throw New IOException
End If
Console.WriteLine("Connecting to Site: {0}", clientmessage.Substring(index1 + 1, index2 - index1))
Console.WriteLine("Connection from {0}", clientSocket.RemoteEndPoint)
Dim part1 As String = clientmessage.Substring(index1 + 1, index2 - index1)
Dim index3 As Integer = part1.IndexOf("/"c, index1 + 8)
Dim index4 As Integer = part1.IndexOf(" "c, index1 + 8)
Dim index5 As Integer = index4 - index3
sURL = part1.Substring(index1 + 4, part1.Length - index5 - 8)
Try
Dim IPHost As IPHostEntry = Dns.Resolve(sURL)
Console.WriteLine("Request resolved: ", IPHost.HostName)
Dim aliases As String() = IPHost.Aliases
Dim address As IPAddress() = IPHost.AddressList
Console.WriteLine(address(0))
Dim sEndpoint As New IPEndPoint(address(0), 80)
Dim IPsocket As New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
IPsocket.Connect(sEndpoint)
If IPsocket.Connected Then
Console.WriteLine("Socket connect OK")
End If
Dim [GET] As String = clientmessage
Dim ByteGet As [Byte]() = ASCII.GetBytes([GET])
IPsocket.Send(ByteGet, ByteGet.Length, 0)
Dim rBytes As Int32 = IPsocket.Receive(RecvBytes, RecvBytes.Length, 0)
Console.WriteLine("Recieved {0}", +rBytes)
'Buffer = RecvBytes;
ByteGet = RecvBytes
Dim strRetPage As [String] = Nothing
'strRetPage = strRetPage + ASCII.GetString(RecvBytes, 0, rBytes)
While rBytes > 0
rBytes = IPsocket.Receive(RecvBytes, RecvBytes.Length, 0)
' strRetPage = strRetPage + ASCII.GetString(RecvBytes, 0, rBytes)
Dim i As Int32 = UBound(ByteGet)
ReDim Preserve ByteGet(UBound(ByteGet) + rBytes + 1)
For x As Long = 1 To rBytes
ByteGet(i + x) = RecvBytes(x - 1)
Next
End While
IPsocket.Shutdown(SocketShutdown.Both)
IPsocket.Close()
strRetPage = strRetPage + ASCII.GetString(ByteGet, 0, ByteGet.Length)
clientSocket.Send(ByteGet, ByteGet.Length, 0)
' sendmessage(clientSocket, strRetPage)
Catch exc2 As Exception
Console.WriteLine(exc2.ToString())
End Try
End Sub 'run
Private Function readmessage(ByVal ByteArray() As Byte, ByRef s As Socket, ByRef clientmessage As String) As Integer
Dim bytes As Integer = s.Receive(ByteArray, 1024, 0)
Dim messagefromclient As String = Encoding.ASCII.GetString(ByteArray)
clientmessage = CType(messagefromclient, [String])
Return bytes
End Function 'readmessage
Private Sub sendmessage(ByVal s As Socket, ByVal message As String)
Buffer = New [Byte](message.Length - 1) {}
Dim length As Integer = ASCII.GetBytes(message, 0, message.Length, Buffer, 0)
s.Send(Buffer, length, 0)
End Sub 'sendmessage
'Entry point which delegates to C-style main Private Function
Overloads Sub Main()
Main(System.Environment.GetCommandLineArgs())
End Sub
Overloads Shared Sub Main(ByVal args() As String)
Const port As Integer = 8889
Dim tcplistener As New TcpListener(port)
Console.WriteLine("Listening on port {0}", +port)
tcplistener.Start()
While True
Dim socket As Socket = tcplistener.AcceptSocket()
Dim webproxy As New WebProxy2(socket)
Dim thread As New Thread(New ThreadStart(AddressOf webproxy.run))
thread.Start()
End While
End Sub 'Main
End Class 'WebProxy2
End Namespace 'WebProxy2
如果我将firefox或IE配置为代理服务器我收到标题没问题。
示例标题
If i configure firefox or IE to the proxy server I do receive the header no problem.
Sample Header
www.google.com
GET http://google.ca/ HTTP/1.1 Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/x-gsarcade-launch, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/xaml+xml, application/vnd.ms-xpsdocument, application/x-ms-xbap, application/x-ms-application, application/x-silverlight, */* Accept-Language: en-us User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; InfoPath.2; .NET CLR 3.5.30729) Accept-Encoding: gzip, deflate Proxy-Connection: Keep-Alive Host: google.ca Cookie: PREF=ID=2cc48986d0a30551:U=4583f9a4276fb2df:FF=0:TM=1297940975:LM=1297941095:S=k0i-eurczYyMJF2q; NID=44=t7EdDRwCJHYI-iYWLo4NeRJ3DtFmv7wZ4yeUmEdemRP7X83I-kRJd6Ah3uf2rw-et_c_H5zYDd7vJuApaX0vs2K_jz30l7uQZPfmTdOeTvKpi67lXrbkiTP2DIOKeYew
我的问题是我怎么发这回浏览器并显示页面?
My question is how do I send this back to the browser and display the page?
推荐答案
好吧,当你连接它时,你正在创建一个新套接字,并在这里将新套接字传递给Webproxy2:
Well, you''re creating a new socket when you connect to it, and passing that new socket to Webproxy2 here:
Dim socket As Socket = tcplistener.AcceptSocket()
Dim webproxy As New WebProxy2(socket)
然后,在webProxy2中它被传递给私有对象clientSocket ... 对?因此,要将其发送回浏览器,您只需将其转换为字节数组并执行clientSocket.send(yourByteArray)。
...我看到了你已经这样做了(clientSocket.Send(ByteGet,ByteGet.Length,0))。如果你在浏览器中什么都没有,那么我想我会创建一个Web客户端并连接到谷歌,这样我就可以看到响应的差异。也许那时你就能看出为什么它没有在你的浏览器中显示。
希望这会有所帮助...
- Pete
Then, in webProxy2 it''s passed to the private object clientSocket... Right? So to send that back to the browser, you would just convert it to a byte array and do a clientSocket.send(yourByteArray).
...and I see you''re already doing that ( clientSocket.Send(ByteGet, ByteGet.Length, 0) ). If you''re getting nothing in the browser, then I guess I would create a web client and connect to google so I could see the difference in the response. Maybe then you''ll be able to see why it''s not displaying in your browser.
Hope this helps...
- Pete
这篇关于vb.net中的代理服务器应用程序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!