国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

基于HTTP協(xié)議的數(shù)據(jù)傳輸程序設(shè)計與實(shí)例

2022-01-20 01:39:24于文學(xué)畢聰瑞陳紹飛
工程與試驗(yàn) 2021年4期
關(guān)鍵詞:服務(wù)端程序設(shè)計客戶端

于文學(xué),張 鵬,畢聰瑞,陳紹飛

(中機(jī)試驗(yàn)裝備股份有限公司,吉林 長春 130103)

1 引 言

自動校直機(jī)現(xiàn)已成為工廠中不可或缺的智能裝備,代替人工操作液壓機(jī)等設(shè)備完成校直工序,降低人工勞動成本及時間成本,實(shí)現(xiàn)自動校正,使產(chǎn)品能夠滿足使用要求,極大地提高產(chǎn)品的利用率。隨著“數(shù)字化工廠”概念的誕生,工廠中的加工產(chǎn)品各工藝數(shù)據(jù)追溯顯得尤為重要,自動校直機(jī)同樣面臨著校正數(shù)據(jù)及設(shè)備運(yùn)行狀態(tài)實(shí)時傳輸?shù)膯栴}。

目前,工廠MES系統(tǒng)數(shù)據(jù)采集方式可分為以下三類:直接聯(lián)網(wǎng)通信進(jìn)行數(shù)據(jù)交互、通過工業(yè)網(wǎng)關(guān)通信進(jìn)行數(shù)據(jù)交互、遠(yuǎn)程IO模塊進(jìn)行數(shù)據(jù)交互。直接聯(lián)網(wǎng)通信適用于生產(chǎn)設(shè)備具備以太網(wǎng)通信網(wǎng)口,直接與局域網(wǎng)連接進(jìn)行數(shù)據(jù)傳輸。工業(yè)網(wǎng)關(guān)通信適用于生產(chǎn)設(shè)備不具備以太網(wǎng)通信網(wǎng)口硬件條件,通過PLC模塊進(jìn)行數(shù)據(jù)采集。當(dāng)生產(chǎn)設(shè)備既不具備以太網(wǎng)通信網(wǎng)口,也沒有使用PLC模塊,可增加遠(yuǎn)程IO模塊進(jìn)行數(shù)據(jù)采集。

基于HTTP協(xié)議進(jìn)行數(shù)據(jù)傳輸屬于直接聯(lián)網(wǎng)通信的一種主流方式。HTTP協(xié)議具有簡單快速、靈活、可擴(kuò)展性強(qiáng)的特點(diǎn),適用于工廠內(nèi)MES數(shù)據(jù)交互的應(yīng)用場景。因此,本文介紹了一種基于HTTP協(xié)議進(jìn)行數(shù)據(jù)傳輸?shù)姆椒?,與自動校直機(jī)上位機(jī)程序相融合,能夠快速地完成數(shù)據(jù)信息交互流程。

2 HTTP協(xié)議

2.1 HTTP協(xié)議及工作流程

HTTP協(xié)議中文名為超文本傳輸協(xié)議,是一個基于請求與響應(yīng)模式的、無狀態(tài)的、應(yīng)用層的協(xié)議,以TCP協(xié)議為基礎(chǔ)進(jìn)行數(shù)據(jù)傳輸[1,2]。

HTTP服務(wù)端啟動服務(wù)并偵聽HTTP客戶端請求,客戶端封裝請求頭、請求體后發(fā)出請求。服務(wù)端偵聽到客戶端請求后進(jìn)行解析并處理,封裝響應(yīng)頭、響應(yīng)體,返回響應(yīng)消息,完成一次客戶端與服務(wù)端信息交互流程。HTTP協(xié)議工作流程如圖1所示。

圖1 HTTP協(xié)議工作流程

2.2 HTTP協(xié)議常用方法

(1)GET方法。獲取服務(wù)器上的某一特定資源,請求的數(shù)據(jù)信息附加在服務(wù)器接口路徑之后,以“?”分割URL和傳輸數(shù)據(jù),多個參數(shù)用“&”連接[3]。傳輸?shù)臄?shù)據(jù)大小受URL長度限制,少量的數(shù)據(jù)傳輸適宜采用GET方法進(jìn)行資源請求。

(2)POST方法。向服務(wù)器提交資源讓服務(wù)器處理,比如提交表達(dá)、上傳文件等。請求的數(shù)據(jù)放置在HTTP請求包的包體中,理論上傳輸?shù)臄?shù)據(jù)大小不受限制。

(3)PUT方法。向服務(wù)器發(fā)送請求。如果URL不存在,服務(wù)器根據(jù)請求創(chuàng)建資源;如果URL存在,根據(jù)請求修改URL資源[4]。

(4)DELETE方法。請求服務(wù)器刪除某一特定資源。

2.3 HTTP協(xié)議特性

(1)安全性

