HTTP 隧道 (HTTP代理Socket客户)

JAVA写HTTP代理服务器()-socket实现 HTTP代理服务器是一种特殊的网络服务,允许一个网络终端(一般为客户端)通过这个服务与另一个网络终端(一般为服务器)进行非直接的连接。一些网关、路由器等网络设备具备网络代理功能。一般认为代理服务有利于保障网络终端的隐私或安全,防止攻击。 HTTP 代理有分两种: RFC 7230 - HTTP/1.1: Message Syntax and Routing(即修订后的 RFC 2616,HTTP/1 阅读详情

HTTP 隧道 (HTTP代理Socket客户)

--------------------------------------------------------------------------------
这篇文章贡献自Akash kava,   翻译: bugfree/CSDN
环境: VC6


※HTTP 隧道※
--------
HTTP是基于文本的通过浏览器检索网页的协议。 大多数情况下你躲在代理服务器的后面,通过LAN接入互联网。 在IE的Connection Option中, 你给出你的LAN的设置。 这个代理服务器运行着基于文本的协议, 你从它那里可以得到外界的网络HTTP相关的数据。是的, 用HTTP通过它上面的小的望孔可以连接到外部世界, 并用二进制协议得到你想要的数据, 或者甚至是你的协议。 它通过HTTP。

※HTTPS 解释※
---------
在HTTPS中, 数据以一种安全的方式从浏览器到服务器和从服务器到浏览器。 它是二进制的协议; 当他穿过代理时, 代理不知道是什么。 代理仅仅允许二进制流打开, 让服务器和客户两者之间交换数据。 代理服务器认为我们在进行某个安全的会话。


对于HTTPS, 你的浏览器连接到代理服务器,并送出一个命令

CONNECT neurospeech.com:443 HTTP/1.0 <CR><LF>
HOST neurospeech.com:443<CR><LF>
   【...如果需要,HTTP头部的其它行以<CR><LF>结束 】
<CR><LF>    // 最后的空行


接下来, 代理服务器把它作为某个HTTP安全会话, 打开一个到需求服务器和端口的二进制流。 如果连接确立, 代理服务器返回如下回应:


HTTP/1.0 200 Connection Established<CR><LF>
         【...忽略所有HTTP头部的其它行以<CR><LF>结束,】
<CR><LF>    // 最后的空行

现在, 浏览器连接到了终端服务器, 可以用二进制和安全的方式交换数据了。


※怎样做这个※
-------------
现在是你的程序任务去愚弄代理服务器, 行为如IE一样进行 Secure HTTP。

1. Connect to Proxy Server first.
2. Issue CONNECT Host:Port HTTP/1.1<CR><LF>.
3. Issue <CR><LF>.
4. Wait for a line of response. If it contains HTTP/1.X 200 , the connection is successful.
5. Read further lines of response until you receive an empty line.
6. Now, you are connected to outside world through a proxy. Do any data exchange you want.


示例源代码

  // You need to connect to mail.yahoo.com on port 25
  // Through a proxy on 192.0.1.1, on HTTP Proxy 4480
  // CSocketClient is Socket wrapping class
  // When you apply operator << on CString, it writes CString
  // To Socket ending with CRLF
  // When you apply operator >> on CString, it receives
  // a Line of response from socket until CRLF


  try
  {
    CString Request,Response;
    CSocketClient Client;

    Client.ConnectTo("192.0.1.1",4480);

    // Issue CONNECT Command
    Request = "CONNECT mail.yahoo.com:25 HTTP/1.0";
    Client<<Request;

    // Issue empty line
    Request = "";
    Client<<Request;

    // Receive Response From Server
    Client>>Response;

    // Ignore HTTP Version

    int n = Response.Find(' ');
    Response = Response.Mid(n+1);

    // Http Response Must be 200 only
    if(Response.Left(3)!="200")
    {
      // Connection refused from HTTP Proxy Server
      AfxMessageBox(Response);
    }


    // Read Response Lines until you receive an empty line.
    do
    {
      Client>>Response;
      if (Response.IsEmpty())
        break;
    }while (true);


    // Coooooooool.... Now connected to mail.yahoo.com:25
    // Do further SMTP Protocol here..

  }
  catch (CSocketException * pE)
  {
    pE->ReportError();
  }

 

※库源码※
-------------
文件Dns.h包含所有所有DNS相关的源代码。 它利用了其它的库, 如SocketEx.h, SocketClient.h, 和 NeuroBuffer.h


※CSocketEx※
-------------

作为一个Socket功能的包裹(wapper)类。(如果你不是确切知道CSocket怎样工作的, 它是非常笨重和不可信的) 所有的函数根CSocket同名。 你可以直接应用这个类

※CSocketClient※
-----------------

派生自CSocketEx, 并且根据详细的Winsock错误抛出适当地例外(exceptions). 为了方便的发送和接收,它定义了两个操作符, >> 和 <<; 如果需要它也交换网络序为主机序和主机序为网络序。


※CHttpProxySocketClient※
-----------------

派生自CSocketClient, 你可以调用SetProxySettings(ProxyServer, Port) 方法和做代理设置。 接下来, 你可以连接到你想要的主机和端口。ConnnectTo 方法被覆盖, 它自动的实现了HTTP代理协议并无争论的给你了一个连接。

 

※怎样利用CHttpProxySocketClient※
---------------------------------
  // e.g. You need to connect to mail.yahoo.com on port 25
  // Through a proxy on 192.0.1.1, on HTTP Proxy 4480
  // CSocketClient is Socket wrapping class
  // When you apply operator << on CString, it writes CString
  // To Socket ending with CRLF
  // When you apply operator >> on CString, it receives
  // Line of response from socket until CRLF
  try
  {
    CHttpProxySocketClient Client;

    Client.SetProxySettings("192.0.1.1",1979);

    // Connect to server mail.yahoo.com on port 25
    Client.ConnectTo("mail.yahoo.com",25);

    // You now have access to mail.yahoo.com on port 25
    // If you do not call SetProxySettings, then
    // you are connected to mail.yahoo.com directly if
    // you have direct access, so always use
    // CHttpProxySocketClient and no need to do any
    // extra coding.

  }
  catch(CSocketException * pE) {
    pE->ReportError();
  }


【bugfree译注】
    作者在它的文章中, 说了为什么不用.h .cpp风格编程的理由, 这个我也给出我的理由, 因为
    他的风格不可取, 大家有机会可以读读它的源代码, 有两个缺点,
    (一)整体感觉乱,不清爽, 对常常的一个类很难一下子从整体上把握。 
    (二)随着代码的增加, 编译时间过长也显现出来, 可能大家都知道.h .cpp的好处之一就是
         .cpp的代码之编译一次, 假如你没有改动该.cpp文件的内容, 此文件就不会重编译。
         还有, 这样你的类接口非常清楚, 只需在模块间共享类的.h文件即可。

隧道穿透:端口转发、socket隧道代理 隧道穿透是一种网络技术,通过端口转发和Socket隧道代理实现安全的网络连接,方便不同网络节点之间的数据传输和通信。端口转发是将网络数据包从一个端口转发到另一个端口的技术,用于将外部网络请求转发到内部网络。Socket隧道代理利用Socket连接建立隧道,在客户端和服务器端之间传输数据,提高数据传输的安全性和效率。这些方法可以确保数据传输的安全和顺畅,适用于需要跨越不同网络环境进行通信的场景。 阅读详情

相关推荐

SOCKETHTTP

HTTP的文档,里面包含的源代码

Http协议对接Socket服务(TCP协议)

在我们的web开发中,会是用到web服务器,比如:tomcat、apache等。 其实它们就是功能做的很强大的socket服务。 我们使用的数据库程序,包括一些和网络相关的软件都和我们的socket是有关系的。 这中间产生的交互,很可能是通过某种协议来完成的。 只不过有些协议好理解(http协议),有些软件专有的协议可能不太好理解。当我们在浏览器地址栏输入对应的IP地址,其实也就是浏览器创建了一个...

TangHao_0226的博客 2081

http代理服务器socket

这是一款http代理服务器,是用java实现的socket编程,实现代理,过滤的功能

HTTP代理协议 HTTP/1.1的CONNECT方法

我们平时使用HTTP协议无非就是GET、POST这些方法,但是HTTP的内容远不止那些。今天就来说说HTTP代理使用的CONNECT。这个不是在网页开发上用的,如果没兴趣就跳过吧。  APACHE只是作为网页的服务器被使用的,不会支持这个方法。如果要使用它必须在服务器上安装相应的软件。这样的软件很多,百度一下HTTP代理服务器就可以找到一大把。  CONNECT这个方法的作用就是把服务器作为跳板,...

maozhuxigood 1542

HTTP 代理原理及实现(一)

Web 代理是一种存在于网络中间的实体,提供各式各样的功能。现代网络系统中,Web 代理无处不在。我之前有关 HTTP 的博文中,多次提到了代理HTTP 请求及响应的影响。今天这篇文章,我打算谈谈 HTTP 代理本身的一些原理,以及如何用 Node.js 快速实现代理

yokasou的博客 4389

Http的连接到WebSocket

1、HTTP协议对长连接的支持以及各浏览器的支持情况 http://blog.csdn.net/fenglibing/article/details/7100222 2、WEB客户端与服务端信息交互的几种方式 1)、Flash XMLSocket 入门示例:http://en.wikipedia.org/wiki/XMLSocket 不足: a)、客户端必须安装 Flash 播

冯立彬的博客 5万+

HTTP 隧道 (HTTP代理Socket客户()

HTTP 隧道 (HTTP代理Socket客户()[@more@]HTTP 隧道 (HTTP代理Socket客户)这篇文章贡献自Akash kava, 翻译: bugfree/CSDN 环境: VC6※HTTP 隧道HTTP是基于文本的通过浏览器检索网页的协议。 大多数情况下你躲在代理服务器的后面,通过LAN接入互联网。 在IE的Connection Option中, 你给出你的LAN的

WHACKW的专栏 2145

linux使用hTTP隧道代理代码模版

在上面的代码中,我们创建了一个代理服务器socket对象,并将其绑定到指定的IP地址和端口号上。然后,我们使用`accept()`方法接受客户端的连接请求,并创建与目标服务器的连接。接着,我们从客户端接收请求数据并转发给目标服务器,然后从目标服务器接收响应数据并转发给客户端。最后,我们关闭连接并等待下一个客户端连接请求。请注意,上面的代码只是一个简单的HTTP隧道代理模板,还需要根据实际情况进行修改和完善。print('已连接目标服务器:', target_host)# 创建与目标服务器的连接。

weixin_73725158的博客 236

HTTPHTTP通信

1. HTTP 翻译为 超文本传输协议,还是超文本转移协议 ,图灵社区有讨论,https://www.ituring.com.cn/article/1817感觉大家都是觉得之前的不妥,应该翻译为 超文本转移协议。 个人的理解: 2. REST 的API 格式,看一看 《RESTful Web Services》 了解一下 3. HTTPSocket的区别,个人感觉是...

jy0921 633

HTTP Tunneling (HTTP Proxy Socket Client)

HTTP Tunneling (HTTP Proxy Socket Client)  HTTP TunnelingHTTP is a text-based protocol to retreive Web pages through a Web browser. Mostly if you are on a LAN connection, you are behind a proxy server...

weixin_34242331的博客 155

HHDESK资源管理功能

为使客户体验更上一层楼,我们在最新的HHDESK版本中,新增了一个功能“资源管理”,其中不仅整合了原有的连接管理、网络代理功能,还增加了不少实用的新功能。本篇便为您简单介绍一下。

m0_61228937的博客 202

使用Retrofit的方式请求Socket,且Socket可以和Http无缝切换

前言 一般来说前端的app和服务器通讯都是用的Http,Http使用方便,请求流程好控制,但有时候app需要实时接收服务端的推送或保持长连接,这时就需要使用Socket了 java提供的Socket接口还是比较难用的,而网上有一个开源库OkScoket封装的还是挺好用的,Github地址:https://github.com/xuuhaoo/OkSocket 但即使如此,其没有一对一回调或同步请求方法,只能通过一个或几个统一的回调方法,就造成了使用比较麻烦且容易出错 而Retrofit使用比较好用,

lt的博客 2828

httpsocket5

app.yinxiang.com/fx/be69c4e3…

fanfan家园 926

HTTP请求方法详解

Web开发最常见的就是HTTP(超文本传输协议)通信协议,该协议(HTTP)设计的目的是确保服务器客户端之间的正确通信,  HTTP请求方法并不是只有GET和POST,只是最常用的。据RFC2616标准(现行的HTTP/1.1)得知,通常有以下8种方法:OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE和CONNECT。这8种我们一起来分析一下,其中最常用的也就是

浪漫鼠 1万+
上一篇: 字符串: 怎样在ANSI 和 UNICODE间做转换
下一篇: 透析ICMP协议(一): 协议原理
bugfree
博客等级 码龄24年 1粉丝 19原创
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值