tbwshc

          客戶端通過 HTTP 代理與 Telnet 服務(wù)器通信

          最近遇到一個(gè)業(yè)務(wù)需求:客戶端自動(dòng)登錄遠(yuǎn)程Telnet服務(wù)器,然后自動(dòng)發(fā)出一系列指令,返回指令執(zhí)行結(jié)果。

          這里,我采用 TcpClient 來與遠(yuǎn)程服務(wù)器Telnet服務(wù)通信(默認(rèn)端口:23)。這方面,網(wǎng)絡(luò)上有不少的代碼與文章。

          完成之后,因需求變更,遇到了一個(gè)新的問題,就是客戶機(jī)器需要通過 HTTP 代理來連接公網(wǎng)的 Telnetb 服務(wù)器。在這種情況,TcpClien 連接需要經(jīng)過 HTTP 代理來與服務(wù)器通信。這方面代碼幾番求助度娘、谷歌無果。沒辦法,自己分析 HTTP 代理。

           

          代理過程:

          (1)客戶機(jī)連接代理服務(wù)器;

          (2)代理服務(wù)器請(qǐng)求連接Telnet服務(wù)器,Telnet服務(wù)器返回響應(yīng);

          (3)代理服務(wù)器將Telnet返回響應(yīng)傳給客戶端。

           

          HTTP/1.0協(xié)議支持的請(qǐng)求方法有:GET、POST、PUT、DELETE、CONNECT等。同樣HTTP代理服務(wù)器也這些請(qǐng)求方法。如:使用 GET/POST 方法代理訪問網(wǎng)頁等。

          現(xiàn)在,要用的是 CONNECT 請(qǐng)求方法,去連接 Telnet 服務(wù)器。如下:

          CONNECT xxx.xxx.xxx.xxx:23 HTTP/1.0

          User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US)

          xxx.xxx.xxx.xxx:23,為Telnet服務(wù)IP與端口。

           

          接下來,就是利用HTTP代理,創(chuàng)建一個(gè)連接到Telnet服務(wù)器的 TcpCient 實(shí)例對(duì)象。

           

           


          public TcpClient CreateTcpClient(string proxyHost, int proxyPort, string telnetHost, int telnetPort)
                  {
                      IPHostEntry entry = Dns.GetHostEntry(proxyHost);
                      IPEndPoint ipEndPoint = new IPEndPoint(entry.AddressList[0], proxyPort);

                      TcpClient tcpClient = new TcpClient(AddressFamily.InterNetwork);
                      tcpClient.Connect(ipEndPoint); // 連接代理服務(wù)器.

                      // CONNECT Telnet 服務(wù)器
                      string connectCommand = string.Format("CONNECT {0}:{1} HTTP/1.0\nUser-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US)\n\n", telnetHost, telnetPort);
                      byte[] buffer = Encoding.ASCII.GetBytes(connectCommand);
                      tcpClient.GetStream().Write(buffer, 0, buffer.Length);

                      buffer = new byte[512];
                      int received = tcpClient.GetStream().Read(buffer, 0, 512);
                      string receivedText = Encoding.ASCII.GetString(buffer, 0, received);
                      // 成功.
                      if (receivedText.IndexOf("200") > -1)
                          return tcpClient;
                      return null;
                  }
           

           這樣的 TcpClient 通過代理與 Telnet 服務(wù)通信成功。

           

          posted on 2012-07-06 15:42 chen11-1 閱讀(1289) 評(píng)論(1)  編輯  收藏

          Feedback

          # re: 客戶端通過 HTTP 代理與 Telnet 服務(wù)器通信 2012-07-07 09:41 Q345B方管

          這個(gè)通信方式還是可以好好研究下的  回復(fù)  更多評(píng)論   


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 天峨县| 嘉祥县| 板桥市| 黄龙县| 台南县| 大邑县| 科尔| 旌德县| 陆川县| 榆林市| 庐江县| 冕宁县| 蒲城县| 泾源县| 乳源| 定西市| 大厂| 潼南县| 南部县| 庆元县| 永吉县| 新疆| 班玛县| 通江县| 灌南县| 合作市| 余姚市| 哈巴河县| 和龙市| 屏边| 团风县| 延吉市| 达州市| 彰化县| 齐齐哈尔市| 吉木萨尔县| 敦化市| 长宁区| 商水县| 田东县| 南充市|