1. 程式人生 > >Socket程式設計--自己動手的HTTP代理伺服器

Socket程式設計--自己動手的HTTP代理伺服器

瀏覽器使用代理:Firefox瀏覽器:

選項->高階->連線->設定,選擇手動配置代理。
瀏覽器使用代理

實現http代理:

1.等待來自一個客戶端的連線;
2.啟動一個新執行緒來處理連線;
InputStream cis = null,sis=null;
OutputStream cos = null,sos=null;
try{
csocket.setSoTimeout(TIMEOUT);
cis=csocket.getInputStream();
cos=csocket.getOutputStream();
}
上面的程式碼定義了代理伺服器與目標伺服器間套接字並初試化,其中cis為客戶端輸入流,sis為目標主機輸入流,socket為套接字。同時設定了超時控制,如果某個Socket不可用,另一個仍舊有機會進行處理,不必建立一個新的執行緒。
我的類直接從Thread類繼承了下來.並且通過建構函式傳遞引用和客戶Socket建立了聯絡.這樣每個執行緒就有了一個通訊管道(pipe)。同樣重寫run方法,把代理工作交給執行緒來完成。這樣多客戶並行的Socket就建立起來了
3.讀瀏覽器請求的第一行(包含終點url的行);
4.解析請求第一行中終點Http伺服器名及其埠號;
URL=getRequestURL(buffer);
int n;
n=URL.indexOf(“//”);
if (n!=-1)
host=URL.substring(n+2); // www.baidu.com/
n=host.indexOf(‘/’);
if (n!=-1)
host=host.substring(0,n);// www.baidu.com
// 分析可能存在的埠號
n=host.indexOf(‘:’);
if (n!=-1) {
port=Integer.parseInt(host.substring(n+1));
host=host.substring(0,n);
}
5.開啟一個到終點Http伺服器的套接字;
while (retry–!=0) {
try {
//與目標伺服器建立連線
ssocket=new Socket(host,port); //嘗試建立與目標主機的連線
break;
} catch (Exception e) { }
Thread.sleep(CONNECT_PAUSE);//執行緒等待幾毫秒
}
6.通過該套接字傳送/Http請求;
if(ssocket!=null){
ssocket.setSoTimeout(TIMEOUT);//設定套接字超時時間
sis=ssocket.getInputStream();
sos=ssocket.getOutputStream();//從sscoket中得到輸出流
sos.write(buffer.getBytes()); //將請求頭寫入,向目標伺服器輸出http命令
7.傳送從終點Http伺服器(通過套接字)返回給瀏覽器請求的資料;
pipe(cis,sis,sos,cos); 這個方法用來實現套接字之間的資料交換。
8.關閉套接字,等待下一次連線。
由於關閉套接字時會拋異常,所以我用try,catch來包圍程式碼塊。

Socket 程式設計的客戶端和伺服器端主要步驟

1.編寫伺服器端,例項化ServerSocket物件,這裡要定義ip和埠,例項化Socket,從ServerSocket物件中accept() 獲取,這裡要涉及到流,輸入輸出流在Socket中獲取。
2.編寫客戶端,例項化Socket物件,ip,埠,流,在Socket中獲取:
1.建立伺服器端SocketServer,並定義SocketServer的監聽埠;
2、ServerSocket呼叫accept( )方法,是指處於阻塞;
3、建立客戶端的Socket,並設定伺服器的IP和埠;
4、客戶端傳送連線請求,建立連線;
5、分別取得伺服器和客戶端Socket的InputStream和OutputStream;
6、利用Socket和ServerSocket進行資料傳輸

HTTP 代理伺服器的基本原理:

HTTP 客戶端向代理髮送請求報文,代理伺服器需要正確地處理請求和連線(例如正確處理 Connection: keep-alive),同時向伺服器傳送請求,並將收到的響應轉發給客戶端。

HTTP 代理伺服器的程式流程圖

HTTP 代理伺服器的程式流程圖

實現 HTTP 代理伺服器的關鍵技術及解決方案:

理解Socket程式設計技術,分析HTTP代理應用程式設計原理和程式流程,選擇合適的開發環境,參考已有的HTTP程式功能,設計實現HTTP代理功能的應用程式。
解決方案:Java實現socket程式設計並實現多執行緒。

相關推薦

Socket程式設計--自己動手HTTP代理伺服器

瀏覽器使用代理:Firefox瀏覽器: 選項->高階->連線->設定,選擇手動配置代理。 實現http代理: 1.等待來自一個客戶端的連線; 2.啟動一個新執行緒來處理連線; InputStream cis = null,sis=

JAVA寫HTTP代理伺服器(一)-socket實現

HTTP代理伺服器是一種特殊的網路服務,允許一個網路終端(一般為客戶端)通過這個服務與另一個網路終端(一般為伺服器)進行非直接的連線。一些閘道器、路由器等網路裝置具備網路代理功能。一般認為代理服務有利於保障網路終端的隱私或安全,防止攻擊。 HTTP

Jmeter學習—004—使用代理錄製指令碼—HTTP代理伺服器(APP、web皆可)

版權宣告:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/mmmmmmm_2niu/article/details/78136253記得我最開始使用jmeter測試介面或頁面時,寫指令碼最常用的幾種途徑有: 1、開發提供介面引數; 2、使用badboy錄製指令碼(大

Jmeter入門—使用 HTTP代理伺服器抓取介面

今天說一下怎麼使用jmeter的HTTP代理伺服器來抓取介面。 首先,開啟jmeter,進入主頁面,然後在對工作臺(Jmeter版本4.0以下)點選右鍵->新增->非測試元件->HTTP代理伺服器/TestPlan(Jmeter版本4.0)右鍵->新增->非測試元件-

Jmeter使用—使用 HTTP代理伺服器抓取介面

這裡說一下怎麼使用jmeter的HTTP代理伺服器來抓取介面。 首先,開啟jmeter,進入主頁面,然後在對工作臺(Jmeter版本4.0以下)點選右鍵->新增->非測試元件->HTTP代理伺服器/TestPlan(Jmeter版本4.0)右鍵->新增->非測試元件-

Netty實現簡單HTTP代理伺服器

自上次使用Openresty+Lua+Nginx的來加速自己的網站,用上了比較時髦的技術,感覺算是讓自己的網站響應速度達到極限了,直到看到了Netty,公司就是打算用Netty來替代Openresty這一套,所以,自己也學了好久,琢磨了好一趟才知道怎麼用,現在用來寫一套HTTP代理伺服器吧,之後再測試一下效能

CentOS 安裝HTTP代理伺服器Tinyproxy

Tinyproxy是一個小型的基於GPL的HTTP/SSL代理程式,非常適合小型網路而且便於快速部署。這個代理程式最大的優點就是佔用系統資源比較少。這裡使用的系統為CentOS5.6,可以直接yum方式安裝。 安裝Tinyproxy yum install tinyprox

5.13.1.2 jmeter元件-非測試元件—HTTP代理伺服器的使用

.HTTP代理伺服器錄製方法 1.新增執行緒組。開啟JMeter,左邊樹上有一個空的測試計劃,新增使用者定義變數等(以便變數替換)。點選該計劃的右鍵選單新增->執行緒組新增一個執行緒組。 2.新增Http代理伺服器。點選計劃的右鍵選單新增->非測試

5.13.1.3 jmeter元件-非測試元件—HTTP代理伺服器--HTTPS證書及其安裝

關於HTTPS證書 HTTP協議採用明文傳輸資料,如果是敏感資料,就不安全了,HTTPs(安全套接字層超文字傳輸協議)採用密文傳輸資料,在通訊中需要獲得伺服器的證書(公鑰) HTTPS連線使用證書來驗證瀏覽器和Web伺服器之間的連線。當通過HTTPS連線時,伺服

用阿里雲搭建Http代理伺服器

先說下我的執行環境: Ubuntu16.04+python3.5,用的是阿里雲ECS乞丐版。 搭建步驟: 0. 直接用xshell或putty遠端到雲伺服器 1. pip3 install

自己動手寫RTP伺服器——用RTP協議傳輸TS流

refs: http://www.cnblogs.com/lidabo/p/4160145.html 預備知識 關於TS流的格式:TS流封裝的具體格式請參考文件ISO/IEC 13818-1。這裡我們只需要瞭解一些簡單的資訊就好。首先TS流是有許多的TS Packet組成

C-socket程式設計-多程序版併發伺服器

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <sys/socket.h

Docker設定HTTP代理 為docker配置HTTP代理伺服器

參考資料:為docker配置HTTP代理伺服器 一、註釋掉namesserver的配置 [[email protected] ~]# cat /etc/resolv.conf # Generated by NetworkManager search apa.gad.schneider-el

JAVA網路程式設計 ——基於TCP的Socket程式設計(1)——實現伺服器端與客戶端的實時對話

第一篇文章,我先介紹以及記錄一下我所學的知識點。(總結了一下視訊老師講的東西)一,HTTP與Socket1.HTTP:超文字傳輸協議特點:客戶端傳送的請求需要伺服器端每次來響應,在請求結束之後主動釋放連線,從建立連線到關閉連線稱為“一次連線”,所以HTTP是“短連線”。2.S

HTTP代理伺服器的工作原理

在HTTP通訊鏈上,客戶端和目標伺服器之間通常存在某些中轉代理伺服器,它們提供對目標資源的中轉訪問。一個HTTP請求可能被多個代理伺服器轉發,後面的伺服器稱為前面伺服器的上游伺服器。代理伺服器按照其使用方式和作用,分為正向代理伺服器、反向代理伺服器、透明代理伺服

Ubuntu上安裝tinyproxy搭建HTTP代理伺服器

1.TinyProxy安裝 sudo apt-get update apt-get install tinyproxy 2.然後配置引數檔案: vi /etc/tinyproxy.conf 3.修改下面兩個部分。 Port 8888      #預設

基於django做HTTP代理伺服器

這個專案實現了: a) 網站過濾:允許/不允許訪問某些網站; b) 使用者過濾:支援/不支援某些使用者訪問外部網站; c) 網站引導:將使用者對某個網站的訪問引導至一個模擬網站(釣 魚)。 d) 快取功能:要求能快取原伺服器響應的物件,並能夠通過修改請求報文(新增 if-modified-since頭行),向

使用JMeter的HTTP代理伺服器錄製app指令碼

本文為原創文章,轉載請註明出處,謝謝! 更多交流,請關注微信公眾號,謝謝支援 Apache JMeter是Apache組織開發的基於Java的壓力測試工具。用於對軟體做壓力測試,最初用於web應用

Linux下socket程式設計之多程序TCP伺服器

程式碼如下: tcp_server.c #include<string.h> #include<stdlib.h> #include<stdio.h> #include<sys/types.h> #includ

自己動手寫RTP伺服器——關於RTP協議

本文會帶領著你一步步動手實現一個簡單的RTP傳輸伺服器,旨在瞭解RTP流媒體傳輸協議以及一些關於多媒體編解碼的知識。關於RTP協議的必備知識要動手實現一個協議,當然首先需要閱讀該協議的文件。RTP協議的文件,有rfc1889、rfc1890、rfc3550,其中rfc3550