『壹』 客戶端怎麼使用httpclient向https伺服器發送數據
直接用HttpClient這個類庫,每次你都用同一個cookie去登錄就可以保持session了HttpClient是一個客戶端的HTTP通信實現庫,目標是發送和接受HTTP請求。HTTPClient維護cookies,session的保持在客戶端就是cookie的體現。HttpClinet的session的保持有兩種方式,一種是將HttpClient實例保存於web應用的session中,再次請求時取出,因為httpclient會維持cookies。另一種是再次請求時,將上次請求獲取的cookies帶入請求中,此種方式無需將httpclient保存於session中。NameValuePair[]param={newNameValuePair("username",userId),newNameValuePair("password",password)};//第一種方式httpclient保存於session,每次請求均為同一httpclient,httpclient維持cookies//HttpClientclient=(HttpClient)request.getSession().getAttribute("HTTPCLIENT");//第二種方式每次請求帶入之前請求獲取的cookies。HttpClientclient=newHttpClient();client.getState().addCookies(cookies);PostMethodpost=newPostMethod(url);client.getParams().setParameter(HttpMethodParams.HTTP_CONTENT_CHARSET,"UTF-8");client.getParams().setCookiePolicy(CookiePolicy.BROWSER_COMPATIBILITY);post.setRequestBody(param);client.executeMethod(post);Cookie[]cookies=client.getState().getCookies();post.releaseConnection();
『貳』 要求客戶端訪問圖片時,發出3次請求。代碼
1、建立TCP連接。
2、Web瀏覽器向Web伺服器發送請求命令。
3、Web瀏覽器發送請求頭信息。
4、Web伺服器應答。
5、Web伺服器發送應答頭信息。
6、Web伺服器向瀏覽器發送數據。
7、Web伺服器關閉TCP連接。以上都是客戶端訪問圖片時,發出3次請求代碼的要求。
『叄』 R爬蟲必備基礎—HTTP協議
HTTP協議是Hyper Text Transfer Protocol(超文本傳輸協議)的縮寫,是用於從萬維網(WWW:World Wide Web )伺服器傳輸超文本到本地瀏覽器的傳送協議。HTTP是一個基於TCP/IP通信協議來傳遞數據(HTML 文件, 圖片文件, 查詢結果等)。
HTTP協議工作於客戶端-服務端架構上。瀏覽器作為HTTP客戶端通過URL向HTTP服務端即WEB伺服器發送所有請求。Web伺服器有:Apache伺服器,IIS伺服器(Internet Information Services)等。Web伺服器根據接收到的請求後,向客戶端發送響應信息。HTTP默認埠號為80,但是你也可以改為8080或者其他埠。
通信流程說明:
①用戶首先通過滑鼠/鍵盤點擊或手動輸入目標鏈接(即URL(Uniform Resource Locators),中文名稱:統一資源定位符),向HTTP客戶端(如常見的瀏覽器)傳達數據查詢需求。
②HTTP客戶端收到需求後,將收到的URL信息向DNS伺服器(域名系統)詢問鏈接對應的具體IP地址,DNS伺服器返回URL對應的IP地址。
③HTTP客戶端再拿著IP地址通過TCP協議(傳輸控制協議,Transmission Control Protocol)和IP協議(Internet Protocol)向HTTP伺服器發出數據請求,等待伺服器響應。
④HTTP伺服器將請求的相關信息返回給HTTP客戶端,由客戶端返回給客戶。
⑤重復上述步驟①~④,直到所有請求執行完畢。
URL格式: 如 scheme://hostname:port/path?querystring#fragment 。一個完整的URL共有6部分構成,但是並不是每個部分都一定要具備。參數解釋如下:
HTTP是基於客戶端/服務端(C/S)的架構模型,通過一個可靠的鏈接來交換信息,是一個無狀態的請求/響應協議。一個HTTP"客戶端"是一個應用程序(Web瀏覽器或其他任何客戶端),通過連接到伺服器達到向伺服器發送一個或多個HTTP的請求的目的。一個HTTP"伺服器"同樣也是一個應用程序(通常是一個Web服務,如Apache Web伺服器或IIS伺服器等),通過接收客戶端的請求並向客戶端發送HTTP響應數據。HTTP使用統一資源標識符(Uniform Resource Identifiers, URI)來傳輸數據和建立連接。一旦建立連接後,數據消息就通過類似Internet郵件所使用的格式[RFC5322]和多用途Internet郵件擴展(MIME)[RFC2045]來傳送。
客戶端發送一個HTTP請求到伺服器的請求消息包括以下格式:請求行(request line)、請求頭部(header)、空行和請求數據四個部分組成,下圖給出了請求報文的一般格式。
如:
HTTP響應也由四個部分組成,分別是:狀態行、消息報頭、空行和響應正文。
如:
根據 HTTP 標准,HTTP 請求可以使用多種請求方法。HTTP1.0 定義了三種請求方法:GET, POST 和 HEAD方法。HTTP1.1 新增了六種請求方法:OPTIONS、PUT、PATCH、DELETE、TRACE 和 CONNECT 方法。
在請求模式中,最常用的請求方法是GET和POST方法,在爬蟲過程中至關重要。這兩個方法都是從伺服器請求一個資源,但是在正文的使用上有所不同。GET方法是網路請求最通用方法,可理解為直接請求。POST則有所區別,需要提交表單信息才能請求到信息,比如說拉勾網招聘首頁需要用戶輸入地點、薪資范圍等信息才能請求到匹配的網頁界面。
HTTP請求頭提供了關於請求,響應或者其他的發送實體的信息。下面將具體來介紹HTTP響應頭信息。
當瀏覽者訪問一個網頁時,瀏覽者的瀏覽器會向網頁所在伺服器發出請求。當瀏覽器接收並顯示網頁前,此網頁所在的伺服器會返回一個包含HTTP狀態碼的信息頭(server header)用以響應瀏覽器的請求。HTTP狀態碼的英文為HTTP Status Code。下面是常見的HTTP狀態碼:
200 - 請求成功
301 - 資源(網頁等)被永久轉移到其它URL
404 - 請求的資源(網頁等)不存在
500 - 內部伺服器錯誤
HTTP狀態碼由三個十進制數字組成,第一個十進制數字定義了狀態碼的類型,後兩個數字沒有分類的作用。HTTP狀態碼共分為5種類型:
Content-Type(內容類型),一般是指網頁中存在的 Content-Type,用於定義網路文件的類型和網頁的編碼,決定瀏覽器將以什麼形式、什麼編碼讀取這個文件,比如text/html/xml/json/jpg/gif/pdf等。Content-Type 標頭告訴客戶端實際返回的內容的內容類型,如下圖,返回的是html格式文件。
當我們在地址欄輸入 www.sina.com.cn 時,瀏覽器將顯示新浪的首頁。在這個過程中,瀏覽器都幹了哪些事情呢?通過Network的記錄,我們就可以知道。在Network中,定位到第一條記錄,點擊右側Headers,從Request Headers中可以看到瀏覽器發給新浪伺服器的請求:請求網址為 https://www.sina.com.cn/ ,請求方法為GET.
繼續往下找到Response Headers,它顯示伺服器返回的原始響應數據。其中200表示一個成功的響應,後面的OK是說明。失敗的響應有404 Not Found:網頁不存在,500 Internal Server Error:伺服器內部出錯,等等。Content-Type指示響應的內容,這里是text/html表示HTML網頁。請注意,瀏覽器就是依靠Content-Type來判斷響應的內容是網頁還是圖片,是視頻還是音樂。
HTTP響應返回的是HTML源碼,點擊Response,可以看到返回的html網頁源碼。
接著,當瀏覽器讀取到新浪首頁的HTML源碼後,它會解析HTML,顯示頁面,然後,根據HTML裡面的各種鏈接,再發送HTTP請求給新浪伺服器,拿到相應的圖片、視頻、Flash、javaScript腳本、CSS等各種資源,最終顯示出一個完整的頁面。
參考: https://www.runoob.com/http/http-tutorial.html
更多內容可關注公共號「YJY技能修煉」~~~
往期回顧
R爬蟲在工作中的一點妙用
R爬蟲必備基礎——HTML和CSS初識
R爬蟲必備基礎——靜態網頁+動態網頁
R爬蟲必備——rvest包的使用
R爬蟲必備基礎——CSS+SelectorGadget
R爬蟲必備基礎—Chrome開發者工具(F12)
『肆』 java客戶端怎麼往伺服器端寫請求
你是要自己寫還是怎麼的?要是自己寫的話你直接把充伺服器傳過來的圖片通過輸出流輸出到本地指定的地方就可以了。
『伍』 怎麼向伺服器手動發送SYN請求
瀏覽器通過IP向目標伺服器發送請求。建立連接時,客戶端發送syn包(syn=j)到伺服器,並進入SYN_SENT狀態,等待伺服器確認。伺服器收到syn包,必須確認客戶的SYN(ack=j+1),同時自己也發送一個SYN包(syn=k),即SYN+ACK包,此時伺服器進入SYN_RECV狀態。客戶端收到伺服器的SYN+ACK包,向伺服器發送確認包ACK(ack=k+1),此包發送完畢,客戶端和伺服器進入ESTABLISH(TCP連接成功)狀態,完成三次握手。
『陸』 客戶端怎麼使用httpclient向https伺服器發送數據
客戶端向伺服器發送數據時,份兩種情況,SSL單向驗證和SSL雙向驗證
1.SSL單向驗證時
代碼如下:
Java代碼
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.params.HttpClientParams;
import org.apache.commons.httpclient.params.HttpMethodParams;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class ClientSendData {
static Log log = LogFactory.getLog(ClientSendData.class);
private String Url;
// 初始化數據
public ClientSendData() {
Url = "https://test.yihaodian.com:8443/ims/feedbackToPingAn_getData.action";
}
public String sendData(String data) {
String receivedData = null;
try {
Map<String, String> paramsData = new HashMap<String, String>();
paramsData.put("data", data);
receivedData = send(Url, paramsData);
} catch (Exception e) {
e.printStackTrace();
}
return receivedData;
}
public static String send(String url, Map<String, String> paramsMap) {
String result = null;
PostMethod postMethod = null;
HttpClient httpClient = new HttpClient();
httpClient.getParams().setParameter(
HttpMethodParams.HTTP_CONTENT_CHARSET, "utf-8");
postMethod = new PostMethod(url);
if (paramsMap != null && paramsMap.size() > 0) {
NameValuePair[] datas = new NameValuePair[paramsMap.size()];
int index = 0;
for (String key : paramsMap.keySet()) {
datas[index++] = new NameValuePair(key, paramsMap.get(key));
}
postMethod.setRequestBody(datas);
}
HttpClientParams httparams = new HttpClientParams();
httparams.setSoTimeout(60000);
postMethod.setParams(httparams);
try {
int statusCode = httpClient.executeMethod(postMethod);
if (statusCode == HttpStatus.SC_OK) {
result = postMethod.getResponseBodyAsString();
log.info("發送成功!");
} else {
log.error(" http response status is " + statusCode);
}
} catch (HttpException e) {
log.error("error url=" + url, e);
} catch (IOException e) {
log.error("error url=" + url, e);
} finally {
if (postMethod != null) {
postMethod.releaseConnection();
}
}
return result;
}
public static void main(String[] args) {
ClientSendData t = new ClientSendData();
t.sendData("測試SSL單項連接,向服務端發送數據!");
}
}
可能出現的異常
1.java.net.ConnectException: Connection refused: connect
伺服器沒有啟動
2 .javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed
服務端的證書是不可信的。解決辦法見這篇文章 http://zhuyuehua.iteye.com/blog/1102347
3.java.net.SocketException: Software caused connection abort: recv failed
這是由於服務端配置的是SSL雙向認證,而客戶端發送數據是按照伺服器是單向認證時發送的,即沒有將客戶端證書信息一起發送給服務端。
4.org.apache.commons.httpclient.NoHttpResponseException
這一般是服務端防火牆的原因。攔截了客戶端請求。
另外,當服務端負載過重時,也會出現此問題。
5.javax.net.ssl.SSLHandshakeException: Remote host closed connection ring handshake
這是由於服務端配置的是SSL雙向認證,而客戶端發送數據是按照伺服器是單向認證時發送的,即沒有將客戶端證書信息一起發送給服務端。服務端驗證客戶端證書時,發現客戶端沒有證書,然後就斷開了握手連接。
2.SSL雙向驗證時
雙向驗證時,暫時不知道如何用HTTPCLIENT發送數據,如需要雙向驗證時發送數據,參考我另外的文章。另外,有知道HTTPCLIENT如何在雙向驗證時發送數據的,懇請指教。
『柒』 Web伺服器的工作原理: 談談客戶端如何向Web伺服器提出請求,Web伺服器怎樣響應請求,提供服務
一般是
客戶端發送http請求(tcp 80)到伺服器端,tcp連接建立之後,通過http的動作get獲得頁面信息
具體不是一句兩句能說明白的
自己抓包看吧
『捌』 推送消息有哪些實現方式
消息推送(Push)指運營人員通過自己的產品或第三方工具對用戶移動設備進行的主動消息推送。推送消息有有5種實現方式,以下是實現的方式: