版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 學(xué)號(hào)</b></p><p><b> 畢業(yè)設(shè)計(jì)(論文)</b></p><p> 題目: 基于C#的遠(yuǎn)程液位監(jiān)控軟件設(shè)計(jì)</p><p> 作 者 屆 別 </p><p>
2、; 學(xué) 院 專 業(yè) </p><p> 指導(dǎo)教師 職 稱 </p><p> 完成時(shí)間 年 月 日 </p><p><b> 摘 要</b>
3、</p><p> 為了彌補(bǔ)組態(tài)軟件在遠(yuǎn)程液位監(jiān)控系統(tǒng)中的不足,本文設(shè)計(jì)了一套基于C#的遠(yuǎn)程液位監(jiān)控軟件。本軟件依靠.NET類庫中Windows.Forms類完成了服務(wù)器與客戶端測(cè)試界面的設(shè)計(jì),還利用SOCKET類實(shí)現(xiàn)了服務(wù)器與客戶端之間的異步通信,達(dá)到了實(shí)時(shí)傳輸和遠(yuǎn)程監(jiān)控的要求。同時(shí)利用內(nèi)部的垃圾回收機(jī)制,有效的避免了資源浪費(fèi)和內(nèi)存泄露等缺陷。在滿足企業(yè)個(gè)性化設(shè)計(jì)需求的同時(shí)還保證了測(cè)控平臺(tái)的工作性能和測(cè)控質(zhì)量
4、,極大的提高了工業(yè)生產(chǎn)效率。</p><p> 關(guān)鍵詞:C#;SOCKET;異步通信;</p><p><b> Abstract</b></p><p> To make up for deficiencies in the remote configura
5、tion software level monitoring system, the paper designs a C # based on the level of remote monitoring software. The sof
6、tware relies on .NET class library Windows.Forms class completed the test server and the client interface design, but also us
7、e SOCKET class implements the asynchronous communication between the server and the client, to the real-time transmission and remo
8、te monitoring requirements. While taking advantage of the internal garbage</p><p> Keywords: C #; SOCKET; asynchronous communication; &l
9、t;/p><p><b> 目 錄</b></p><p><b> 摘 要I</b></p><p> AbstractII</p><p> 第1章 引 言1</p><p> 1.1 課題研究的背景1</p><p> 1.2
10、 課題研究的意義1</p><p> 1.3 課題研究?jī)?nèi)容及結(jié)構(gòu)安排2</p><p> 第2章 系統(tǒng)整體結(jié)構(gòu)3</p><p> 2.1 控制系統(tǒng)構(gòu)成3</p><p> 2.2 測(cè)控軟件構(gòu)成4</p><p> 2.2.1 相關(guān)技術(shù)介紹4</p><p> 2.2.
11、2 程序流程框圖5</p><p> 2.3 本章小結(jié)6</p><p> 第3章 監(jiān)控軟件程序?qū)崿F(xiàn)7</p><p> 3.1 軟件設(shè)計(jì)方案7</p><p> 3.2 服務(wù)器設(shè)計(jì)7</p><p> 3.2.1 界面設(shè)計(jì)7</p><p> 3.2.2 Socket
12、編程8</p><p> 3.3 客戶端設(shè)計(jì)12</p><p> 3.3.1 界面設(shè)計(jì)12</p><p> 3.3.2 Socket編程13</p><p> 3.4 本章小結(jié)15</p><p> 第4章 ActiveX控件生成與發(fā)布16</p><p> 4.1
13、 控件生成與發(fā)布16</p><p> 4.2 本章小結(jié)21</p><p> 第5章 軟件生成與測(cè)試22</p><p> 5.1 軟件生成及測(cè)試22</p><p> 5.2 本章小結(jié)25</p><p> 第6章 結(jié)語與展望26</p><p><b>
14、 參考文獻(xiàn)27</b></p><p><b> 致 謝28</b></p><p> 附錄 軟件代碼29</p><p><b> 第1章 引 言</b></p><p> 1.1 課題研究的背景</p><p> 隨著科技的不斷發(fā)展,遠(yuǎn)
15、程監(jiān)控技術(shù)以其逐步完善和推廣,逐漸使人們意識(shí)到遠(yuǎn)程測(cè)控技術(shù)對(duì)現(xiàn)代企業(yè)管理和生產(chǎn)效率的重要意義。為了提高生產(chǎn)效率,人們希望獲得對(duì)工廠生產(chǎn)中大量的物理量和生產(chǎn)工藝等參數(shù)的實(shí)時(shí)測(cè)控。但是以往的監(jiān)測(cè)技術(shù)已經(jīng)無法滿足當(dāng)代工業(yè)生產(chǎn)的需求。伴隨著通訊技術(shù)、電子技術(shù)和計(jì)算機(jī)網(wǎng)絡(luò)技術(shù)的快速發(fā)展,豐富的網(wǎng)絡(luò)資源以及不斷降低的成本為網(wǎng)絡(luò)化遠(yuǎn)程監(jiān)控系統(tǒng)提供了可能。</p><p> 液位監(jiān)控是當(dāng)代工業(yè)測(cè)控中較為普遍的一類問題,在石油、
16、化工、電力等工業(yè)部門中應(yīng)用極為普及,是工業(yè)生產(chǎn)過程當(dāng)中的一個(gè)重要構(gòu)成部分。針對(duì)傳統(tǒng)工業(yè)生產(chǎn)中液位過程所具有的非線性、時(shí)滯和時(shí)變等復(fù)雜特性,液位監(jiān)控系統(tǒng)能夠有效的模擬和監(jiān)測(cè)生產(chǎn)中液位過程所產(chǎn)生的一系列物理量,并及時(shí)針對(duì)其產(chǎn)生的問題做出相應(yīng)的調(diào)整。此外,液位過程測(cè)控平臺(tái)的構(gòu)建和控制方案的鉆研,對(duì)工業(yè)生產(chǎn)中施行液位過程控制具備重要的指導(dǎo)作用。</p><p> 1.2 課題研究的意義 </p>
17、<p> 當(dāng)前國(guó)內(nèi)外大多數(shù)企業(yè)都使用組態(tài)軟件對(duì)液位過程進(jìn)行監(jiān)控。組態(tài)軟件是近些年在工業(yè)控制領(lǐng)域廣泛應(yīng)用的軟件開發(fā)工具,可快速構(gòu)建不同需求的數(shù)據(jù)采集和監(jiān)控系統(tǒng)。應(yīng)用組態(tài)軟件可免去了傳統(tǒng)測(cè)控軟件編寫中龐大而復(fù)雜的編程工作,大大提高了測(cè)控系統(tǒng)的開發(fā)效率,且保證了測(cè)控平臺(tái)的工作性能和測(cè)控質(zhì)量。</p><p> 然而傳統(tǒng)的組態(tài)軟件在使用過程中由于系統(tǒng)體積的龐大,造成了巨大的資源浪費(fèi),且價(jià)格昂貴,無法滿足
18、企業(yè)各種個(gè)性化設(shè)計(jì)的要求。因此不滿足大多數(shù)中小型企業(yè)的要求。針對(duì)這一問題,大部分開發(fā)人員選擇使用VB或VC++等語言開發(fā)符合企業(yè)需求的監(jiān)控軟件。雖然利用這些語言編寫的監(jiān)控軟件可以彌補(bǔ)組態(tài)軟件的不足,且可以自由的對(duì)系統(tǒng)資源進(jìn)行控制。但是由于語言本身的不完善,很容易造成系統(tǒng)資源浪費(fèi),內(nèi)存泄露等問題,從而使得監(jiān)控軟件不穩(wěn)定,極大地影響了監(jiān)測(cè)質(zhì)量。</p><p> C#是微軟公司于2000年7月,專門為.NET的應(yīng)用
19、而發(fā)布的一種全新的面向?qū)ο蟪绦蛟O(shè)計(jì)語言,具有簡(jiǎn)單、安全等特點(diǎn)。C#繼承了C語言的語法風(fēng)格,同時(shí)又繼承了C++的面向?qū)ο筇匦裕瑫r(shí)擁有和VB相類似的快速開發(fā)能力。因此用C#語言開發(fā)的遠(yuǎn)程液位測(cè)控軟件可以有效的彌補(bǔ)傳統(tǒng)組態(tài)軟件的不足,滿足企業(yè)個(gè)性化的要求。利用.NET程序集、MSIL和JIT編譯器實(shí)現(xiàn)了對(duì)組件的充分使用,而且經(jīng)過內(nèi)部的垃圾回收機(jī)制,可及時(shí)回收軟件運(yùn)行時(shí)不再使用的內(nèi)存資源,避免了資源浪費(fèi)和內(nèi)存泄露等缺陷。</p>
20、<p> 綜上原因,本文提出并設(shè)計(jì)了一套基于C#遠(yuǎn)程液位監(jiān)控軟件。該軟件不但依靠.NET類庫中強(qiáng)大的類庫資源實(shí)現(xiàn)了對(duì)液位過程的實(shí)時(shí)監(jiān)測(cè)和遠(yuǎn)程控制,還利用內(nèi)部的垃圾回收機(jī)制,有效的避免了資源浪費(fèi)和內(nèi)存泄露等缺陷。在滿足企業(yè)個(gè)性化設(shè)計(jì)需求的同時(shí)還保證了測(cè)控平臺(tái)的工作性能和測(cè)控質(zhì)量,極大的提高了工業(yè)生產(chǎn)效率。</p><p> 1.3 課題研究?jī)?nèi)容及結(jié)構(gòu)安排 </p><
21、p> 組態(tài)軟件在工業(yè)控制中應(yīng)用廣泛,本文基于此研究設(shè)計(jì)了一套基于C#的遠(yuǎn)程液位監(jiān)控軟件,以彌補(bǔ)組態(tài)軟件在遠(yuǎn)程監(jiān)控領(lǐng)域的不足。論文結(jié)構(gòu)安排如下:</p><p> 第1章,描述了課題研究的背景和意義,闡述了基于C#遠(yuǎn)程液位監(jiān)控軟件的優(yōu)點(diǎn)。 </p><p> 第2章,軟件的總體設(shè)計(jì),包括軟件說明和功能介紹以及程序設(shè)計(jì)流程框圖。</p><p> 第3章,
22、相關(guān)軟件和技術(shù)的基本介紹。</p><p> 第4章,軟件各功能模塊的具體設(shè)計(jì)與實(shí)現(xiàn)。</p><p> 第5章,軟件生成與測(cè)試結(jié)果展示。</p><p> 第6章,結(jié)語與展望。</p><p> 第2章 系統(tǒng)整體結(jié)構(gòu)</p><p> 2.1 控制系統(tǒng)構(gòu)成</p><p> 為了
23、實(shí)現(xiàn)對(duì)水箱液位參數(shù)的精確測(cè)控以及實(shí)時(shí)監(jiān)視和記錄。本文設(shè)計(jì)了一套水箱液位監(jiān)控系統(tǒng),此監(jiān)控系統(tǒng)采用計(jì)算機(jī)(PC)作為控制器,變頻器作為執(zhí)行器進(jìn)行構(gòu)建。監(jiān)控系統(tǒng)結(jié)構(gòu)圖如圖2.1所示。</p><p> 圖2.1 水箱液位監(jiān)控系統(tǒng)結(jié)構(gòu)圖</p><p> 在此系統(tǒng)中,液位變送器LT101使用測(cè)量范圍為0~60cm的阻壓式液位(壓力)變送器,將檢測(cè)出來的水箱液位信號(hào)轉(zhuǎn)變?yōu)?~20mA標(biāo)準(zhǔn)電信號(hào)。
24、控制器LIC101采用PC機(jī),用組態(tài)王KingVIEW6.55開發(fā)監(jiān)控軟件,并用C#編寫可供組態(tài)王KingVIEW6.55使用的遠(yuǎn)程監(jiān)控控件。A/D與D/A分別選用ADAM5018模塊和ADAM5060模塊,可經(jīng)過RS232總線與計(jì)算機(jī)進(jìn)行通訊。變頻器采用西門子G110變頻器,用來獲取計(jì)算機(jī)發(fā)送經(jīng)ADAM5060轉(zhuǎn)換后的4~20mA控制信號(hào),并完成變頻調(diào)速(頻率范圍為0~50Hz)進(jìn)而驅(qū)動(dòng)水泵改變管路中的水流量,達(dá)到調(diào)節(jié)水箱液位的目的&
25、lt;/p><p> ADAM5018/5060控制模塊體積較小,易于集成,且擁有一個(gè)獨(dú)立的嵌入式的RS232傳輸卡, 可通過RS232與PC機(jī)進(jìn)行通信。底板上有4個(gè)插槽,能夠插接ADAM5018/5060的I/O 模塊, 從而完成快速數(shù)據(jù)的收集與控制, 因而ADAM5018/5060模塊很適宜該系統(tǒng)。</p><p> 2.2 測(cè)控軟件構(gòu)成</p><p> 2
26、.2.1 相關(guān)技術(shù)介紹</p><p><b> ?。?).NET框架</b></p><p> 軟件基于.NET框架的VS2010編程環(huán)境設(shè)計(jì),.NET是一個(gè)由 Microsoft .NET Framework SDK中包括的類、值類型和接口構(gòu)成的庫。該庫直接訪問系統(tǒng)功能,是組成.NET Framework程序、組件及控件的基礎(chǔ)。</p><p
27、><b> ?。?)C/S結(jié)構(gòu)</b></p><p> 軟件遵循C/S結(jié)構(gòu),設(shè)計(jì)了服務(wù)器和客戶端兩大塊。該結(jié)構(gòu)可以充分利用硬件的優(yōu)點(diǎn),將任務(wù)合理安排到客戶端和服務(wù)器,大大減少了系統(tǒng)整體的通信成本。C/S 結(jié)構(gòu)的根本原理是將大的任務(wù)分解為多個(gè)子任務(wù),由多臺(tái)計(jì)算機(jī)協(xié)作完成。其工作模式如圖2.2所示:</p><p> 圖2.2 C/S結(jié)構(gòu)工作模式</p&
28、gt;<p> C/S構(gòu)架的長(zhǎng)處是能夠充分利用客戶端的應(yīng)對(duì)能力,很多任務(wù)能夠在客戶端處理后再轉(zhuǎn)交給服務(wù)器。這樣可以大大提高客戶端的響應(yīng)速度。具體如下兩點(diǎn)優(yōu)勢(shì):</p><p> ?。?)服務(wù)器處理數(shù)據(jù)負(fù)擔(dān)較輕。</p><p> ?。?)數(shù)據(jù)的儲(chǔ)存管理能力較為透明。</p><p> (3)SOCEKT類</p><p>
29、 服務(wù)器和客戶端依靠強(qiáng)大的SOCKET類建立連接。完成液位過程數(shù)據(jù)采集后的傳輸工作,將遠(yuǎn)端設(shè)備的數(shù)據(jù)實(shí)時(shí)可靠的傳輸?shù)椒?wù)器端進(jìn)行檢測(cè)和紀(jì)錄,同時(shí)服務(wù)器也可發(fā)送數(shù)據(jù)到客戶端,對(duì)遠(yuǎn)程液位設(shè)備進(jìn)行調(diào)控。Socket也稱"套接字",用來描繪IP地址和端口,是個(gè)通信鏈的句柄。在Internet上的主機(jī)通常都會(huì)運(yùn)行多個(gè)應(yīng)用軟件,并且提供多種服務(wù)。而每個(gè)服務(wù)程序都會(huì)構(gòu)建相應(yīng)的SOCKET與端口一一對(duì)應(yīng),從而讓不同端口擁有不同服務(wù)。
30、Socket本質(zhì)上供應(yīng)了過程通信的端點(diǎn)。Socket連接過程能夠分為三步:服務(wù)器偵聽、確認(rèn)連接和客戶端申請(qǐng)。</p><p> (1)服務(wù)器偵聽:服務(wù)器端socket不是定位詳細(xì)的客戶端socket,而是處于等候連接的狀況,實(shí)時(shí)監(jiān)測(cè)網(wǎng)絡(luò)狀況。</p><p> ?。?)客戶端申請(qǐng):是指由客戶端提出連接申請(qǐng),要連接的目標(biāo)是服務(wù)器端的套接字。因此,客戶端的socket首先得描繪它所要連接的服
31、務(wù)器,確認(rèn)服務(wù)器端socket的IP地址和端口號(hào),進(jìn)而向服務(wù)器端提出連接申請(qǐng)。</p><p> ?。?)確認(rèn)連接:指當(dāng)服務(wù)器端socket監(jiān)聽到客戶端socket的連接申請(qǐng)時(shí),它會(huì)回應(yīng)客戶端socket的申請(qǐng),創(chuàng)建一個(gè)新的線程,將服務(wù)器端socket的敘述發(fā)給客戶端,當(dāng)客戶端確定了此敘述,就會(huì)成功握手建立連接。而服務(wù)器端socket還將處于監(jiān)聽狀態(tài),等待接收其他客戶端socket的連接申請(qǐng)。</p>
32、<p> 2.2.2 程序流程框圖</p><p> 系統(tǒng)根據(jù)C/S架構(gòu),分別創(chuàng)建服務(wù)器和客戶端。服務(wù)器首先創(chuàng)建socket()套接字,利用bind()方法綁定本地IP和端口,用listen()方法監(jiān)聽端口請(qǐng)求,。偵聽到端口有連接申請(qǐng)時(shí),調(diào)用accept()方法接受請(qǐng)求,而后用receive()/send()方法對(duì)數(shù)據(jù)進(jìn)行讀/寫操作,傳輸完成時(shí)使用close()函數(shù)關(guān)閉服務(wù)器。同樣客戶端也先創(chuàng)建
33、socket()套接字,獲取要連接服務(wù)器的IP和端口,使用connect()方法發(fā)送連接請(qǐng)求,而后使用receive()/send()函數(shù)進(jìn)行數(shù)據(jù)的讀/寫,傳輸完成時(shí)使用close()函數(shù)關(guān)閉客戶端。系統(tǒng)程序框圖如圖2.3所示:</p><p> 圖2.3系統(tǒng)程序框圖</p><p><b> 2.3 本章小結(jié)</b></p><p>
34、本章描述了遠(yuǎn)程液位監(jiān)控系統(tǒng)的整體架構(gòu)設(shè)計(jì)。包括液位監(jiān)控系統(tǒng)的各部分組成,監(jiān)控軟件設(shè)計(jì)所涉及的相關(guān)技術(shù)介紹,如:.NET框架、C/S結(jié)構(gòu)和SOCKET編程等,以及系統(tǒng)設(shè)計(jì)的程序框圖說明。</p><p> 第3章 監(jiān)控軟件程序?qū)崿F(xiàn)</p><p> 3.1 軟件設(shè)計(jì)方案</p><p> 監(jiān)控軟件設(shè)計(jì)的核心在于服務(wù)器和客戶端之間的實(shí)時(shí)通信。本文提供了兩種通信協(xié)
35、議,分別是面向連接的TCP/IP協(xié)議和無連接的UDP協(xié)議,然而在工業(yè)控制中必須保證數(shù)據(jù)傳輸?shù)目煽啃?,因此我們選擇了安全性高的TCP/IP協(xié)議作為通訊協(xié)議。此外本文還提供了同步通信和異步異步通信兩種模式可供選擇。同步通信屬于串行通信,用次模式,要求客戶端在發(fā)送一條請(qǐng)求后,必須等到服務(wù)器做出相應(yīng)回應(yīng),才能夠發(fā)送下一條請(qǐng)求。異步通信屬于并行通信,此模式下客戶端發(fā)送一條請(qǐng)求之后,不必等到服務(wù)器做出相應(yīng)回應(yīng)就可發(fā)送下一條請(qǐng)求。在工業(yè)控制中,往往需
36、要保證數(shù)據(jù)傳輸?shù)膶?shí)時(shí)性,同步通信模式顯然不符合要求,因此我們選擇能實(shí)時(shí)傳輸?shù)漠惒酵ㄐ拍J健?lt;/p><p><b> 3.2 服務(wù)器設(shè)計(jì)</b></p><p> 3.2.1 界面設(shè)計(jì)</p><p> 為了方便演示與測(cè)試,創(chuàng)建Windows窗體應(yīng)用程序,進(jìn)行軟件設(shè)計(jì)。而要生成ActiveX控件則需要?jiǎng)?chuàng)建Windows控件庫項(xiàng)目,但兩者界
37、面設(shè)計(jì)的方法一致(注:該服務(wù)器界面以及下章的客戶端界面僅為測(cè)試通信使用,作為Active控件發(fā)布的界面數(shù)據(jù)無需手動(dòng)輸入,數(shù)據(jù)采集完成后直接存儲(chǔ)到內(nèi)部Buffer進(jìn)行發(fā)送。而正式的工業(yè)液位監(jiān)控界面由組態(tài)王設(shè)計(jì),本文不介紹)。創(chuàng)建好項(xiàng)目后,打開工具箱,拖出我們所需的工具控件如:Lable、Button、TextBox等進(jìn)行界面設(shè)計(jì),之后修改其對(duì)應(yīng)的屬性,雙擊后則可進(jìn)行其他部分的代碼編寫。最終界面如圖3.1所示。</p><
38、;p> 圖3.1 server界面設(shè)計(jì)</p><p> 3.2.2 Socket編程</p><p> Microsoft.Net Framework 為程序訪問Internet實(shí)現(xiàn)了可分層、可擴(kuò)展的網(wǎng)絡(luò)服務(wù),其命名空間System.Net和System.Net.Sockets包含大量的類能夠便于網(wǎng)絡(luò)通訊程序的開發(fā)。所以在編寫前應(yīng)該添加using System.Net、usi
39、ng System.Net.Sockets和using System.Threading三個(gè)命名空間。具體編程可分為以下步驟:</p><p> ?。?)建立服務(wù)器連接</p><p> 首先要?jiǎng)?chuàng)建Socket對(duì)象,使用Socket類的構(gòu)造方法實(shí)現(xiàn):</p><p> Socket listener = new Socket(AddressFamily.Inte
40、rNetwork,SocketType.Stream, ProtocolType.Tcp);</p><p> 參數(shù)如下:AddressFamily:Socket使用的尋址方案;SocketType:Socket類型;ProtocolType:Socket使用的協(xié)議,這里所用的是TCP/IP協(xié)議。</p><p> 當(dāng)創(chuàng)建Socket后,服務(wù)器端則要通過Bind()方法綁定所指定的端口
41、,使Socket和一個(gè)本地終端相聯(lián)。這里在服務(wù)器端可設(shè)置兩種方式進(jìn)行連接,一種是DNS創(chuàng)建域名接連的方式:</p><p> IPHostEntry ipHostInfo = Dns.Resolve(Dns.GetHostName());</p><p> 另一種是IP地址的連接方式:</p><p> IPAddress ipAddress = ipHost
42、Info.AddressList[0];</p><p> 這里是系統(tǒng)自動(dòng)獲取本機(jī)IP,也可以手動(dòng)輸入IP地址方法如下:</p><p> IPAddress ipAddress = IPAddress.Parse("127.0.0.1");</p><p> 這里采取IP地址連接的方式,設(shè)置好IP地址和端口號(hào)后使用Bind()方法進(jìn)行綁定
43、:</p><p> IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 11000);</p><p> listener.Bind(localEndPoint);</p><p> 然后通過Listen方法監(jiān)聽該端口上的連接申請(qǐng),當(dāng)監(jiān)聽到端口的連接申請(qǐng)后。同步模式時(shí),服務(wù)器調(diào)用Accept方法允許連接申
44、請(qǐng)。異步模式時(shí),服務(wù)器能夠調(diào)用BeginAccept方法和EndAccept方法實(shí)現(xiàn)與客戶端的通信。BeginAccept在異步模式下嘗試連接,它準(zhǔn)許其余進(jìn)程直接運(yùn)行,而不必等候連接建立。在使用BeginAccept方法之前,必需調(diào)用Listen方法來監(jiān)聽連接申請(qǐng),BeginAccept的函數(shù)原型為:</p><p> BeginAccept(AsyncCallback AsyncCallback, Ojbec
45、t state);</p><p> 這里AsyncCallBack:代表回調(diào)函數(shù);state:代表狀態(tài)信息,必須確保state中包含socket的句;調(diào)用BeginAccept方法的根本流程是:1、建立本機(jī)終節(jié)點(diǎn),并建立新的socket與本機(jī)終節(jié)點(diǎn)進(jìn)行綁定;2、在端口上監(jiān)聽是否有新的連接申請(qǐng);3、申請(qǐng)開始接入新的連接,將其傳入Socket的實(shí)例或者StateOjbect的實(shí)例。調(diào)用BeginAccept()方
46、法完成后,當(dāng)有新的連接產(chǎn)生,就會(huì)使用回調(diào)函數(shù),此回調(diào)函數(shù)一定得包含用于終結(jié)接入連接操作的EndAccept()方法,其原型為:</p><p> Socket EndAccept(IAsyncResult iar);</p><p> 那么服務(wù)器構(gòu)建代碼如下:</p><p> public static void StartListening()</p
47、><p><b> {</b></p><p> IPAddress local = IPAddress.Parse("127.0,0,1");</p><p> IPEndPoint iep = new IPEndPoint(local,13000);</p><p> Socket liste
48、ner = new Socket(AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp);</p><p> server.Bind(iep);</p><p> server.Listen(20);</p><p> server.BeginAccecpt(new AsyncCallba
49、ck(Accept), listener);</p><p><b> }</b></p><p> void Accept(IAsyncResult iar)</p><p><b> {</b></p><p> Socket MyServer = (Socket)iar.AsyncSt
50、ate;</p><p> Socket service = MyServer.EndAccept(iar);</p><p><b> }</b></p><p> ?。?)發(fā)送與接收數(shù)據(jù)</p><p> 在創(chuàng)建了套接字的連接后,就能夠使服務(wù)器端和客戶端之間進(jìn)行數(shù)據(jù)通信了。異步通信用BeginSend和EndS
51、end方法來完成數(shù)據(jù)發(fā)送。在使用BeginSend方法前要確認(rèn)雙方都已成功連接,不然會(huì)出錯(cuò)誤。BeginSend方法原型為:</p><p> Socket.BeginSend(Byte[],Int32, Int32, SocketFlags, AsyncCallback, Object);</p><p> 參數(shù)如下:buffer:Byte類型的數(shù)組,包含將發(fā)送的數(shù)據(jù);offset:
52、buffer參數(shù)中發(fā)送數(shù)據(jù)的起始位置,該位置從零開始計(jì)數(shù);size:將發(fā)送的字節(jié)數(shù);socketFlags:SocketFlags值的按位組合;callback:AsyncCallback委托;state:一個(gè)對(duì)象,包含此申請(qǐng)的狀態(tài)消息;返回值:調(diào)用異步通訊發(fā)送IAsyncResult。創(chuàng)建一個(gè)完成 AsyncCallback 的回調(diào)方法并將名字傳入 BeginSend 方法。state 參數(shù)一定得包含用來通訊的連接。如果回調(diào)要求更多信
53、息,那么可構(gòu)建一個(gè)小型的類用于存儲(chǔ)Socket和其他必須的信息。經(jīng)過state 參數(shù)將此類的一個(gè)實(shí)例傳遞給 BeginSend 方法?;卣{(diào)方法應(yīng)使用EndSend方法。當(dāng)應(yīng)用程序使用 BeginSend方法時(shí),系統(tǒng)將運(yùn)用一個(gè)單獨(dú)的線程完成特定的回調(diào)方法,并阻止 EndSend,直到Socket發(fā)送了申請(qǐng)的字節(jié)數(shù)或引發(fā)了異常。相關(guān)代碼如下:</p><p> private static void Send(So
54、cket handler, String data)</p><p><b> { </b></p><p> byte[] byteData = Encoding.ASCII.GetBytes(data); </p><p> handler.BeginSend(byteData,0,byteData.Length,0,ne
55、w AsyncCallback(SendCallback), handler);</p><p><b> }</b></p><p> private static void SendCallback(IAsyncResult ar)</p><p><b> {</b></p><p>&
56、lt;b> try</b></p><p><b> { </b></p><p> Socket handler = (Socket)ar.AsyncState; </p><p> int bytesSent = handler.EndSend(ar);</p><p> ha
57、ndler.Shutdown(SocketShutdown.Both);</p><p> handler.Close();</p><p><b> }</b></p><p> catch (Exception e)</p><p><b> {</b></p><p
58、><b> }</b></p><p><b> }</b></p><p> 異步通信用BeginReceive和EndReceive方法來接收數(shù)據(jù),其BeginReceive方法原型為:</p><p> Socket.BeginReceive(Byte[],Int32,Int32,SocketFlags
59、,AsyncCallback,Object)</p><p> 參數(shù)如下:buffer:Byte類型的數(shù)組,它是保存接收到的數(shù)據(jù)的位置;offset:buffer參數(shù)中保存所接收數(shù)據(jù)的位置,該位置從零開始計(jì)數(shù);size:要接收的字節(jié)數(shù);socketFlags:SocketFlags值的按位組合;callback:一個(gè)AsyncCallback委托,它援用操作完成時(shí)要應(yīng)用的方法;state:一個(gè)用戶定義對(duì)象,其中
60、寶庫接收操作的相干信息。操作完成時(shí),此對(duì)象會(huì)傳軟EndReceive方法;返回值:使用異步方法讀取IAsyncResult。異步BeginReceive操作應(yīng)使用EndReceive方法完成。一般該方法由callback 實(shí)現(xiàn)。在操作完成前方法不會(huì)進(jìn)入阻塞狀態(tài)。如需一直阻塞到操作完成時(shí)則應(yīng)使用Receive方法進(jìn)行重載。相關(guān)代碼如下:</p><p> private static void Receive(S
61、ocket client)</p><p><b> {</b></p><p><b> try</b></p><p><b> { </b></p><p> StateObject state = new StateObject();</p>&l
62、t;p> state.workSocket = client; </p><p> client.BeginReceive(state.buffer,0,StateObject.BufferSize,0,new AsyncCallback(ReceiveCallback), state);</p><p><b> }</b></p>
63、<p> catch (Exception e)</p><p><b> {</b></p><p><b> }</b></p><p><b> }</b></p><p> private static void ReceiveCallback(IA
64、syncResult ar)</p><p><b> {</b></p><p><b> try</b></p><p><b> { </b></p><p> StateObject state = (StateObject)ar.AsyncState;<
65、;/p><p> Socket client = state.workSocket; </p><p> int bytesRead = client.EndReceive(ar);</p><p> if (bytesRead > 0)</p><p><b> { </b></p>
66、<p> state.sb.Append(Encoding.ASCII.GetString(state.buffer,0,bytesRead); </p><p> client.BeginReceive(state.buffer,0,StateObject.BufferSize,0,new AsyncCallback(ReceiveCallback), state);</p>
67、<p><b> }</b></p><p><b> else</b></p><p><b> { </b></p><p> if (state.sb.Length > 1)</p><p><b> {</b><
68、/p><p> response = state.sb.ToString();</p><p><b> } </b></p><p> receiveDone.Set();</p><p><b> }</b></p><p><b> }</b
69、></p><p> catch (Exception e)</p><p><b> {</b></p><p><b> }</b></p><p><b> }</b></p><p> 這里對(duì)接收的數(shù)據(jù)做了一些處理,首先處理連接的
70、回調(diào)函數(shù)里獲得的通訊套接字client,然后開始接收數(shù)據(jù)。當(dāng)數(shù)據(jù)發(fā)送到緩沖區(qū)中,BeginReceive方法嘗試從buffer數(shù)組中獲取長(zhǎng)度為buffer.length的數(shù)據(jù)塊,并且返回接收到的數(shù)據(jù)量bytesRead。經(jīng)過判斷返回值bytesRead的大小來判斷數(shù)據(jù)是否傳輸完全。這里出現(xiàn)了Set()方法,引出了程序阻塞和異步中的同步問題。</p><p> .Net里提供了EventWaitHandle類來表
71、示一個(gè)線程的同步事件。EventWaitHandle即事件等待句柄,他允許線程通過操作系統(tǒng)互發(fā)信號(hào)和等待彼此的信號(hào)來達(dá)到線程同步的目的。這個(gè)類有2個(gè)子類,分別為AutoRestEevnt(自動(dòng)重置)和ManualRestEvent(手動(dòng)重置)。下面是線程同步的幾個(gè)方法:</p><p> (1)Rset方法:將事件狀態(tài)設(shè)置為非終止?fàn)顟B(tài),使得線程阻塞。這里的線程阻塞是指同意其他需要等候的線程進(jìn)行阻塞即讓含Wait
72、One()方法的線程阻塞;</p><p> (2)Set方法:將事件狀態(tài)設(shè)置終止?fàn)顟B(tài),允許一個(gè)或多個(gè)等候線程繼續(xù)。該方法發(fā)送一個(gè)信號(hào)給操作系統(tǒng),讓處于等候的某個(gè)線程從阻塞狀態(tài)轉(zhuǎn)變成繼續(xù)運(yùn)行,即WaitOne方法的線程不在阻塞;</p><p> (3)WaitOne方法:阻塞當(dāng)前線程,直到當(dāng)前的等候句柄收到信號(hào)。此方法將一直使本線程處于阻塞狀態(tài)直到收到信號(hào)為止,即當(dāng)其他非阻塞進(jìn)程使用
73、set方法時(shí)可以繼續(xù)執(zhí)行。</p><p><b> 3.3 客戶端設(shè)計(jì)</b></p><p> 3.3.1 界面設(shè)計(jì)</p><p> 客戶端界面設(shè)計(jì)方法和服務(wù)器方法相同,首先創(chuàng)建Windows窗體應(yīng)用程序,打開工具箱,拖出我們所需的工具控件如:Lable、Button、TextBox等進(jìn)行界面設(shè)計(jì),之后修改其對(duì)應(yīng)的屬性,雙擊后則可進(jìn)
74、行其他部分的代碼編寫。最終界面如圖3.2所示。</p><p> 圖3.2 client界面設(shè)計(jì)</p><p> 3.3.2 Socket編程</p><p> 客戶端的Socket編程同樣分為以下兩個(gè)步驟:</p><p> ?。?)建立客戶端連接</p><p> 首先要?jiǎng)?chuàng)建Socket對(duì)象的實(shí)例,可以經(jīng)
75、過Socket類的構(gòu)造方法來實(shí)現(xiàn):</p><p> Socket socket= new Socket(AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp);</p><p> 然后獲取所要連接的服務(wù)器IP地址和端口:</p><p> IPAddress ip=IPAddress.P
76、arse("127.0.0.1");</p><p> IPEndPoint iep=new IPEndPoint(ip,11000);</p><p> 而后在同步模式中,客戶端調(diào)用Connect方法連接服務(wù)器。在異步模式下,客戶端則使用BeginConnect方法和EndConnect方法來完成與服務(wù)器的連接,BeginConnect方法原型為:</p&g
77、t;<p> Socket.BeginConnect(EndPoint, AsyncCallback, Object);</p><p> 其參數(shù):remoteEP:表示遠(yuǎn)程主機(jī)IP地址和端口號(hào);callback:AsyncCallback委托;state:一個(gè)對(duì)象,它包含此請(qǐng)求的狀態(tài)信息;返回值:IAsyncResult,它引用異步連接。在調(diào)用BeginConnect方法時(shí)必須注冊(cè)相應(yīng)的回調(diào)函
78、數(shù)并且至少傳遞一個(gè)Socket的實(shí)例給state參數(shù),以保證EndConnect方法中能使用原始的套接字。調(diào)用代碼如下:</p><p> private static void StartClient()</p><p><b> {</b></p><p> Socket socket=new Socket(AddressFamily
79、.InterNetwork,SocketType.Stream,ProtocolType.Tcp);</p><p> IPAddress ip=IPAddress.Parse("127.0.0.1");</p><p> IPEndPoint iep=new IPEndPoint(ip,13000);</p><p> socket.Be
80、ginConnect(iep, new AsyncCallback(Connect),socket);</p><p><b> }</b></p><p> void Connect(IAsyncResult iar)</p><p><b> {</b></p><p> Socket
81、client=(Socket)iar.AsyncState;</p><p><b> try</b></p><p><b> {</b></p><p> client.EndConnect(iar);</p><p><b> }</b></p>&
82、lt;p> catch (Exception e)</p><p><b> {</b></p><p><b> }</b></p><p><b> }</b></p><p> ?。?)發(fā)送與接收數(shù)據(jù)</p><p> 在建立了套接
83、字的連接后,就可以服務(wù)器端和客戶端之間進(jìn)行數(shù)據(jù)通信了。異步通信用BeginSend和EndSend方法來負(fù)責(zé)數(shù)據(jù)的發(fā)送。前面已經(jīng)介紹,這里不再贅述。</p><p><b> 3.4 本章小結(jié)</b></p><p> 本章先是討論了監(jiān)控軟件的設(shè)計(jì)方案,選擇了可靠性高的TCP/IP協(xié)議和實(shí)效性高的異步通信模式。然后分別講解了服務(wù)器和客戶端的實(shí)現(xiàn)代碼,包括界面設(shè)計(jì)和
84、SOCKET編程設(shè)計(jì)。</p><p> 第4章 ActiveX控件生成與發(fā)布</p><p> 4.1 控件生成與發(fā)布</p><p> ActiveX控件又稱Ocx控件,用于遠(yuǎn)程液位監(jiān)控系統(tǒng)中組態(tài)軟件的調(diào)用。本文中使用C#語言生成的AxtiveX控件并非真正意義上的ActiveX控件,而是.dll控件,不過足夠滿足VS2010,Web等多種軟件調(diào)用。要生
85、成可供組態(tài)軟件調(diào)用的Ocx控件,還需做不同的處理。因此本文不做描述,僅介紹C#環(huán)境下生成.dll控件的方法,具體步驟如下:</p><p> 創(chuàng)建一個(gè)應(yīng)用程序解決方案,并添加一個(gè)Windows控件庫項(xiàng)目,如圖4.1</p><p> 圖4.1 創(chuàng)建解決方案</p><p> ?。?)更改“項(xiàng)目屬性-應(yīng)用程序-程序集信息”設(shè)置,勾選“使程序集 COM 可見”,如圖
86、4.2</p><p> 圖4.2 更改項(xiàng)目屬性</p><p> ?。?)更改“項(xiàng)目屬性-生成”屬性,勾選“為 COM Interop 注冊(cè)”(此處若是在debug狀態(tài)下修改的,那在調(diào)到release狀態(tài)下還應(yīng)該再設(shè)置一次)如圖4.3</p><p> 圖4.3 更改項(xiàng)目屬性</p><p> ?。?)修改AssemblyInfo.cs
87、文件,增加[assembly: AllowPartially</p><p> TrustedCallers()]項(xiàng)(需要使用System.Security名稱空間),如圖4.4所示</p><p> 圖4.4 修改AssemblyInfo.cs文件</p><p> ?。?)添加一個(gè)Windows用戶控件</p><p> (6)為控
88、件類增加GUID,這個(gè)編號(hào)將用于B/S系統(tǒng)的客戶端應(yīng)用時(shí)調(diào)用(能夠使用 工具-創(chuàng)建GUID 菜單創(chuàng)建一個(gè)GUID,再復(fù)制),如圖4.5所示</p><p> 圖4.5 添加GUID</p><p> (7)為了使ActiveX控件獲取客戶端的信任,控件類還需要完成一個(gè)名為“IObjectSafety”的接口,要建立該接口(注意,不能修改該接口的GUID值),IObjectSafety.
89、cs代碼如下:</p><p> ?。?)然后在控件類中繼承并完成該接口,代碼如下</p><p> ?。?)引用封裝的FK.dll,代碼如下</p><p> ?。?0)進(jìn)行封裝,代碼如下</p><p> ?。?1)打包發(fā)布ActiveX,與普通的Windows Form應(yīng)用程序的安裝設(shè)置幾乎一樣,單有一個(gè)地方需要注意,將前面創(chuàng)建的用戶控
90、件項(xiàng)目作為主輸出項(xiàng)目,并設(shè)定其Register屬性為vsdrpCOM,如圖4.6</p><p><b> 圖4.6 安裝部署</b></p><p> ?。?2)將項(xiàng)目文件添加。</p><p> ?。?3)在系統(tǒng)文件夾system32文件夾中將msiexec.exe(卸載控件時(shí)用到)地址找到也增加至上面文件夾</p><
91、;p> (14)在“用戶的程序菜單”中,新建文件夾后加入主程序與msiexec.exe快捷方式。</p><p> ?。?5)點(diǎn)擊項(xiàng)目安裝工程,在屬性中將ProductCode復(fù)制,點(diǎn)擊msiexec.exe快捷方式,在屬性Arguments中加入“/x+一個(gè)空隔+ProductCode”。</p><p> ?。?6)生成項(xiàng)目,打包文件就完成了,打開..\Debug看到生成了2個(gè)
92、文件,一個(gè)是xx.exe,一個(gè)是xx.msi,運(yùn)行exe安裝到系統(tǒng)。</p><p><b> 4.2 本章小結(jié)</b></p><p> 本章開頭提出了用C#語言生成的AxtiveX控件并非真正意義上的ActiveX控件,而是.dll控件,且能夠滿足VS2010,Web等多種軟件調(diào)用。要生成可供組態(tài)軟件調(diào)用的Ocx控件,還需做不同的處理,本文不作介紹。然后詳細(xì)介
93、紹了.dll控件的生成配置和發(fā)布設(shè)置方法。</p><p> 第5章 軟件生成與測(cè)試</p><p> 5.1 軟件生成及測(cè)試</p><p> 運(yùn)行客戶端,生成server界面,點(diǎn)擊“啟動(dòng)服務(wù)器”按鈕,彈出“服務(wù)器已啟動(dòng),正在等待連接……”對(duì)話框,點(diǎn)擊確定,偵聽綁定端口的客戶端請(qǐng)求。</p><p> 圖5.1 啟動(dòng)服務(wù)器<
94、/p><p> 運(yùn)行客戶端,生成client界面。在“IP”和“端口”欄輸入要連接服務(wù)器的IP地址和端口號(hào),這里我們采用本地IP:127.0.0.1和預(yù)先設(shè)定的端口號(hào):9050進(jìn)行測(cè)試。點(diǎn)擊連接,連接成功會(huì)彈出“連接成功,正在獲取測(cè)試信息……”窗口,服務(wù)器端也會(huì)彈出請(qǐng)求連接的客戶端IP和端口號(hào)等信息,連接失敗。</p><p> 圖5.2 客戶端成功連接</p><p&
95、gt; 圖5.3 服務(wù)器成功連接</p><p> 連接成功后,服務(wù)器會(huì)向客戶端發(fā)送一條“welcome here!”的測(cè)試信息以確保數(shù)據(jù)通信的通常無誤。</p><p> 圖5.4 客戶端接收測(cè)試信息</p><p> 測(cè)試成功后,服務(wù)器和客戶端可相互發(fā)送接收數(shù)據(jù),內(nèi)部設(shè)定先發(fā)送后接收的機(jī)制。例如:服務(wù)器向客戶端發(fā)送“hello!”,客戶端也可向服務(wù)器發(fā)送
96、“How are you!”等信息。</p><p> 圖5.5 服務(wù)器向客戶端發(fā)送消息</p><p> 圖5.6客戶端向服務(wù)器發(fā)送消息</p><p> 通信完成后,點(diǎn)擊“關(guān)閉服務(wù)器”會(huì)彈出確認(rèn)關(guān)閉的選擇窗口,選擇“是”則關(guān)閉“否”則取消??蛻舳讼嗤?lt;/p><p><b> 圖5.7關(guān)閉服務(wù)器</b><
97、;/p><p><b> 圖5.8關(guān)閉客戶端</b></p><p><b> 5.2 本章小結(jié)</b></p><p> 本章展示軟件測(cè)試過程。測(cè)試表明該軟件能夠?qū)崿F(xiàn)對(duì)液位過程的實(shí)時(shí)監(jiān)測(cè)和遠(yuǎn)程控制,還能有效的避免了資源浪費(fèi)和內(nèi)存泄露等缺陷。在滿足企業(yè)個(gè)性化設(shè)計(jì)需求的同時(shí)還保證了測(cè)控平臺(tái)的工作性能和測(cè)控質(zhì)量,極大的提高了
98、工業(yè)生產(chǎn)效率。</p><p> 第6章 結(jié)語與展望</p><p> 本文利用VS2012.NET編程平臺(tái)設(shè)計(jì)了一套基于C#遠(yuǎn)程液位監(jiān)控軟件,可確保遠(yuǎn)程數(shù)據(jù)傳輸?shù)膶?shí)時(shí)性和有效性,操作簡(jiǎn)便且界面友好,彌補(bǔ)了傳統(tǒng)組態(tài)軟件在工業(yè)應(yīng)用中的不足。該系統(tǒng)極大的滿足了現(xiàn)代工業(yè)控制中的遠(yuǎn)程監(jiān)控的要求,為提要企業(yè)生產(chǎn)效率和市場(chǎng)競(jìng)爭(zhēng)力提供了有力的保障。然而目前軟件僅支持遠(yuǎn)程客戶端和服務(wù)器之間進(jìn)行點(diǎn)對(duì)點(diǎn)
99、通信,若實(shí)現(xiàn)多端口多服務(wù)器之間進(jìn)行通信,可滿足工業(yè)液位過程監(jiān)控的系統(tǒng)化管理,對(duì)提高企業(yè)生產(chǎn)效率有著重大意義。</p><p><b> 參考文獻(xiàn)</b></p><p> [1] 顧洪軍,張佐,吳秋峰.網(wǎng)絡(luò)控制系統(tǒng)的實(shí)時(shí)特性分析及數(shù)據(jù)傳輸技術(shù)[J].計(jì)算機(jī)工程技術(shù)與應(yīng)用,20010:38-40 </p><p> [2] 王峰,張宏偉,秦
100、霆鎬等.嵌入式Internet技術(shù)及其實(shí)現(xiàn)方案[J].微計(jì)算機(jī)信息,2003</p><p> 19(12):61一62</p><p> [3] LeeKB, SchneemanRD. Interne- t based Distributed Measurement and Control Applications [J].IEEE Instrumentation&Measu
101、rement Magazine, 1999, (6).</p><p> [4] 邊寧寧,費(fèi)敏銳.一種基于工業(yè)以太網(wǎng)的控制系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].儀器儀表學(xué)報(bào),2003,8(4):366-369</p><p> [5] 陳元謀,吳長(zhǎng)奇.基于S ocket的遠(yuǎn)程監(jiān)控的通信系統(tǒng)實(shí)現(xiàn)[J].計(jì)算機(jī)安全,2011(3):60-62</p><p> [6] 孫海民.
102、精通Windows Sockets網(wǎng)絡(luò)開發(fā)一基于Visual C++實(shí)現(xiàn)[M].人民郵電出版社,</p><p> 2008:101一160</p><p> [7] 謝家興,王建,劉洪山等.基于TCP/IP數(shù)據(jù)通信系統(tǒng)設(shè)計(jì)[J].軟件導(dǎo)刊,2010, 9(3):10-12</p><p> [8] 李大連.基于TCP/IP網(wǎng)絡(luò)的機(jī)房環(huán)境監(jiān)控系統(tǒng)設(shè)計(jì)[J].計(jì)
103、算機(jī)與現(xiàn)代化,2011(2) :97-99</p><p> [9] 茹金平.基于Internet的遠(yuǎn)程監(jiān)控系統(tǒng)設(shè)計(jì)[J].電腦知識(shí)與技術(shù),2010(6):7516-7517</p><p> [10] 侯其鋒,李曉華,李莎.Visual C++數(shù)據(jù)庫通用模塊開發(fā)與系統(tǒng)移植[M].清華大學(xué)出版</p><p> 社,2007(5):20117</p>
104、;<p> [11] 姚鰻.網(wǎng)絡(luò)化遠(yuǎn)程測(cè)控系統(tǒng)的網(wǎng)絡(luò)信息安全關(guān)鍵技術(shù)研究[D].碩士,西北工業(yè)大學(xué),</p><p><b> 2007</b></p><p> [12] 李想.基于ethernet+TCP/IP的現(xiàn)場(chǎng)網(wǎng)絡(luò)控制系統(tǒng)的研究[D].碩士,華北電力大學(xué),</p><p><b> 2006:23<
105、;/b></p><p> [13] 沈鑫刻.計(jì)算機(jī)網(wǎng)絡(luò)[M].清華大學(xué)出版社,2008</p><p><b> 致 謝</b></p><p> 通過此次完成畢業(yè)設(shè)計(jì)的過程,讓我明白了畢業(yè)設(shè)計(jì)是對(duì)我們大學(xué)四年學(xué)習(xí)成果的一次鞏固和檢驗(yàn)。同時(shí)極大的鍛煉了我們個(gè)人獨(dú)立完成項(xiàng)目的能力以及論文設(shè)計(jì)的能力,為以后面對(duì)工作或者繼續(xù)深造打下
106、了良好的基礎(chǔ)。</p><p> 本次設(shè)計(jì)能夠順利完成,首先我要感謝丁躍澆老師。他在我設(shè)計(jì)的過程中給予了我極大的幫助和支持。每有問題,老師總是耐心的解答,使我能夠從各種困惑中走出來,繼續(xù)完成后續(xù)工作。再則我還要感謝湖南理工學(xué)院創(chuàng)新基地實(shí)驗(yàn)室,這里是我成長(zhǎng)和進(jìn)步的地方,見證者我能力成長(zhǎng)的地方,它為我提供了良好的設(shè)備和學(xué)習(xí)的環(huán)境。同時(shí)我還要感謝我的寢室同學(xué),他們?cè)谖颐曰蟮臅r(shí)候?yàn)槲覠o私的提供了幫助。最后還要感謝相關(guān)資
107、料的編著者和給予我們支持的社會(huì)各界人士,感謝您們?yōu)槲覀兲峁┮粋€(gè)良好的環(huán)境,使本次設(shè)計(jì)圓滿完成。</p><p> 最后祝愿母校能夠越來越好,同學(xué)們能夠心想事成,考上自己理想的學(xué)校,得到自己理想的工作。</p><p><b> 附錄 軟件代碼</b></p><p><b> 服務(wù)器:</b></p>
108、<p> using System;</p><p> using System.Collections.Generic;</p><p> using System.ComponentModel;</p><p> using System.Data;</p><p> using System.Drawing;<
109、/p><p> using System.Linq;</p><p> using System.Text;</p><p> using System.Windows.Forms;</p><p> using System.Net;</p><p> using System.Net.Sockets;<
110、/p><p> using System.Threading;</p><p> namespace text_server</p><p><b> {</b></p><p> public partial class Form1 : Form</p><p><b> {&l
111、t;/b></p><p> public Form1()</p><p><b> {</b></p><p> InitializeComponent();</p><p><b> }</b></p><p> public class StateObj
112、ect</p><p><b> {</b></p><p> public Socket workSocket = null;</p><p> public const int BufferSize = 1024;</p><p> public byte[] buffer = new byte[Buffer
113、Size];</p><p> public StringBuilder sb = new StringBuilder();</p><p><b> }</b></p><p> public static ManualResetEvent allDone </p><p> = new ManualReset
114、Event(false);</p><p> Socket listener = new Socket(AddressFamily.</p><p> InterNetwork, SocketType.Stream, ProtocolType.Tcp);</p><p> Socket handler;</p><p> StateO
115、bject state = new StateObject();</p><p> private String content_receive = String.Empty;</p><p> private String content_send = String.Empty;</p><p> private Thread demoThread = nu
116、ll;</p><p> delegate void SetTextCallback(string text);</p><p> /// <summary></p><p> /// 啟動(dòng)服務(wù)器準(zhǔn)備發(fā)送接收</p><p> /// </summary></p><p> /// &
117、lt;param name="sender"></param></p><p> /// <param name="e"></param></p><p> private void but_start_Click(object sender, EventArgs e)</p><p&
118、gt;<b> {</b></p><p> byte[] bytes = new Byte[1024];</p><p> IPAddress ipAddress = IPAddress.Parse("127.0.0.1");</p><p> IPEndPoint localEndPoint = new IPEn
119、dPoint(ipAddress, 11000);</p><p> listener.Bind(localEndPoint);</p><p> listener.Listen(100);</p><p> MessageBox.Show("服務(wù)器已啟動(dòng),正在等待連接……");</p><p> allDone.
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 基于c#平臺(tái)的短信發(fā)送軟件設(shè)計(jì)[畢業(yè)論文]
- c#課程設(shè)計(jì)—模擬抽獎(jiǎng)軟件設(shè)計(jì)
- 基于C#的數(shù)據(jù)采集上位機(jī)軟件設(shè)計(jì).pdf
- 基于c#平臺(tái)的短信發(fā)送軟件設(shè)計(jì)[開題報(bào)告]
- 基于C#的可變情報(bào)板系統(tǒng)的軟件設(shè)計(jì).pdf
- 基于c#的即時(shí)通訊軟件設(shè)計(jì)與實(shí)現(xiàn)畢業(yè)論文
- 液位測(cè)量與監(jiān)控系統(tǒng)設(shè)計(jì)畢業(yè)設(shè)計(jì)
- 基于c#平臺(tái)的短信發(fā)送軟件設(shè)計(jì)[任務(wù)書]
- 液位監(jiān)控系統(tǒng)畢業(yè)設(shè)計(jì)(外文翻譯)
- 液位監(jiān)控系統(tǒng)畢業(yè)設(shè)計(jì)(外文翻譯)
- 畢業(yè)設(shè)計(jì)論文—基于android的物聯(lián)網(wǎng)監(jiān)控手機(jī)軟件設(shè)計(jì)
- 基于c#的監(jiān)控組態(tài)軟件開發(fā)
- 基于GSM的遠(yuǎn)程液位監(jiān)控報(bào)警系統(tǒng)的設(shè)計(jì).pdf
- 基于DSP遠(yuǎn)程監(jiān)控系統(tǒng)的后端軟件設(shè)計(jì)與實(shí)現(xiàn).pdf
- 基于C#的上位機(jī)監(jiān)控組態(tài)軟件的設(shè)計(jì)與開發(fā).pdf
- 畢業(yè)設(shè)計(jì)(論文)-基于gprs模塊的軟件設(shè)計(jì)
- 基于c#的熒光分子影像控制和分析軟件設(shè)計(jì)和實(shí)現(xiàn)
- 基于C#的監(jiān)控組態(tài)軟件開發(fā).pdf
- 基于Visual C++的視頻監(jiān)控系統(tǒng)的軟件設(shè)計(jì).pdf
- 基于OPC的監(jiān)控軟件設(shè)計(jì).pdf
評(píng)論
0/150
提交評(píng)論