HTTP協(xié)議安全性較差。HTTP協(xié)議屬于明文傳輸協(xié)議,數(shù)據(jù)交互過程沒有進(jìn)行任何加密及通信認(rèn)證。GET方法更是將請求的數(shù)據(jù)信息完全顯示在URL路徑之后,無需任何數(shù)據(jù)解析便可直接獲取請求數(shù)據(jù)內(nèi)容。若對數(shù)據(jù)安全性要求較高,不建議使用HTTP協(xié)議,可采用HTTPS協(xié)議實(shí)現(xiàn)。

(2)可靠性

HTTP協(xié)議基于TCP協(xié)議進(jìn)行數(shù)據(jù)傳輸。TCP協(xié)議是一個連接傳輸協(xié)議,因此HTTP協(xié)議數(shù)據(jù)傳輸可靠性較高。

(3)靈活、擴(kuò)展性

HTTP協(xié)議對于報文沒有太多限制,可根據(jù)實(shí)際情況靈活擴(kuò)展,程序改動量較小。

3 基于HTTP協(xié)議的上位機(jī)程序設(shè)計與實(shí)例

自動校直機(jī)傳輸?shù)臄?shù)據(jù)主要分以下兩部分:一部分為設(shè)備實(shí)時狀態(tài)數(shù)據(jù),另一部分為產(chǎn)品加工數(shù)據(jù)。保持著程序高內(nèi)聚、低耦合的設(shè)計思想,將上位機(jī)程序設(shè)計成既是服務(wù)端,又是客戶端。服務(wù)端負(fù)責(zé)監(jiān)聽MES系統(tǒng)請求,將設(shè)備實(shí)時工作狀態(tài)數(shù)據(jù)進(jìn)行封裝,作為請求響應(yīng)返回給MES系統(tǒng)??蛻舳送ㄟ^POST方法向MES系統(tǒng)服務(wù)器發(fā)送產(chǎn)品加工數(shù)據(jù),實(shí)現(xiàn)產(chǎn)品校直工藝數(shù)據(jù)的可追溯功能。根據(jù)上述設(shè)計思想,程序設(shè)計流程如圖2所示。

圖2 程序設(shè)計流程圖

上位機(jī)程序在.NET Framework 4.5框架上進(jìn)行開發(fā),工程項(xiàng)目引用System.Web.dll,并添加System.Net、System.Web命名空間。

3.1 HTTP服務(wù)端程序?qū)嵗?/h3>

(1)啟動服務(wù)端

通過以下方式啟動服務(wù)器:

//port為服務(wù)端偵聽端口

listener = new TcpListener(port);

listener.Start();

(2)解析客戶端請求并響應(yīng)

服務(wù)端調(diào)用AcceptTcpClient()偵聽客戶端請求。

public void process()

{

Task.Factory.StartNew(() =>

{

inputStream=

new BufferedStream(socket.GetStream());

outputStream = New StreamWriter

(new BufferedStream(socket.GetStream()));

try

{

parseRequest();

readHeaders();

if (http_method.Equals("GET"))

handleGETRequest();

else if (http_method.Equals("POST"))

handlePOSTRequest();

}

catch (Exception e)

{

Console.WriteLine("Exception: " + e.ToString

());

writeFailure();

}

outputStream.Flush();

inputStream = null;

outputStream = null;

socket.Close();

});

}

上述程序Socket變量為AcceptTcpClient()的返回值,通過以上程序可完成客戶端請求方法及對數(shù)據(jù)進(jìn)行解析。

3.2 HTTP客戶端程序?qū)嵗?/h3>

客戶端程序主要調(diào)用GET方法與POST方法進(jìn)行資源請求與發(fā)送。HttpWebRequest類屬性設(shè)置如下:

KeepAlive屬性:客戶端設(shè)置是否與服務(wù)端建立持續(xù)型連接,默認(rèn)值為true。

Method屬性:客戶端設(shè)置請求的方法,默認(rèn)值為GET。

ContentType屬性:客戶端設(shè)置HTTP標(biāo)頭的數(shù)據(jù)格式,默認(rèn)值為null。

Timeout屬性:客戶端設(shè)置請求超時前等待的毫秒數(shù),默認(rèn)值為100s。

(1)GET方法程序

public static string Get(string Url)

{

HttpWebRequest getrequest = (HttpWebRequest)

WebRequest.Create(Url);

getrequest.Proxy = null;

getrequest.KeepAlive = false;

getrequest.Method = "GET";

getrequest.ContentType =

"application/json; charset=UTF-8";

getrequest.AutomaticDecompression = DecompressionMethods.GZip;

getrequest.Timeout = 2 * 1000;

HttpWebResponse getresponse =(HttpWebResponse)

getrequest.GetResponse();

Stream myResponseStream

getresponse.GetResponseStream();

StreamReader mygetStreamReader = new

StreamReader(myResponseStream, Encoding.UTF8);

string retgetString =

mygetStreamReader.ReadToEnd();

mygetStreamReader.Close();

myResponseStream.Close();

if (getresponse !=null)

getresponse.Close();

if (getrequest !=null)

getrequest.Abort();

return retgetString;

}

(2)POST方法程序

public static string Post(string Url, string Data, string Referer = null)

{

HttpWebRequest postrequest =

(HttpWebRequest)WebRequest.Create(Url);

postrequest.Method = "POST";

postrequest.Referer = Referer;

byte[] bytes = Encoding.UTF8.GetBytes(Data);

postrequest.ContentType =

"application/x-www-form-urlencoded";

postrequest.ContentLength = bytes.Length;

postrequest.Timeout = 2 * 1000;

Stream myResponseStream =

postrequest.GetRequestStream();

myResponseStream.Write(bytes, 0, bytes.Length);

HttpWebResponse postresponse =

(HttpWebResponse) postrequest.GetResponse();

StreamReader mypostStreamReader = new

StreamReader(postresponse.GetResponseStream(), Encoding.UTF8);

string retpostString =

mypostStreamReader.ReadToEnd();

mypostStreamReader.Close();

myResponseStream.Close();

if (postresponse != null)

postresponse.Close();

if (postrequest != null)

postrequest.Abort();

return retpostString;

}

3.3 開發(fā)注意事項(xiàng)

(1)服務(wù)端調(diào)用AcceptTcpClient()會阻塞線程執(zhí)行,直至客戶端發(fā)起請求。可在調(diào)用AcceptTcpClient()前調(diào)用Pending()判斷當(dāng)前是否存在掛起的連接請求。若存在則調(diào)用AcceptTcpClient()獲取請求數(shù)據(jù),若不存在則等待下一次輪詢。具體代碼如下:

While(true)

{

if(tcpListener.Pending())

tcpListener.AcceptTcpClient();

}

(2)服務(wù)端處理連接請求時可能耗時較長,由于自動校直機(jī)各軸位置控制對實(shí)時性要求較高,本程序采用任務(wù)模式進(jìn)行數(shù)據(jù)處理,Action為連接請求處理函數(shù)Task.Factory.StartNew(()=>Action)。

4 結(jié) 論

本文詳細(xì)介紹了基于HTTP協(xié)議進(jìn)行數(shù)據(jù)傳輸?shù)某绦蛟O(shè)計與實(shí)例。上位機(jī)采用C#程序開發(fā),使用HTTP協(xié)議傳輸數(shù)據(jù)極大減少了復(fù)雜的通信協(xié)議開發(fā)流程,程序簡潔、可讀性高、可擴(kuò)展性強(qiáng),而且設(shè)計周期短,數(shù)據(jù)傳輸效率高。目前現(xiàn)場的應(yīng)用情況表明,系統(tǒng)穩(wěn)定可靠運(yùn)行,可以廣泛地應(yīng)用到其他設(shè)備上,為MES數(shù)據(jù)傳輸提供了一種新的可靠傳輸方式。

猜你喜歡
服務(wù)端程序設(shè)計客戶端
基于Visual Studio Code的C語言程序設(shè)計實(shí)踐教學(xué)探索
從細(xì)節(jié)入手,談PLC程序設(shè)計技巧
電子制作(2019年9期)2019-05-30 09:42:04
云存儲中基于相似性的客戶-服務(wù)端雙端數(shù)據(jù)去重方法
縣級臺在突發(fā)事件報道中如何應(yīng)用手機(jī)客戶端
傳媒評論(2018年4期)2018-06-27 08:20:24
孵化垂直頻道:新聞客戶端新策略
傳媒評論(2018年4期)2018-06-27 08:20:16
基于Vanconnect的智能家居瘦客戶端的設(shè)計與實(shí)現(xiàn)
電子測試(2018年10期)2018-06-26 05:53:34
新時期《移動Web服務(wù)端開發(fā)》課程教學(xué)改革的研究
在Windows Server 2008上創(chuàng)建應(yīng)用
高職高專院校C語言程序設(shè)計教學(xué)改革探索
PLC梯形圖程序設(shè)計技巧及應(yīng)用
门头沟区| 宁河县| 那曲县| 焉耆| 抚宁县| 富蕴县| 皮山县| 玉环县| 兴仁县| 巴彦淖尔市| 宽甸| 临城县| 兴宁市| 鹤山市| 定日县| 威宁| 长治市| 科技| 枣强县| 平遥县| 东乌| 琼结县| 班戈县| 巫山县| 南城县| 怀柔区| 福泉市| 防城港市| 宁津县| 石景山区| 砚山县| 友谊县| 泸水县| 格尔木市| 许昌县| 镇安县| 阜城县| 望都县| 同德县| 图片| 昌都县|