- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
粗糙的C#版HTTP代理
/ 2008-8-5 0:38:21
粗糙的C#版HTTP代理
说说这段代码的问题吧。首先是字符串切割的问题,要将客户端提交过来的GET,POST等原始请求切割,分离出主机名,端口,URL等数据。这里用正则匹配是最好的,遗憾的是我不擅长此道,所以使用了手动切割的办法,很笨重繁琐,但是毕竟它工作得很好。第二个问题是Keep-Alive的问题,这里我没有处理好。最开始我在http proxy里面修改客户端请求,强行将keep-alive修改为close,但是发现在某些站点的时候会出错。于是使用了类似select的方法读取数据,直到超时关闭两端的连接。我猜测,这里如果解析content-length会更好,但是略微繁琐了点,还是等我仔细阅读下RFC再看怎么修改吧。第三个是CONNECT方法的问题,这个到很简单,转发数据就行了,因此是这个代码中写得最好的一部分,用来登陆QQ还是不错的。 说实话,我不喜欢HTTP这种太宽松的协议,感觉灵活得让我难以把握。直接看代码吧,我加了很多debug信息,真的要用就去掉好了。调用这个类很简单,看main函数的实现就好了。为了方便贴代码,我写的时候就把三个类写到一个文件里面去了。顺便要说的是,虽然有类,但是没有任何面向对象的东西——这也再次证明,其实我算不上一个程序员,最多是个代码爱好者。 using System; using System.Net; using System.Net.Sockets; using System.Text; using System.IO; using System.Threading; using System.Collections; namespace HttpProxy { public class HttpProxy { int ProxyPort; /// summary /// 代理服务器入口类构造函数 /// /summary /// param name=PortHttp Proxy监听的端口/param public HttpProxy( int Port) { ProxyPort = Port; } /// summary /// 启动Http代理服务器 /// /summary public void Start( ) { TcpListener tcplistener = null; try { // 开始监听端口 tcplistener = new TcpListener(Dns.GetHostAddresses(Dns.GetHostName())[0], ProxyPort); tcplistener.Start(); Console.WriteLine(侦听端口号: + ProxyPort.ToString()); } catch (Exception e) { Console.WriteLine(启动代理服务器失败: + e.Message); } while (true) { try { // 接受客户端连接 Socket socket = tcplistener.AcceptSocket(); HttpSession Session = new HttpSession(socket); // 启动新线程,处理连接 Thread thread = new Thread(new ThreadStart(Session.Start)); thread.Start(); } catch( Exception e ) { Console.WriteLine(接受客户端连接异常: + e.Message ); } } } } public class HttpSession { // 客户端socket Socket ClientSocket; // 设定编码 Encoding ASCII = Encoding.ASCII; /// summary /// 构造函数 /// /summary /// param name=socket客户端socket/param public HttpSession(Socket socket) { this.ClientSocket = socket; } public void Start() { // 客户端缓冲区,读取客户端命令
原创力文档


文档评论(0)