js 客戶端與伺服器端的通訊
客戶端與伺服器端通訊一般有兩種方法,隱藏iframe和使用xmlhttp物件
隱藏框架技術實現Ajax通常由4個過程組成。第一步是由使用者的某種行為引發了一個對隱藏框架的請求。這包括使用者單擊了在可見框架頁中的超連結,或者由使用者的其他互動行為所引發。通常情況下,對隱藏框架頁的請求僅僅是將隱藏框架頁重定向到一個伺服器上指定的服務端程式。對隱藏框架頁的重定向將自動觸發第二個過程:即向伺服器傳送請求。
在伺服器程式完成了對請求的處理之後,將發生第三個過程:即伺服器將響應傳送回隱藏框架頁。伺服器端的響應是一個Web頁面,該頁面將被髮送給隱藏框架。當來自伺服器的響應被完全接收後,隱藏框架中的Web頁面將發起與可見框架頁的聯絡,並告知可見框架,伺服器的響應已經成功。這就是第四個過程,該過程通常在隱藏框架的window.onload事件處理器中完成。
例子:
客戶端程式碼:
- var oHiddenFrame=null;
- function getServerInfo()
- {
- if(oHiddenFrame==null)
- {
- oHiddenFrame=document.createElement("iFrame");
- oHiddenFrame.name="hiddenFrame";
- oHiddenFrame.id="hiddenFrame";
- oHiddenFrame.style.height="0px";
- oHiddenFrame.style.width="0px";
- oHiddenFrame.style.position="absolute";
- oHiddenFrame.style.visibility="hidden";
- document.body.appendChild(oHiddenFrame);
- }
- setTimeout(function(){frames["hiddenFrame"].location.href="aa.aspx";},10);
- }
- function handleResponse(sResponseText)
- {
- alert("伺服器回應的訊息是:"+sResponseText);
- }
HTML
- <p>點選按鍵通過隱藏框架向伺服器發出請求</p>
- <input type="button" onclick="getServerInfo()" value="get server info" />
伺服器端響應的WEB頁面aa.aspx
- window.onload=function()
- {
- parent.handleResponse("bb")
- }
使用xmlhttp
xmlHttp是微軟建立的額物件,它的本質是新增額外的用於傳送和接收XML程式碼的功能的普通的HTTP請求。
當一個xmlHttp物件把一個http傳送到伺服器端,將經歷若干種狀態,而readyState這是描述這樣它的一系列狀態的一個屬性值
取值 描述
0 描述一種“為初始化”狀態,此時,已經建立一個xmlHttp物件,但是還沒有對它初始化
1 描述一種“準備傳送”狀態,此時,xmlHttp物件已經呼叫open()方法開啟一個請求,並且xmlHttp物件準備把這個請求傳送到出去
2 描述一種“傳送”狀態,此時,xmlHttp物件已經呼叫send()方法將請求傳送出去,但是還沒有從伺服器端得到相應。
3 描述一種“正在接收”狀態,此時,已收到HTTP相應頭部資訊,但是,訊息體部分還沒有完全接收
4 描述一種“已載入”狀態,此時,相應已經被完全接受。
responseText屬性
這個屬性包含客戶端接收到的HTTP響應的文字內容,當readyState屬性為0,1,2時,responseText為空字串,當為3時,包含部分響應資訊,當readyState為4時,包含完整的相應資訊。
responseXML屬性
此responseXML屬性用於當接收到完整的HTTP響應時(readyState為4)描述XML響應;此時,Content-Type頭部指定MIME(媒體)型別為text/xml,application/xml或以+xml結尾。如果Content-Type頭部並不包含這些媒體型別之一,那麼responseXML的值為null。無論何時,只要readyState值不為4,那麼該responseXML的值也為null。
其實,這個responseXML屬性值是一個文件介面型別的物件,用來描述被分析的文件。如果文件不能被分析(例如,如果文件不是良構的或不支援文件相應的字元編碼),那麼responseXML的值將為null。
statusText屬性
這個屬性描述了HTTP狀態程式碼文字,當且僅當readyState的值為3或4時才可用,當readySate為其它值時如果試圖讀取statusText將引發一個異常
abort()方法
可以使用該方法來取消一個http請求,從而把xmlHttp物件復位到為初始化狀態
open()方法
開啟一個請求,通常包括三個引數,提交方式:get和post,請求的URL,判斷同步還是非同步請求的布林值,同步為false,非同步為true.
send()方法
傳送一個請求。xmlHttp物件呼叫send方法後,通常講readyState屬性從1變為2.它通常包含一個引數,當使用get請求時,該引數可以為空,當使用post請求時,該引數通常是請求傳送的引數的字串。
setRequestHeader()方法
該setRequestHeader(DOMString header,DOMString value)方法用來設定請求的頭部資訊。當readyState值為1時,你可以在呼叫open()方法後呼叫這個方法;否則,你將得到一個異常。
getResponseHeader()方法
getResponseHeader(DOMString header,value)方法用於檢索響應的頭部值。僅當readyState值是3或4(換句話說,在響應頭部可用以後)時,才可以呼叫這個方法;否則,該方法返回一個空字串。
getAllResponseHeaders()方法
該getAllResponseHeaders()方法以一個字串形式返回所有的響應頭部(每一個頭部佔單獨的一行)。如果readyState的值不是3或4,則該方法返回null。
例子。。驗證一個使用者名稱是否存在
客戶端程式碼
- var request;
- function createXMLHTTP()
- {
- if(window.XMLHttpRequest)
- {
- return new XMLHttpRequest();
- }
- else if(window.ActiveXObject)
- {
- try
- {
- return new ActiveXObject("MSXML2.XMLHTTP");
- }
- catch(oException)
- {
- return new ActiveXObject("Microsoft.XMLHTTP");
- }
- }
- else
- {
- throw new Error("not exists");
- }
- }
- function checkUsername()
- {
- var userValue=document.getElementById("username").value;
- if(userValue=="")
- {
- alert("Please enter a user name to check!")
- return;
- }
- var url="bb.aspx?username="+userValue;
- request=createXMLHTTP();
- request.open("get","bb.aspx","true");
- request.onreadystatechange=function()
- {
- if(request.readyState==4)
- {
- alert(request.responseText)
- checkUsername_callBack(request.responseText);
- }
- }
- request.send(null);
- }
- function checkUsername_callBack(sResponseText)
- {
- var userValue=document.getElementById("username").value;
- if(sResponseText=="available")
- {
- alert("username:"+userValue+" is available!");
- }
- else
- {
- alert("username:"+userValue+" is not available!");
- }
- }
- <table>
- <tr>
- <td>UserName</td>
- <td><input type="text" id="username" /></td>
- <td><input type="button" value="驗證" onclick="checkUsername()"/></td>
- </tr>
- </table>
伺服器端bb.aspx程式碼
- protected void Page_Load(object sender, EventArgs e)
- {
- string username = Request.QueryString["username"];
- if ("aa" == username || "bb" == username)
- {
- Response.Write("available");
- }
- //else
- //{
- // Response.Write(username);
- //}
- }
相關文章
- 實現客戶端與服務端的HTTP通訊客戶端服務端HTTP
- Golang 實現客戶端與伺服器端UDP協議連線通訊Golang客戶端伺服器UDP協議
- Socket最簡單的客戶端與服務端通訊-Java客戶端服務端Java
- TCP協議服務端和客戶端的連線與通訊TCP協議服務端客戶端
- Redis:我是如何與客戶端進行通訊的Redis客戶端
- HarmonyOS IPC Kit進階:客戶端與服務端的基礎通訊客戶端服務端
- Easyvision中的伺服器與客戶端伺服器客戶端
- 基於WebSocket的modbus通訊(二)- 客戶端Web客戶端
- 基於node的tcp客戶端和服務端的簡單通訊TCP客戶端服務端
- 匯川AM401的TCP客戶端通訊TCP客戶端
- C++實現客戶端與伺服器的通訊(二):Base64編解碼C++客戶端伺服器
- SseEmitter 伺服器向客戶端推送訊息MIT伺服器客戶端
- JAVA通訊(一)——輸入資料到客戶端Java客戶端
- TCP通訊客戶端和服務端簡單程式碼實現TCP客戶端服務端
- C/S(socket、執行緒 實現多個客戶端、伺服器端簡易通訊)執行緒客戶端伺服器
- security.js RSA加密與java客戶端解密JS加密Java客戶端解密
- C++實現客戶端與伺服器的通訊(三):在遠端伺服器中處理本地攝像頭資料C++客戶端伺服器
- 從PHP客戶端看MongoDB通訊協議TDPHP客戶端MongoDB協議
- 客戶端與伺服器之間雙向通訊的5種方式總結(完整程式碼演示)客戶端伺服器
- socket.io 客戶端與伺服器應用客戶端伺服器
- YUM源伺服器搭建與客戶端配置使用伺服器客戶端
- MQTT伺服器搭建服務端和客戶端MQQT伺服器服務端客戶端
- Spring Boot+Socket實現與html頁面的長連線,客戶端給伺服器端發訊息,伺服器給客戶端輪詢傳送訊息,附案例原始碼Spring BootHTML客戶端伺服器原始碼
- Redis 6.0 客戶端快取的伺服器端實現Redis客戶端快取伺服器
- C#Socket伺服器與客戶端的開發(3)C#伺服器客戶端
- 客戶端的js js指令碼的引入 js的解析過程客戶端JS指令碼
- 服務端,客戶端服務端客戶端
- 客戶端,服務端客戶端服務端
- Nebula Graph 原始碼解讀系列|客戶端的通訊秘密——fbthrift原始碼客戶端
- Swoole 協程 MySQL 客戶端與非同步回撥 MySQL 客戶端的對比MySql客戶端非同步
- 騰訊 客戶端開發 QT客戶端QT
- Linux下簡單的ACE socket客戶端和伺服器端Linux客戶端伺服器
- Qt TCP通訊客戶端斷開連線有哪些方法QTTCP客戶端
- 為什麼從伺服器與客戶端不能接收訊息NetMQ框架?伺服器客戶端MQ框架
- php與ethereum客戶端互動PHP客戶端
- Nebula Graph 原始碼解讀系列|客戶端的通訊祕密——fbthrift原始碼客戶端
- dubbo客戶端客戶端
- Pulsar客戶端客戶端
- mqtt 客戶端MQQT客戶端