socket通信范文
時(shí)間:2023-03-30 03:41:55
導(dǎo)語:如何才能寫好一篇socket通信,這就需要搜集整理更多的資料和文獻(xiàn),歡迎閱讀由公務(wù)員之家整理的十篇范文,供你借鑒。
篇1
【關(guān)鍵詞】 socket 編程 網(wǎng)絡(luò)通信
計(jì)算機(jī)網(wǎng)絡(luò)時(shí)代的到來推動(dòng)了很多產(chǎn)業(yè)的發(fā)展升級(jí),將計(jì)算機(jī)網(wǎng)絡(luò)技術(shù)應(yīng)用到各行各業(yè)中是當(dāng)前的發(fā)展潮流。計(jì)算機(jī)的網(wǎng)絡(luò)具有靈活性、開放性,網(wǎng)絡(luò)本身不受企業(yè)或廠商的控制,所以在許多行業(yè)都能夠發(fā)揮其價(jià)值。網(wǎng)絡(luò)編程是應(yīng)用網(wǎng)絡(luò)發(fā)揮其價(jià)值的一個(gè)重要方式,而掌握SOCKET網(wǎng)絡(luò)編程技術(shù)能夠?qū)崿F(xiàn)網(wǎng)絡(luò)通信的效能。本文就BSD Unix網(wǎng)絡(luò)版在套接字接口之上的網(wǎng)絡(luò)通信過程展開了分析討論。
一、TCP/IP協(xié)議在分層以及應(yīng)用程序編程接口
基于TCP/IP的網(wǎng)絡(luò)能夠?yàn)閼?yīng)用程序供應(yīng)兩個(gè)常規(guī)編程接口,分別為套接字接口和傳輸層接口,套接字接口便是本文所重點(diǎn)討論的SOCKET,SOCKET是在BSD Unix系統(tǒng)的基礎(chǔ)上開發(fā)并普及開的,傳輸層接口(TLI)是AT&T公司開發(fā)出的,SOCKET API具有普遍的通用性,能夠基于多種傳輸協(xié)議運(yùn)行,當(dāng)前已經(jīng)發(fā)展成了網(wǎng)絡(luò)編程的既定事實(shí)標(biāo)準(zhǔn),所以本文就通用性只討論套接字接口編程。
二、TCP/IP提供的服務(wù)以及編程模式
套接字實(shí)際上是IP地址在附上端口編號(hào)后,IP地址的標(biāo)識(shí)網(wǎng)絡(luò)中單一主機(jī),端口編號(hào)的標(biāo)識(shí)能夠在主機(jī)之上展開工作的一個(gè)進(jìn)程,能夠系統(tǒng)化展開網(wǎng)間通信則需要建立在兩個(gè)進(jìn)程中,達(dá)成這一條件還需要共用相同的高層協(xié)議。
OSI術(shù)語里把網(wǎng)絡(luò)層下面的各分層視為通信子網(wǎng),為實(shí)現(xiàn)網(wǎng)間的進(jìn)程通信,在此基A上還要做到控制差錯(cuò)、控制流量、管理各項(xiàng)連接、排序組合數(shù)據(jù)等功能,這就需要準(zhǔn)備兩種服務(wù)方式,分別為無連接的服務(wù)和面向連接(虛電路)。
TCP/IP網(wǎng)絡(luò)應(yīng)用中,進(jìn)行通信工作的兩個(gè)進(jìn)程之間會(huì)互相產(chǎn)生作用和聯(lián)系,為用戶供應(yīng)所需求的服務(wù),然后將數(shù)據(jù)回復(fù)到客戶的結(jié)果。
三、BSD Unix套接字接口網(wǎng)間進(jìn)程的通信過程
SOCKET在TCP/IP基礎(chǔ)上所能夠提供的套接字類型主要有一下三種:
3.1流式套接字(SOCK STREAM)
流式套接字所提供的服務(wù)在連接上的應(yīng)用比較多,能夠?yàn)橛脩籼峁?zhǔn)確可靠的數(shù)據(jù)傳輸服務(wù),并且保證了數(shù)據(jù)避免出錯(cuò),同時(shí)還也能夠避免多次重復(fù)發(fā)送,數(shù)據(jù)在傳輸過程中仍保持著隊(duì)列順序,對(duì)于數(shù)據(jù)還有準(zhǔn)確的流量控制,防止了數(shù)據(jù)流超出限制值的出現(xiàn)。
3.2數(shù)據(jù)報(bào)式套接字(SOCK DGRAM)
數(shù)據(jù)報(bào)式套接字能夠?yàn)橛脩籼峁o連接服務(wù),獨(dú)立的服務(wù)包傳送出,對(duì)于錯(cuò)誤沒有保證,數(shù)據(jù)在傳輸?shù)倪^程中可能會(huì)丟失或出現(xiàn)重復(fù)發(fā)送的現(xiàn)象,另一端接受到的數(shù)據(jù)也是雜亂無序的,數(shù)據(jù)長(zhǎng)度有限制:最大為64KB,網(wǎng)絡(luò)文件系統(tǒng)中(NFS)使用的便是數(shù)據(jù)報(bào)式套接字。
3.3原始式套接字(SOCK RAW)
原始式套接字的接口要求能夠?qū)崿F(xiàn)對(duì)底層協(xié)議間的信息傳輸,比如IP、ICMP的直接訪問,這種訪問常常用在對(duì)新的協(xié)議實(shí)現(xiàn)情況以及訪問服務(wù)配置中的新設(shè)備的檢驗(yàn)工作中,通常是不會(huì)為普通用戶提供的,所以本文并未展開深入研究。
四、總結(jié)
本文針對(duì)以SOCKET在編程上的應(yīng)用展開的了分析討論,并對(duì)其在網(wǎng)絡(luò)通信功能的應(yīng)用進(jìn)行了研究。網(wǎng)絡(luò)編程是應(yīng)用網(wǎng)絡(luò)發(fā)揮其價(jià)值的一個(gè)重要方式,而掌握SOCKET網(wǎng)絡(luò)編程技術(shù)能夠?qū)崿F(xiàn)網(wǎng)絡(luò)通信的效能。本文就BSD Unix網(wǎng)絡(luò)版在套接字接口之上的網(wǎng)絡(luò)通信過程展開的研究仍不全面,需要更多的計(jì)算機(jī)網(wǎng)絡(luò)技術(shù)人員投入,深入的研究并將其應(yīng)用于網(wǎng)絡(luò)通信領(lǐng)域。
參 考 文 獻(xiàn)
[1]歐軍,吳清秀,裴云,張洪. 基于socket的網(wǎng)絡(luò)通信技術(shù)研究[J]. 網(wǎng)絡(luò)安全技術(shù)與應(yīng)用,2011,07:19-21.
[2]王遠(yuǎn)洋,周淵平,郭煥麗. Linux下基于socket多線程并發(fā)通信的實(shí)現(xiàn)[J]. 微計(jì)算機(jī)信息,2009,15:70-72.
[3]王志偉,沈杰峰,郭啟峰,唐俊. 基于Socket的GPRS遠(yuǎn)程數(shù)據(jù)采集方法[J]. 西華大學(xué)學(xué)報(bào)(自然科學(xué)版),2006,01:37-39+93+3.
篇2
關(guān)鍵詞:套接字;嵌入式Linux;網(wǎng)絡(luò)通信;TCP/IP協(xié)議
中圖分類號(hào):G642.0 文獻(xiàn)標(biāo)志碼:A 文章編號(hào):1674-9324(2017)30-0274-02
一、引言
隨著數(shù)字信息技術(shù)和網(wǎng)絡(luò)技術(shù)的高速發(fā)展,嵌入式技術(shù)已經(jīng)廣泛應(yīng)用到各個(gè)領(lǐng)域、各類產(chǎn)業(yè)以及人們的日常生活等各方面,成為引人矚目的熱點(diǎn)。為適應(yīng)嵌入式和網(wǎng)絡(luò)應(yīng)用需求,標(biāo)準(zhǔn)的一種或多種網(wǎng)絡(luò)通信接口成為嵌入式系統(tǒng)的必備需求,需要TCP/IP協(xié)議支持。而socket是TCP/IP網(wǎng)絡(luò)最為通用的API,計(jì)算機(jī)可以通過這個(gè)端口與任何具有socket接口的設(shè)備通信。
二、socket簡(jiǎn)介
TCP/IP是一組支持網(wǎng)絡(luò)通信的協(xié)議系統(tǒng),其協(xié)議參考模型分4層:網(wǎng)絡(luò)接口層、互聯(lián)網(wǎng)層、傳輸層和應(yīng)用層。網(wǎng)絡(luò)通信中一個(gè)非常重要的概念就是套接字(socket),它是介于網(wǎng)絡(luò)應(yīng)用層和傳輸層之間的編程接口,在Linux網(wǎng)絡(luò)層次模型中的位置如圖1所示。套結(jié)字利用IP地址與端口號(hào)與Internet中的網(wǎng)絡(luò)進(jìn)程一一對(duì)應(yīng),進(jìn)而實(shí)現(xiàn)網(wǎng)絡(luò)通信。最常使用的socket有兩種:(1)數(shù)據(jù)流式socket(SOCK-STREAM),使用TCP協(xié)議,提供面向連接的可靠通信流;(2)數(shù)據(jù)報(bào)式socket(SOCK-DGRAM),使用UDP協(xié)議,提供無連接的服務(wù),并且不保證可靠、無差錯(cuò)。本文所使用的是流式套接字。
三、socket通信的設(shè)計(jì)與實(shí)現(xiàn)
1.socket通信過程。網(wǎng)絡(luò)程序具備Client/Server結(jié)構(gòu)。下面分TCP Client端及TCP Server端為說明TCP網(wǎng)絡(luò)程序的流程,如圖2所示。
Server端啟動(dòng)后,先調(diào)用socket()函數(shù)建立socket,其次通過bind()函數(shù)綁定socket和本地IP地址,然后調(diào)用listen()函數(shù)做好偵聽準(zhǔn)備,再調(diào)用accept()函數(shù)進(jìn)行接收。Client端建立socket后,通過connect()函數(shù)和Server端建立連接。之后即可調(diào)用send()和recv()來實(shí)現(xiàn)發(fā)送和接收。關(guān)閉socket通過調(diào)用close()來實(shí)現(xiàn)。
2.socket通信的實(shí)現(xiàn)。本實(shí)驗(yàn)PC機(jī)上安裝的是Redhat 9.0版本的Linux操作系統(tǒng),嵌入式實(shí)驗(yàn)平臺(tái)采用三星S3C2410微處理器,嵌入式操作系統(tǒng)內(nèi)核版本為2.4.18。分別編寫服務(wù)器端應(yīng)用程序server.c和客戶端應(yīng)用程序client.c,實(shí)現(xiàn)網(wǎng)絡(luò)通信,程序流程圖如圖3、圖4所示。
四、結(jié)果分析
設(shè)置PC機(jī)和目標(biāo)平臺(tái)的IP地址分別為:192.168.1.20和192.168.1.22。PC機(jī)Linux終端和目標(biāo)平臺(tái)分別運(yùn)行Server和client程序,通過超級(jí)終端觀察到運(yùn)行結(jié)果如圖5所示,可見PC機(jī)與目標(biāo)平臺(tái)成功建立連接,實(shí)現(xiàn)通信,達(dá)到了預(yù)期目標(biāo)。
五、結(jié)語
研究socket通信對(duì)開發(fā)具有網(wǎng)絡(luò)功能的嵌入式產(chǎn)品有著非常重要的作用。本文的實(shí)現(xiàn)對(duì)于嵌入式產(chǎn)品的網(wǎng)絡(luò)應(yīng)用是一個(gè)很好的探索,對(duì)于同類系統(tǒng)的設(shè)計(jì)具有實(shí)際的參考和推廣價(jià)值。嵌入式系統(tǒng)與網(wǎng)絡(luò)的結(jié)合,必然使其具有更加廣闊的應(yīng)用空間。
參考文獻(xiàn):
[1]劉崢嶸.嵌入式Linux應(yīng)用開發(fā)詳解[M].北京:機(jī)械工業(yè)出版社,2004:394-433.
篇3
(吉林大學(xué)物理學(xué)院,吉林長(zhǎng)春130012)
摘要:為了適應(yīng)在復(fù)雜實(shí)驗(yàn)條件下對(duì)多個(gè)電源單元的管理控制,設(shè)計(jì)基于Socket網(wǎng)絡(luò)通信的多電源單元管理系統(tǒng)。為了對(duì)多電源單元的高效管理,Socket網(wǎng)絡(luò)通信采用的是異步通信連接,同步通信的通信模式,同時(shí)存儲(chǔ)電源數(shù)據(jù)(電壓、電流)到excel文件,方便查閱與記錄。實(shí)驗(yàn)證明這種方式比單獨(dú)異步或者單獨(dú)同步通信方式都高效、準(zhǔn)確。
關(guān)鍵字:C#;Socket;異步通信;同步通信;數(shù)據(jù)保存
中圖分類號(hào):TN86?34 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1004?373X(2015)20?0137?03
收稿日期:2015?05?12
Multi?power management system based on Socket communicationXI Yongguang,F(xiàn)U Chengwei
(School of Physics,Jilin University,Changchun 130012,China)
Abstract:To suit the management and control of multi?power units under the complex experiment condition,a multi?powerunit management system based on the Socket network communication was designed. For the efficient management foe multi?powerunit,the asynchronous communication connection and synchronous communication are adopted in Socket network communica?tion,and the power data(voltage,current)are stored in Excel file. It is convenient to check and record. The experimental re?sults show that this method is more efficient and accurate than only asynchronous communication mode or synchronous communi?cation mode.
Keywords:C #;Socket;asynchronous communication;synchronous communication;data preservation
為了適應(yīng)在復(fù)雜實(shí)驗(yàn)條件下對(duì)多個(gè)電源單元的有效管理,運(yùn)用C#語言編寫了基于Socket 網(wǎng)絡(luò)通信的多電源管理系統(tǒng),并且能把每臺(tái)電源單元的數(shù)據(jù)保存到Excel 表格中,方便查閱與記錄。Socket 通信的同步通信方式是在客戶端在發(fā)送請(qǐng)求之后必須等到服務(wù)器回應(yīng)之后才可以發(fā)送下一條請(qǐng)求,是阻塞通信方式。這樣的方式對(duì)于電源單元的管理比較準(zhǔn)確。但對(duì)于多個(gè)電源單元同時(shí)管理時(shí),就會(huì)出現(xiàn)連接長(zhǎng)時(shí)間通信不上的問題。而異步連接就能很好的解決多個(gè)單元的連接問題,但是異步通信的缺點(diǎn)是對(duì)多電源單元管理時(shí)會(huì)出現(xiàn)數(shù)據(jù)錯(cuò)亂的問題。本系統(tǒng)使用面向?qū)ο驝#編程,采用了Socket 異步連接電源,同步通信收/發(fā)數(shù)據(jù)方式進(jìn)行設(shè)計(jì),很好地滿足了多電源管理系統(tǒng)的要求。
1 系統(tǒng)設(shè)計(jì)
1.1 Socket通信原理
1.1.1 服務(wù)器端的步驟
(1)在實(shí)用Socket之前,要首先初始化Socket,就是實(shí)用Socket初始化函數(shù);
(2) 在初始化完成以后,就可以建立服務(wù)端的Socket,然后實(shí)用該Sokcet開始偵聽整個(gè)網(wǎng)絡(luò)中的連接請(qǐng)求;
(3)當(dāng)檢測(cè)到來自客戶端的連接請(qǐng)求時(shí),向客戶端發(fā)送收到連接請(qǐng)求的信息,并建立與客戶端的連接;
(4)在通信的過程中,服務(wù)器端產(chǎn)生的Socket會(huì)通過一個(gè)消息響應(yīng)函數(shù)OnReceive來接收到達(dá)的數(shù)據(jù),數(shù)據(jù)的發(fā)送可以使用Send()來完成;
(5)當(dāng)完成通信后,服務(wù)器關(guān)閉與客戶端的Socket連接。
1.1.2 客戶端的步驟
(1)同樣的,初始化Socket,并建立客戶端的Socket,確定要連接的服務(wù)器的主機(jī)名和端口;
(2)發(fā)送連接請(qǐng)求到服務(wù)器,并等待服務(wù)器的回饋信息;
(3)連接成功后,與服務(wù)器進(jìn)行數(shù)據(jù)的交互;
(4) 數(shù)據(jù)的讀取同服務(wù)端一樣,也是通過OnRe?ceive函數(shù)來完成的,數(shù)據(jù)的發(fā)送通過Send函數(shù)即可;
(5)數(shù)據(jù)處理完畢后,關(guān)閉自身的Socket連接。
1.2 Socket異步通信與同步通信
(1)異步通信方式
程序執(zhí)行到發(fā)送、接收和監(jiān)聽語句的時(shí)候,不論工作是否完成,都會(huì)繼續(xù)往下執(zhí)行。并且在服務(wù)端不存時(shí),仍然能繼續(xù)進(jìn)行后繼工作的。
(2)同步通信方式
Socket 通信用TCP 協(xié)議進(jìn)行編程時(shí)程序執(zhí)行到發(fā)送、接收和監(jiān)聽語句時(shí),在未完成工作前不再繼續(xù)往下執(zhí)行,即處于阻塞狀態(tài),直到該語句完成某個(gè)工作后才繼續(xù)執(zhí)行下一條語句。并且服務(wù)端不存、從而在拋出異常之前,是無法繼續(xù)進(jìn)行后繼工作的。
1.3 主要設(shè)計(jì)思路
1.3.1 采用同步通信方式
同步通信方式如圖1所示。
1.3.2 采用異步通信方式
異步通信方式如圖2所示。
1.3.3 采用異步連接,同步通信的方式
電源管理系統(tǒng)界面,根據(jù)每個(gè)電源的IP 地址,端口,通過網(wǎng)口進(jìn)行異步通信的連接,然后在界面上輸入需要的電源電壓電流數(shù)據(jù),通過同步通信方式進(jìn)行收/發(fā)數(shù)據(jù),進(jìn)而完成對(duì)電源的控制。管理界面還能保存電源的電壓電流變化的數(shù)據(jù),方便以后查驗(yàn)。
(1)Socket異步連接電源部分程序
2 實(shí)際測(cè)試
2.1 采用同步通信方式
測(cè)試過程中出現(xiàn),在一個(gè)電源單元數(shù)據(jù)通信完成后,才能和下一個(gè)電源單元進(jìn)行通信的情況。這樣的管理系統(tǒng)只能每次處理一個(gè)電源單體,不能實(shí)現(xiàn)對(duì)多電源管理的問題。
2.2 采用異步通信方式
在實(shí)驗(yàn)測(cè)試過程中,能夠同時(shí)和多個(gè)電源單元進(jìn)行通信,但是在通信過程中出現(xiàn)數(shù)據(jù)錯(cuò)亂和數(shù)據(jù)發(fā)送延遲的問題。
2.3 采用異步連接,同步通信的方式
實(shí)驗(yàn)測(cè)試,對(duì)電源單元和多電源單元進(jìn)行多批次長(zhǎng)時(shí)間的測(cè)試,系統(tǒng)是高效、準(zhǔn)確的,數(shù)據(jù)保存也是實(shí)時(shí)準(zhǔn)確的,如圖4所示。
3 結(jié)語
多電源單體管理系統(tǒng)能對(duì)多臺(tái)電源進(jìn)行高效準(zhǔn)確地管理,優(yōu)點(diǎn)有:
(1)在復(fù)雜的實(shí)驗(yàn)條件下,能實(shí)時(shí)高效準(zhǔn)確地管理多個(gè)電源單元,能極大地簡(jiǎn)化實(shí)驗(yàn)過程,讓實(shí)驗(yàn)更加高效精確。
(2)能在遠(yuǎn)距離條件下,方便實(shí)驗(yàn)人員操作復(fù)雜的電路實(shí)驗(yàn)。
(3) 能實(shí)時(shí)精確地保存數(shù)據(jù),方便數(shù)據(jù)的記錄和計(jì)算。
參考文獻(xiàn)
[1] 周晟,金甌,賀建飚,等.基于Socket的異構(gòu)形平臺(tái)的網(wǎng)絡(luò)通信研究[J].計(jì)算機(jī)與數(shù)字工程,2006(5):4?8.
[2] STEVENS W R.TCP?IP 詳解卷一:協(xié)議[M].北京:機(jī)械工業(yè)出版社,2000.
[3] 張文,趙子銘.P2P網(wǎng)絡(luò)技術(shù)原理與C++開發(fā)案例[M].北京:人民郵電出版社,2008.
[4] 馬駿.C#程序設(shè)計(jì)及應(yīng)用教程[M].北京:人民郵電出版社,2009.
[5] JONES A,OHLUND J.Windows網(wǎng)絡(luò)編程[M].北京:清華大學(xué)出版社,2002.
[6] 任柯.ZigBee多媒體教室電源管理系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)[J].西南民族大學(xué)學(xué)報(bào):自然科學(xué)版,2012(4):669?673.
[7] 趙勇,黃東,張?zhí)扉_,等.基于μIP和Socket的遠(yuǎn)程機(jī)房電源控制系統(tǒng)設(shè)計(jì)[J].電子設(shè)計(jì)工程,2015(4):40?43.
篇4
關(guān)鍵詞:嵌入式;Socket;串口通信;網(wǎng)絡(luò)通信
本文的背景是研究通過對(duì)攝像頭的遠(yuǎn)程控制從而對(duì)運(yùn)動(dòng)圖像加以采集和處理。該系統(tǒng)的音視頻編解碼部分,是基于Windows系統(tǒng)用VC進(jìn)行的開發(fā),實(shí)現(xiàn)對(duì)圖像視頻的編解碼處理,攝像頭的遠(yuǎn)程控制系統(tǒng)主要是通過Linux系統(tǒng)設(shè)計(jì)。統(tǒng)通過串口和網(wǎng)絡(luò)進(jìn)行傳輸和控制。系統(tǒng)采用C/S模型,PC機(jī)作為client端,根據(jù)采集到的數(shù)據(jù)進(jìn)行編解碼后,發(fā)送出對(duì)攝像頭的控制命令,通過網(wǎng)絡(luò)傳輸?shù)紸RM9平臺(tái)上,ARM平臺(tái)作為server端在接收到client端發(fā)送的命令后,通過串口發(fā)送命令來控制攝像頭。
1 串口通信
1.1 Linux下串口通信基本原理
Linux系統(tǒng)將設(shè)備和文件的操作都作為對(duì)文件的處理,所以對(duì)設(shè)備的操作,內(nèi)核會(huì)返回一個(gè)文件描述符,需要將其作為參數(shù)傳給相對(duì)應(yīng)的函數(shù)。Linux中所有的設(shè)備文件都放在“/dev”目錄下,通過“ttyS+編號(hào)”命名相應(yīng)的串口資源,所以對(duì)應(yīng)路徑是“/devttyS*”。因而可以相對(duì)文件讀寫那樣訪問一個(gè)串口設(shè)備。
1.2 Linux下的串口設(shè)置
首先要對(duì)串口進(jìn)行設(shè)置,在termios.h完成對(duì)波特率等的設(shè)置。
struct termios
{tcflag t c iflag;
tcflag t c oflag;
tcflag t c cflag;
tcflag t c lflag;
cc t c cc [NCCS];
};
open()函數(shù):int fd = open ("/dev/ttyS *", O RDWR|O NOCTTY|O NDELA Y);
然后調(diào)用read()和write()函數(shù)讀寫端口,返回實(shí)際讀寫的字節(jié)數(shù),如果有錯(cuò)誤發(fā)生則返回-1。
讀取串口結(jié)束后,首先恢復(fù)串口原始屬性,然后才可以關(guān)閉串口并退出程序。
1.3 串口控制應(yīng)用程序
下面給出本系統(tǒng)中一個(gè)通過串口控制攝像頭的函數(shù)的一部分結(jié)構(gòu):
void sendMsg(int pan,int tilt)
{struct timeval timeout;
static char *driver = "/dev/ttyS1";
timeout.tv_sec = 0;
timeout.tv_usec = 0;
formCmd(buf,pan,tilt);
fd = uart_open(driver,B9600);
write(fd,buf,16);
close(fd);
}
2 網(wǎng)絡(luò)通信
2.1 Socket基本原理介紹
Socket是一種通信機(jī)制,客戶/服務(wù)器系統(tǒng)既可以在本地單機(jī)上運(yùn)行,也可以在網(wǎng)絡(luò)中運(yùn)行。
首先需要了解socket中的一些重要函數(shù):
1) 創(chuàng)建Socket:int socket( intdomain, inttype, intprotocol);
2) 配置Socket:bind函數(shù)指定本地信息int bind( intsocket, const structsockaddr* address, size_taddress_len);
3) 使用listen( )和accept( )函數(shù)獲取遠(yuǎn)端信息:
Int listen(int socket, int backlog);
Int accept(int socket, struct sockaddr* address, size_t* address_len);
4) 通信處理:send( ),write( ),recv( ),read( )。
5) 通信結(jié)束:使用closesocket( )。
2.2 Windows和Linux下socket應(yīng)用程序
客戶端程序:創(chuàng)建一個(gè)未命名的套接字,然后把它連接到服務(wù)器套接字server_socket上,向服務(wù)器寫一個(gè)字符,再讀回經(jīng)服務(wù)器處理后的一個(gè)字符。
服務(wù)器端程序:首先創(chuàng)建一個(gè)服務(wù)器套接字,綁定到一個(gè)名字,然后創(chuàng)建一個(gè)監(jiān)聽隊(duì)列,接收來自客戶程序的連接。
下面我們分別在Windows和Linux下進(jìn)行socket編程,實(shí)現(xiàn)二者之間的通信,具體函數(shù)實(shí)現(xiàn)的主要部分如下:
Windows下作為client端:
{
SocketClient=socket(AF_INET,SOCK_STREAM,0);
addrSrv.sin_addr.S_un.S_addr=inet_addr("192.168.1.10");
while(1)
send(SocketClient,sendBuffer,16,0);
closesocket(SocketClient);
WSACleanup();
}
Linux下作為server端:
{
server_sockfd = socket(AF_INET, SOCK_STREAM, 0);
server_address.sin_addr.s_addr = inet_addr("192.168.1.10");
bind(server_sockfd, (struct sockaddr *)&server_address, server_len);
listen(server_sockfd, 5);
client_sockfd = accept(server_sockfd, (struct sockaddr *)&client_address, &client_len);
while(1)
read(client_sockfd, str,16);
close(client_sockfd);
}
3 結(jié)束語
本文設(shè)計(jì)了基于嵌入式平臺(tái)上可移動(dòng)攝像頭遠(yuǎn)程控制,對(duì)串口通信和網(wǎng)絡(luò)通信的原理和機(jī)制加以闡述,對(duì)串口驅(qū)動(dòng)和網(wǎng)絡(luò)驅(qū)動(dòng)的編寫提出了具體的方法,并且在實(shí)際的操作應(yīng)用中給出了具體函數(shù)的編寫。本文所提供的處理方法已在實(shí)際的項(xiàng)目中的得到應(yīng)用,對(duì)于其他的通過串口通信和網(wǎng)絡(luò)通信控制的設(shè)備,具有參考意義,今后我們還將展開進(jìn)一步的相關(guān)研究。
參考文獻(xiàn):
[1] 劉智國,張海春.基于S3C2410的嵌入式串口通信設(shè)計(jì)[J].微計(jì)算機(jī)信息(嵌入式與SOC),2009,25(4-2).
篇5
關(guān)鍵詞:網(wǎng)絡(luò)控制器;通信協(xié)議;Rabbit2000單片機(jī);套接字;串口通信
中圖分類號(hào):TN91 文獻(xiàn)標(biāo)識(shí)碼:B
文章編號(hào):1004373X(2008)0105403オ
Communication Technology of Jia-xiao-tong Network Controller
WEI Zi,YANG Qingjiang,ZHANG Guanglu
(Heilongjiang Institute of Science and Technology,Harbin,150027,China)
オ
Abstract:For the function demand of the network controller in Jia-xiao-tong system,the paper proposes a communication technology of combining serial-port with network.Firstly,it describes the network controller′s hardware platform and the application-layer protocol based on TCP/IP protocol stack.Then,it mainly discusses the communication network technology and the communication serial technology.The polling scheme is applied to improve data transfer effectiveness and reduce data collision.Finally,it explains and analyzes the communication technology′s feasibility and stability through filed test data.
Keywords:network controller;communication protocol;Rabbit2000 single chip;socket;serial communication
オ
1 引 言
隨著TCP/IP等網(wǎng)絡(luò)通信的出現(xiàn),將串口通信與網(wǎng)絡(luò)通信相結(jié)合的趨勢(shì)越來越明顯,這是保護(hù)使用者既往投資和整體利益的一種有效辦法。本文所討論的通信技術(shù)就是將串口與網(wǎng)絡(luò)通信相結(jié)合并在實(shí)際應(yīng)用中取得良好效果的一種通信解決方案。
“家校通”是利用現(xiàn)代信息技術(shù)實(shí)現(xiàn)家庭與學(xué)校實(shí)時(shí)溝通的教育網(wǎng)絡(luò)平臺(tái),其組成部分為:家?;ヂ?lián)卡、讀卡器、無線網(wǎng)關(guān)、網(wǎng)絡(luò)控制器、短信發(fā)射接收機(jī)。網(wǎng)絡(luò)控制器的主要功能是通過無線網(wǎng)關(guān)從讀卡器獲取信息,并與互聯(lián)網(wǎng)服務(wù)平臺(tái)進(jìn)行網(wǎng)絡(luò)通信,是家校通系統(tǒng)的核心。
2 網(wǎng)絡(luò)控制器的硬件平臺(tái)
根據(jù)網(wǎng)絡(luò)控制器的功能要求,考慮整體的性能、價(jià)格方面,CPU采用Rabbit2000單片機(jī),他是Z-World公司特別為中小型控制器而設(shè)計(jì)的高性能8位微處理器。編譯環(huán)境為Dynamic C,提供Socket級(jí)TCP/IP編程。網(wǎng)絡(luò)控制器的硬件結(jié)構(gòu)如圖1所示。
3 應(yīng)用層通信協(xié)議
3.1 網(wǎng)絡(luò)控制器與讀卡器的串口通信協(xié)議
網(wǎng)絡(luò)控制器與讀卡器的通信主要通過異步串行RS 485接口,基于通用串行通信RS 485數(shù)據(jù)傳輸單元(字節(jié)格式)有不帶校驗(yàn)位的10 b和帶奇偶校驗(yàn)位的11 b兩種數(shù)據(jù)格式。為了提高數(shù)據(jù)傳送的效率和可靠性,采用無奇偶校驗(yàn)位的10 b數(shù)據(jù)格式,并由BBC校驗(yàn)生成校驗(yàn)碼與數(shù)據(jù)一起發(fā)送。
開始標(biāo)志讀卡器地址信息長(zhǎng)度命令和參數(shù)校驗(yàn)
2 B1 B2 B14 B1 B
(3)命令字:
A1:從讀卡器讀取一條記錄。
A2:控制器正確接收記錄信息后,返回更新記錄的讀地址命令,使地址指針指向下一條記錄。
A4:設(shè)置校正讀卡器時(shí)間。
A6:測(cè)試控制器與讀卡是否正常通信。
3.2 網(wǎng)絡(luò)控制器與服務(wù)平臺(tái)的網(wǎng)絡(luò)通信協(xié)議
網(wǎng)絡(luò)協(xié)議通常分不同的層次進(jìn)行開發(fā),每一層分別負(fù)責(zé)不同的通信功能。TCP/IP通常是一個(gè)4層協(xié)議,包括數(shù)據(jù)鏈路層、網(wǎng)絡(luò)層(含IP協(xié)議)、傳輸層(含TCP協(xié)議)和應(yīng)用層。本網(wǎng)絡(luò)協(xié)議就是基于TCP/IP協(xié)議之上的應(yīng)用層協(xié)議,采用請(qǐng)求應(yīng)答的通信模式。考慮到協(xié)議的可靠性和實(shí)現(xiàn)的方便性,數(shù)據(jù)采用ASCII碼表示。
(1)報(bào)文組成
4 通信技術(shù)
控制器建立socket連接后,向服務(wù)器發(fā)送連接請(qǐng)求和數(shù)據(jù)傳輸,并實(shí)時(shí)判斷連接的有效性,在有效連接的狀態(tài)下,實(shí)現(xiàn)控制器、服務(wù)器、讀卡器三者的正常通訊,程序流程如圖2所示。
4.1 網(wǎng)絡(luò)通信技術(shù)的實(shí)現(xiàn)
socket初始化: 首先要對(duì)RTL8019AS的控制寄存器進(jìn)行初始化配置,Dynamic C已將這部分配置封裝成函數(shù)放入REALTEK.LIB庫中,應(yīng)用時(shí)只需調(diào)用相關(guān)函數(shù)。之后再調(diào)用函數(shù)庫dcrtcp.lib中的幾個(gè)簡(jiǎn)單函數(shù)可完成socket的初始化,以下是程序的主體框架。
#define TCPCONFIG1
#memmapxmem
#usedcrtcp.lib
main()
{
sock[CD#*2]init( );
while(ifpending(IF[CD#*2]DEFAULT)==IP[CD#*2]COMING[CD#*2]UP)
tcp[CD#*2]tick(NULL);
tcp[CD#*2]open(&socket,0,destIP,sockport,null);
…… ……
}
在建立TCP的連接中,Dynamic C有兩種方法打開TCP socket:一種是被動(dòng)的方式,調(diào)用函數(shù)tcp[CD#*2]listen(),等待客戶端進(jìn)行連接;一種是主動(dòng)的方式,調(diào)用函數(shù)tcp[CD#*2]open(),根據(jù)相應(yīng)的參數(shù)(IP地址和端口號(hào))主動(dòng)連接到服務(wù)器端。本通信技術(shù)采用的就是主動(dòng)方式(作為客戶端)。
Socket數(shù)據(jù)的發(fā)送與接收:數(shù)據(jù)發(fā)送調(diào)用sock[CD#*2]write(&socket,str[CD#*2]send,str[CD#*2]send[CD#*2]len)。在讀取socket緩沖區(qū)數(shù)時(shí),先判斷緩沖區(qū)中是否有數(shù)據(jù),有數(shù)據(jù)再進(jìn)行讀操用,同時(shí)有超時(shí)設(shè)置。
start[CD#*2]time=SEC[CD#*2]TIMER;
/*SEC[CD#*2]TIMER為秒級(jí)系統(tǒng)時(shí)間*/
end[CD#*2]time=start[CD#*2]time;
while((end[CD#*2]time
!recv[CD#*2]count)/*READ[CD#*2]TIME為設(shè)定的等待時(shí)間*/
{
str[CD#*2]recvbuf[CD#*2]len=sock[CD#*2]bytesready(&socket);
/*判斷socket讀緩沖區(qū)是否有數(shù)據(jù)*/
if(str[CD#*2]recvbuf[CD#*2]len>0)
recv[CD#*2]count=sock[CD#*2]read(&socket,str[CD#*2]recvbuf,
str[CD#*2]recvbuf[CD#*2]len); /*讀socket*/
}
if(revc[CD#*2]count)
{…… ……}
/*拆分接收到的命令字,讀取有效信息*/
else
break;
4.2 串口通信技術(shù)的實(shí)現(xiàn)
主要包含3個(gè)步驟:命令字的組合,設(shè)置串口D,通過設(shè)置Rabbit2000的PE3來控制數(shù)據(jù)的發(fā)送與接收。以A6命令為例,程序主體框架如下:
command[0]=0xA6;/*A6命令*/
create[CD#*2]command(addr,command,pack);
/*組合命令字*/
serDopen(9600);/*9600為波特率*/
send[CD#*2]command(command,returnlen);/*發(fā)送數(shù)據(jù)*/
read[CD#*2]command(readbuf,sizeof(readbuf),10);
/*接收數(shù)據(jù)*/
void send[CD#*2]command(char *pack,int len)
{
int i;
WrPortI(PEDR,& PEDRShadow,0x08);
WrPortI(PEB3R,NULL,0);
for(i=0;i
serDputc(pack[i]);
}
int read[CD#*2]command(char *buf,int len,int time)
{
int i[CD#*2]return;
WrPortI(PEB3R,NULL,1
i[CD#*2]return=serDread(buf,len,time);
return i[CD#*2]return;
}
5 數(shù)據(jù)采集與分析
網(wǎng)絡(luò)控制器聯(lián)網(wǎng)正常運(yùn)行時(shí),向服務(wù)器發(fā)送的一包測(cè)試記錄數(shù)據(jù)為:
對(duì)數(shù)據(jù)包進(jìn)行分析:0244為數(shù)據(jù)包的總長(zhǎng)度,01為協(xié)議版本號(hào),02為命令字,000003為序列號(hào),21000102*****為設(shè)備號(hào),09為數(shù)據(jù)包中的刷卡記錄總數(shù),0080D122為測(cè)試卡號(hào),07070414152715為刷卡時(shí)間(順序?yàn)槟曛茉氯諘r(shí)分秒),03為狀態(tài)。
采集從服務(wù)器返回的命令:001501020000031,其中
列號(hào),1為正確接收。返回命令格式符合協(xié)議要求,內(nèi)容正確。
網(wǎng)絡(luò)控制器向讀卡器發(fā)送的命令(以A6為例): aa ff 01 00 03 a6 41 41 f1,其中aa ff表示本命令為控制器發(fā)給讀卡器,01為讀卡器地址,00 03為數(shù)據(jù)長(zhǎng)度,a6為命令字,41 41為測(cè)試數(shù)據(jù),f1為校驗(yàn)位。
采集從讀卡器返回的命令:bb ff 01 00 02 41 41 47 d1 22 07 07 04 14 15 42 17 1 6b 00 00 00,其中bb ff表示本命令為讀卡器發(fā)給控制器,01為讀卡器地址,00 02為數(shù)據(jù)長(zhǎng)度,41 41為測(cè)試數(shù)據(jù),47為校驗(yàn)位,之后的為無效數(shù)據(jù)。
6 結(jié) 語
基于Rabbit2000實(shí)現(xiàn)串口與網(wǎng)絡(luò)結(jié)合的通信技術(shù)可以實(shí)時(shí)、準(zhǔn)確地對(duì)數(shù)據(jù)進(jìn)行處理、發(fā)送與接收。由采集到的數(shù)據(jù)表明數(shù)據(jù)收發(fā)的正確性,證明了本通信技術(shù)的可行性與可靠性。本通信技術(shù)已在家校通系統(tǒng)中取得了良好的通信效果,并可應(yīng)用于其他數(shù)據(jù)傳輸系統(tǒng)中,具有廣泛的發(fā)展前景。
參 考 文 獻(xiàn)
[1]Z-World Inc.Rabbit2000 Microprocessor Designer′s Hand-book,2003.
[2]Z-WorldInc.Dynamic C TCP/IP User′s Manual,2003.
[3]林麗,朱宏.基于Rabbit2000的網(wǎng)絡(luò)通信技術(shù)[J].福建電腦,2005(4):45-46.
篇6
關(guān)鍵詞 JAVA,網(wǎng)絡(luò),SOCKET,APPLET
網(wǎng)絡(luò)上的系統(tǒng)結(jié)構(gòu)多為客戶/服務(wù)器模式,服務(wù)器端負(fù)責(zé)數(shù)據(jù)和圖像等的存儲(chǔ)、維護(hù)、管理以及傳遞,客戶端則負(fù)責(zé)人機(jī)界面的操作、送出需求及顯示收回的數(shù)據(jù)。
下面介紹一下如何使用JAVA來進(jìn)行網(wǎng)絡(luò)編程:
1) 由于客戶端通過IE同服務(wù)器建立聯(lián)系,所以客戶端使用Applet,服務(wù)器端使用Application;
2) 服務(wù)器應(yīng)設(shè)置成多線程,應(yīng)答多個(gè)客戶的請(qǐng)求;
3) 兩端通信使用SOCKET機(jī)制。
1 Java中輸入/輸出流概念:
過濾流DataInputStream 和DataOutputStream 除了分別作為FilterInputStream 和FilterOutputStream的子類外,還分別實(shí)現(xiàn)了接口DataInput 和DataOutput。接口DataInput 中定義的方法主要包括從流中讀取基本類型的數(shù)據(jù)、讀取一行數(shù)據(jù)、或者讀取指定長(zhǎng)度的字節(jié)數(shù),如readBoolean() readInt()、readLine()、readFully()等。接口DataOutput中定義的方法主要是向流中寫入基本類型的數(shù)據(jù)或者寫入一定長(zhǎng)度的字節(jié)數(shù)組,如writeChar()、writeDouble() DataInputStream可以從所連接的輸入流中讀取與機(jī)器無關(guān)的基本類型數(shù)據(jù),用以實(shí)現(xiàn)一種獨(dú)立于具體平臺(tái)的輸入方式;DataInputStream 可以向所連接的輸出流寫入基本類型的數(shù)據(jù)。
2 Socket 機(jī)制
Socket是面向客戶/服務(wù)器模型設(shè)計(jì)的,網(wǎng)絡(luò)上的兩個(gè)程序通過一個(gè)雙向的通訊連接實(shí)現(xiàn)數(shù)據(jù)的交換,這個(gè)雙向鏈路的一端稱為一個(gè)Socket。 Socket通常用來實(shí)現(xiàn)客戶方和服務(wù)方的連接??蛻舫绦蚩梢韵騍ocket寫請(qǐng)求,服務(wù)器將處理此請(qǐng)求,然后通過Socket將結(jié)果返回給用戶。
Socket通信機(jī)制提供了兩種通訊方式:有聯(lián)接和無聯(lián)接方式,分別面向不同的應(yīng)用需求。使用有聯(lián)接方式時(shí),通信鏈路提供了可靠的,全雙工的字節(jié)流服務(wù)。在該方式下,通信雙方必須創(chuàng)建一個(gè)聯(lián)接過程并建立一條通訊鏈路,以后的網(wǎng)絡(luò)通信操作完全在這一對(duì)進(jìn)程之間進(jìn)行,通信完畢關(guān)閉此聯(lián)接過程。使用無聯(lián)接方式時(shí)其系統(tǒng)開銷比無聯(lián)接方式小,但通信鏈路提供了不可靠的數(shù)據(jù)報(bào)服務(wù),不能保證信源所傳輸?shù)臄?shù)據(jù)一定能夠到達(dá)信宿。在該方式下,通信雙方不必創(chuàng)建一個(gè)聯(lián)接過程和建立一條通訊鏈路,網(wǎng)絡(luò)通信操作在不同的主機(jī)和進(jìn)程之間轉(zhuǎn)發(fā)進(jìn)行。
3 Java語言
Java語言的優(yōu)點(diǎn)主要表現(xiàn)在:簡(jiǎn)單、面向?qū)ο?、多線程、分布性、體系結(jié)構(gòu)中立、安全性等方面。
(1) 簡(jiǎn)單性
Java與C++語言非常相近,但Java比C++簡(jiǎn)單,它拋棄了C++中的一些不是絕對(duì)必要的功能,如頭文件、預(yù)處理文件、指針、結(jié)構(gòu)、運(yùn)算符重載、多重繼承以及自動(dòng)強(qiáng)迫同型。 Java實(shí)現(xiàn)了自動(dòng)的垃圾收集,簡(jiǎn)化了內(nèi)存管理的工作。這使程序設(shè)計(jì)更加簡(jiǎn)便,同時(shí)減少了出錯(cuò)的可能。
(2) 面向?qū)ο?/p>
Java提供了簡(jiǎn)單的類機(jī)制和動(dòng)態(tài)的構(gòu)架模型。對(duì)象中封裝了它的狀態(tài)變量和方法,很好地實(shí)現(xiàn)了模塊化和信息隱藏;而類則提供了一類對(duì)象的原型,通過繼承和重載機(jī)制,子類可以使用或重新定義父類或超類所提供的方法,從而既實(shí)現(xiàn)了代碼的復(fù)用,又提供了一種動(dòng)態(tài)的解決方案。
Java是一種完全面向?qū)ο蟮某绦蛟O(shè)計(jì)語言,它除了數(shù)組、布爾和字符三個(gè)基本數(shù)據(jù)類型外的其它類都是對(duì)象,它不再支持全局變量。在Java中,如果不創(chuàng)建新類就無法創(chuàng)建程序,Java程序在運(yùn)行時(shí)必須先創(chuàng)建一個(gè)類的實(shí)例,然后才能提交運(yùn)行。
Java同樣支持繼承特性,Java的類可以從其它類中繼承行為,但Java只支持類的單重繼承,即每個(gè)類只能從一個(gè)類中繼承。
Java支持界面,界面允許程序員定義方法但又不立即實(shí)現(xiàn),一個(gè)類可以實(shí)現(xiàn)多個(gè)界面,利用界面可以得到多重繼承的許多優(yōu)點(diǎn)而又沒有多重繼承的問題。
(3) 多線程
多線程使應(yīng)用程序可以同時(shí)進(jìn)行不同的操作,處理不同的事件。在多線程機(jī)制中,不同的線程處理不同的任務(wù),他們之間互不干涉,不會(huì)由于一處等待影響其他部分,這樣容易實(shí)現(xiàn)網(wǎng)絡(luò)上的實(shí)時(shí)交互操作。
Java程序可以有多個(gè)執(zhí)行線程,如可以讓一個(gè)線程進(jìn)行復(fù)雜的計(jì)算,而讓另一個(gè)線程與用戶進(jìn)行交互,這樣用戶可以在不中斷計(jì)算線程的前提下與系統(tǒng)進(jìn)行交互。多線程保證了較高的執(zhí)行效率。
(4) 分布性
Java是面向網(wǎng)絡(luò)的語言。通過它提供的類庫可以處理TCP/IP協(xié)議,用戶可以通過URL地址在網(wǎng)絡(luò)上很方便的訪問其他對(duì)象。
(5) 體系結(jié)構(gòu)中立
Java是一種網(wǎng)絡(luò)語言,為使Java程序能在網(wǎng)絡(luò)的任何地方運(yùn)行,Java解釋器生成與體系結(jié)構(gòu)無關(guān)的字節(jié)碼結(jié)構(gòu)的文件格式。Java為了做到結(jié)構(gòu)中立,除生成機(jī)器無關(guān)的字節(jié)碼外,還制定了完全統(tǒng)一的語言文本,如Java的基本數(shù)據(jù)類型不會(huì)隨目標(biāo)機(jī)的變化而變化,一個(gè)整型總是32位,一個(gè)長(zhǎng)整型總是64位。
為了使Java的應(yīng)用程序能不依賴于具體的系統(tǒng),Java語言環(huán)境還提供了用于訪問底層操作系統(tǒng)功能的類組成的包,當(dāng)程序使用這些包時(shí),可以確保它能運(yùn)行在各種支持Java的平臺(tái)上。
java.lang: 一般的語言包。其中包括用于字符串處理、多線程、異常處理和數(shù)字函數(shù)等的類,該包是實(shí)現(xiàn)Java程序運(yùn)行平臺(tái)的基本包
java.util: 實(shí)用工具包。其中包括哈希表、堆棧、時(shí)間和日期等
java.io: 基于流模型的輸入/輸出包。該包用統(tǒng)一的流模型實(shí)現(xiàn)了各種格式的輸入/輸出,包括文件系統(tǒng)、網(wǎng)絡(luò)和設(shè)備的輸入/輸出等
java.net: 網(wǎng)絡(luò)包。該包支持TCP/IP協(xié)議,其中提供了socket、URL和WWW的編程接口
java.awt: 抽象窗口工具集。其中實(shí)現(xiàn)了可以跨平臺(tái)的圖形用戶界面組件,包括窗口、菜單、滾動(dòng)條和對(duì)話框等
java.applet: 支持applet程序設(shè)計(jì)的基本包
(6) 安全性
用于網(wǎng)絡(luò)、分布環(huán)境下的Java必須要防止病毒的入侵,Java不支持指針,一切對(duì)內(nèi)存的訪問都必須通過對(duì)象的實(shí)例變量來實(shí)現(xiàn),這樣就防止了程序員使用欺騙手段訪問對(duì)象的私有成員,同時(shí)也避免了指針操作中容易產(chǎn)生的錯(cuò)誤。
4 JAVA工具
(1) JDK
1) Java編譯器
Java編譯器將Java源代碼文件編譯成可執(zhí)行的Java字節(jié)碼。Java源代碼文件的擴(kuò)展名為 .java,Java編譯器把這種擴(kuò)展名的文件編譯成擴(kuò)展名為.class的文件。源文件中的每個(gè)類在編譯后都將產(chǎn)生一個(gè)class文件,這意味一個(gè)Java源代碼文件可能編譯生成多個(gè)class文件。
2) Java解釋器
Java解釋器對(duì)編譯生成的字節(jié)碼格式的可執(zhí)行程序的運(yùn)行提供支持,它是運(yùn)行非圖形Java程序的命令行工具。
3) Appletviewer
它是Java Applet的簡(jiǎn)單測(cè)試工具,可使用它來測(cè)試Java Applet程序,而不需要WWW瀏覽器的支持。
(2) Visual J++
Visual J++ 集成了可視化界面設(shè)計(jì)、交互式調(diào)試、代碼編輯、聯(lián)機(jī)幫助信息和介紹如何快速掌握該開發(fā)環(huán)境的實(shí)用向?qū)У榷囗?xiàng)功能,同時(shí)具有能充分利用Active X和COM新技術(shù)的優(yōu)勢(shì)。利用Visual J++可創(chuàng)建交互性很強(qiáng)的Internet應(yīng)用程序,是難得的Java 開發(fā)系統(tǒng)。
5 客戶機(jī)/服務(wù)器通信的實(shí)現(xiàn):
(1) Application 同 Applet 的通信
兩端通過Socket機(jī)制進(jìn)行連接:
1) 客戶端的編程流程:
? 打開Socket,新建一個(gè)套接字;
? 為套接字建立一個(gè)輸入和輸出流;
? 根據(jù)服務(wù)器協(xié)議從套接字讀入或向套接字寫入;
? 清除套接字和輸入/輸出流;
2)服務(wù)器端的編程流程:
? 打開Server Socket,創(chuàng)建一個(gè)服務(wù)器型套接字和一個(gè)普通套接字,服務(wù)器型套接字在指定端口為客戶端請(qǐng)求的Socket 服務(wù);
? 使用ServerSocket類的accept()方法使服務(wù)器型套接字處于監(jiān)聽狀態(tài)并把監(jiān)聽結(jié)果返回給普通套接字;
? 為該普通套接字創(chuàng)建輸入和輸出流;
? 從輸入和輸出流中讀入或?qū)懭胱止?jié)流,進(jìn)行相應(yīng)的處理,并將結(jié)果返回給客戶端;
? 在客戶端和服務(wù)器工作結(jié)束后關(guān)閉所有的對(duì)象,如服務(wù)器型的套接字,普通套接字,輸入和輸出流。
正是由于Java系統(tǒng)具有基于Socket的靈活通信機(jī)制,因而其應(yīng)用程序能自由地打開和訪問網(wǎng)絡(luò)上的對(duì)象,就象在本地文件系統(tǒng)中一樣。
(2) Applet之間的通信:
Applet之間的通信使用Applet Context類的getApplet()方法。
只要在程序中加入
Applet oneapplet=getAppletContext().getApplet(“first”);便可使用name為first的Applet中的方法了。
在該課題中大量使用了該種通信方法,因?yàn)閷iT同服務(wù)器端通信的 Applet中包含接收信息方法和發(fā)送信息方法,所有客戶端的Applet都要使用負(fù)責(zé)通信的Applet中的方法,所以客戶端的Applet同負(fù)責(zé)通信的Applet必須進(jìn)行通信。
6 程序
//服務(wù)器端程序S.java 負(fù)責(zé)與客戶端通信
import java.io.*;
import java.net.*;
import java.lang.*;
import T2;
class ThreadEchoHandler extends Thread //創(chuàng)建線程
{
T2 theT2=new T2();
Socket incoming;
int counter;
ThreadEchoHandler(Socket i,int c)
{ incoming=i;
counter=c; }
public void run()
{
try
{
DataInputStream in=new DataInputStream(incoming.getInputStream());
DataOutputStream out=new DataOutputStream(incoming.getOutputStream());
System.out.println ("hello");
boolean done=false;
while(!done)
{ String aa="";
String str=in.readUTF(); //從客戶端得到字符串
//在此加入各自的服務(wù)程序
System.out.println (str);
theT2.pass(str); //解碼
theT2.tongji(); //修改監(jiān)控庫中的信息
aa=theT2.guan(); //操縱數(shù)據(jù)庫
System.out.println ("string z is:"+aa);
if(aa.compareTo("null")!=0 )
//若是查詢數(shù)據(jù)庫,返回查詢后的結(jié)果
{ //若不是查詢數(shù)據(jù)庫,不向客戶端輸出信息
out.writeUTF(aa);
out.flush(); }
}//while
incoming.close(); //線程關(guān)閉
}//try
catch(IOException e)
{System.out.println(e);}
}//end run
}
//----------------------------------------
class S
{
public static void main(String[] args)
{
int i=1;
try
{
ServerSocket s=new ServerSocket(1111);
for(;;)
{
Socket incoming=s.accept();
System.out.println("connect: "+i);
new ThreadEchoHandler(incoming,i).start();
i++;
}
}
catch(Exception e)
{ System.out.println(e); }
}
}
//客戶端通信小應(yīng)用程序 Echo.java
import java.io.*;
import java.net.*;
import java.awt.*;
import java.applet.*;
public class Echo extends Applet
{
TextArea ta;
Socket echoSocket;
DataOutputStream os;
DataInputStream is;
String Line;
public void init()
{
setBackground(Color.white);
ta=new TextArea(5,80);
ta.setEditable(false);
add(ta);
try
{echoSocket=new Socket("10.102.4.41",1111);} //與服務(wù)器建立連接
catch(IOException e)
{System.out.println("error");}
}
public void st(String stri) //發(fā)送字符串的方法
{
try
{ DataOutputStream os=new DataOutputStream(echoSocket.getOutputStream());
DataInputStream is=new DataInputStream(echoSocket.getInputStream());
os.writeUTF(""+ stri ); //向服務(wù)器輸送string
os.flush();
}
catch(IOException e)
{System.out.println(" error:"+e); }
}
public String st1() //接收字符串的方法
{
String Line="";
try
{ DataOutputStream os=new DataOutputStream(echoSocket.getOutputStream());
DataInputStream is=new DataInputStream(echoSocket.getInputStream());
Line=is.readUTF(); //從服務(wù)器讀來的信息
ta.appendText(""+Line); //在文本域中輸出信息
}
catch(IOException e)
{System.out.println(" error:"+e); }
return Line;
}
}
7 程序調(diào)試心得:
1) 在建立Socket連接時(shí),兩端的端口號(hào)必須設(shè)為一致,否則建立不了連接。服務(wù)器端必須有主機(jī)IP地址或主機(jī)名參數(shù)。
2) 連接建立好之后應(yīng)確定輸入和輸出流。起初程序中用的是DataInputStream和PrintStream,結(jié)果只能傳輸英文,傳輸中文時(shí)產(chǎn)生亂碼,將PrintStream改為DataOutputStream,使用readUTF()和writeUTF()方法后,中文傳輸問題得到解決。
3) 如果一個(gè)使用某端口的程序沒有關(guān)閉,另一個(gè)程序就不能使用這個(gè)端口。
4) 開始進(jìn)行通信的程序均為 Application,因不符合客戶機(jī)/服務(wù)器機(jī)制,應(yīng)將客戶端的Application改為Applet。其轉(zhuǎn)化的主要步驟如下:
? 創(chuàng)建一個(gè)包含APPLET標(biāo)簽的HTML文件;
? 去掉應(yīng)用程序中的main()方法;
? 類名應(yīng)繼承Applet類,而不是Frame類,并在程序開頭加入
import java.applet.*;語句;
? 用init()方法代替Application程序中的構(gòu)造方法,當(dāng)瀏覽器創(chuàng)建Applet類對(duì)象的時(shí)候,它自動(dòng)執(zhí)行init()方法;
? 如Application中缺省使用了BorderLayout布局管理器,應(yīng)在Applet的init()方法中重新設(shè)定;
? 如果Application中有setTitle()方法,必須將其去掉,如Application中使用了菜單,在Applet 中用按鈕來替換。
5) 懂得了在一程序中如何引用自定義的類中的方法和變量,在程序開頭加入import 類名;在程序中加入 類名 實(shí)例=new 類名(); 然后使用
實(shí)例.方法(),實(shí)例.變量即可。
參考文獻(xiàn)
[1] 廖雷等,Java程序設(shè)計(jì)教程,中國電力出版社,2003
篇7
下面我將對(duì)LINUX平臺(tái)下網(wǎng)絡(luò)通信設(shè)計(jì)的工作流程、數(shù)據(jù)發(fā)送、數(shù)據(jù)接收三個(gè)模塊進(jìn)行詳細(xì)的介紹。
1工作流程
首先調(diào)用SOCKET函數(shù)創(chuàng)建一個(gè)用于通信的套接字,然后給已經(jīng)創(chuàng)建的套接字(SOCKET)綁定本地地址/端口號(hào)(Bind()),成功之后就在相應(yīng)的SOCKET上監(jiān)聽(Listen())。當(dāng)Accept()函數(shù)捕捉到一個(gè)連接服務(wù)(Connect())請(qǐng)求時(shí),接受并生成一個(gè)新的SOCKET,并通過這個(gè)新的SOCKET與客戶端連接,用Read()/Write()或相關(guān)函數(shù)讀取和發(fā)送數(shù)據(jù),傳輸完畢時(shí),用Close()關(guān)閉所有進(jìn)程,結(jié)束這次通信??蛻舳顺绦蛟O(shè)計(jì)流程:客戶端也先要?jiǎng)?chuàng)建一個(gè)SOCKET,將該SOCKET與本地地址/端口號(hào)綁定,還需要指定服務(wù)器端的地址與端口號(hào),隨后向服務(wù)器端發(fā)出連接(Connect())請(qǐng)求,請(qǐng)求被服務(wù)器端接受后,用函數(shù)進(jìn)行了數(shù)據(jù)的接收與發(fā)送,傳輸完畢后,用Close()關(guān)閉套接口,通信結(jié)束。
2數(shù)據(jù)發(fā)送模塊
從應(yīng)用層到物理層發(fā)送數(shù)據(jù)時(shí),函數(shù)調(diào)用順序如下:send>sys—send>sys—sendto>sock—sendmsg>inet—sendmsg>tcp—sendmsg>tcp—send—skb>tcp_transmit>ip—queue—xmit>ip—queue—xmit2>ip—output>ip—finish—output>ip—finish—output2>neigh_resolve_output>dev_queue_xmit>ei—start_xmit網(wǎng)絡(luò)連接創(chuàng)建好以后,就可以進(jìn)行發(fā)送數(shù)據(jù)了。
3數(shù)據(jù)接收模塊
當(dāng)網(wǎng)絡(luò)上的數(shù)據(jù)到達(dá)接收計(jì)算機(jī)時(shí),網(wǎng)卡控制器產(chǎn)生中斷,調(diào)用該中斷的中斷處理程序ei—interrupt()。在這個(gè)函數(shù)中主要通過判斷中斷狀態(tài)寄存器(ISR)的內(nèi)容,調(diào)用相應(yīng)的處理程序來接收數(shù)據(jù)。如果中斷狀態(tài)寄存器顯示接收到數(shù)據(jù)或者接收到有錯(cuò)誤的數(shù)據(jù)時(shí),就調(diào)用ei—receive()函數(shù)進(jìn)行數(shù)據(jù)的接收。在ei—receive()函數(shù)中要正確設(shè)定邊界指針寄存器(BNRY)和當(dāng)前頁寄存器(CPR)的內(nèi)容,當(dāng)BNRY或者CPR等于頁停止寄存器(PSTOP)時(shí),把它們的內(nèi)容設(shè)置成頁開始寄存器(PSTART).當(dāng)CPR=BNRY時(shí),表示緩沖區(qū)全部被存滿,數(shù)據(jù)沒有被用戶讀走,這時(shí)網(wǎng)卡將停止往內(nèi)存寫數(shù)據(jù),新收到的數(shù)據(jù)包將被丟棄不要,而不覆蓋舊的數(shù)據(jù);當(dāng)CPR=BNRY+1時(shí),表示網(wǎng)卡的接收緩沖區(qū)里沒有數(shù)據(jù),用戶通過這個(gè)判斷知道沒有包可以讀,當(dāng)CPR!=BNRY+1時(shí),表示接收到新的數(shù)據(jù)包。
結(jié)束語
篇8
關(guān)鍵詞:網(wǎng)絡(luò)教學(xué);遠(yuǎn)程控制;Socket技術(shù);輸入/輸出
中圖分類號(hào):TP399
隨著信息技術(shù)的發(fā)展,目前社會(huì)已經(jīng)進(jìn)入信息時(shí)代。在信息時(shí)代,信息量呈爆炸式增長(zhǎng),知識(shí)的更新速度越來越快,人才競(jìng)爭(zhēng)越來越激烈,人們的教育也開始從“學(xué)校教育”朝“全民教育”、“終生教育”方向發(fā)展。目前網(wǎng)絡(luò)已經(jīng)成為了社會(huì)上最為有效的信息獲取工具之一,網(wǎng)絡(luò)教學(xué)的信息傳遞便捷、信息量大,因此網(wǎng)絡(luò)遠(yuǎn)程教學(xué)已經(jīng)成為了目前最為有效地終身教育和全民教育方式。在網(wǎng)絡(luò)教學(xué)中,可以采用視頻、音頻、動(dòng)畫等豐富的多媒體教學(xué)手段來進(jìn)行多媒體教學(xué),但是由于教育者和受教育者受到空間的限制,導(dǎo)致網(wǎng)絡(luò)教學(xué)的交互性較弱。而遠(yuǎn)程控制技術(shù)可以在一定程度上增強(qiáng)網(wǎng)絡(luò)教學(xué)的交互性,因此在網(wǎng)絡(luò)教學(xué)中廣泛應(yīng)用。
1 遠(yuǎn)程控制需求分析
處理器、存儲(chǔ)器和輸入/輸出時(shí)在計(jì)算機(jī)模型中的主要組成部分,其中輸入/輸出模塊式計(jì)算機(jī)系統(tǒng)與用戶進(jìn)行交互的主要方式。因此,為了提高網(wǎng)絡(luò)教學(xué)的交互性,遠(yuǎn)程控制的基本需求就是能夠通過教學(xué)端和學(xué)習(xí)端的輸入/輸出共享。而針對(duì)目前計(jì)算機(jī)系統(tǒng)以鍵盤、鼠標(biāo)輸入和屏幕圖像輸出的主流方式,遠(yuǎn)程控制需要實(shí)現(xiàn)如下的功能:(1)可以記錄提取遠(yuǎn)端計(jì)算機(jī)的鍵盤、鼠標(biāo)輸入事件;(2)可以在本地計(jì)算機(jī)上響應(yīng)遠(yuǎn)端的鍵盤、鼠標(biāo)事件;(3)能夠獲取目標(biāo)計(jì)算機(jī)的屏幕圖像,并且在本地計(jì)算機(jī)上顯示。
2 遠(yuǎn)程控制接口設(shè)計(jì)
通過對(duì)遠(yuǎn)程控制需求的分析,遠(yuǎn)程控制的實(shí)現(xiàn)需要如下的接口來實(shí)現(xiàn)遠(yuǎn)端計(jì)算機(jī)和本地計(jì)算機(jī)之間的信息通信。
3 基于Socket的遠(yuǎn)程控制通信
為了方便鼠標(biāo)事件、鍵盤事件和屏幕截屏數(shù)據(jù)在因特網(wǎng)上的傳輸,在網(wǎng)絡(luò)教學(xué)的遠(yuǎn)程控制中可以采用基于TCP/IP通信協(xié)議的Socket通信技術(shù)實(shí)現(xiàn)鼠標(biāo)事件、鍵盤事件和屏幕截屏數(shù)據(jù)的傳輸。在遠(yuǎn)程控制技術(shù)中,師生端Socket的通信實(shí)現(xiàn)流程如下所示:
3.1 建立Socket服務(wù)端。在需要接受遠(yuǎn)程控制的學(xué)生端建立服務(wù)器套接字,準(zhǔn)備接受教師端的鼠標(biāo)、鍵盤事件,并且將截屏圖像信息通過該套接字進(jìn)行傳輸。在Java技術(shù)中,建立Socket服務(wù)器端的代碼表示如下:
//建立Socket服務(wù)端,并且監(jiān)聽7088端口
ServerSocket ss=new ServerSocket(7088);
通過如上的方式可以非常便捷的建立Socket服務(wù)端,同時(shí)也可以使用其他接口來限制連接該Socket服務(wù)器的客戶端數(shù)量,或者綁定到某個(gè)具體的服務(wù)器IP地址。
3.2 等待客戶端連接。在建立Socket服務(wù)端,并且監(jiān)聽了本地計(jì)算機(jī)某個(gè)具體的通信端口之后,就可以使用accept()接口來監(jiān)聽客戶端的連接。accept()接口是一種阻塞I/O操作,會(huì)持續(xù)監(jiān)聽通信端口,直到接收到某個(gè)來自客戶端的連接,在遠(yuǎn)程控制技術(shù)中,可以使用多線程循環(huán)監(jiān)聽端口,以實(shí)現(xiàn)持續(xù)的遠(yuǎn)程操作。
3.3 接收客戶端請(qǐng)求。在建立Socket服務(wù)器端,并且與客戶端建立連接之后,教師端和學(xué)生端就可以通過建立的Socket連接進(jìn)行鼠標(biāo)/鍵盤事件和屏幕圖像的網(wǎng)絡(luò)傳輸。一個(gè)完整的遠(yuǎn)程控制通信實(shí)現(xiàn)如下所示:
4 結(jié)束語
遠(yuǎn)程控制技術(shù)的發(fā)展增加了網(wǎng)絡(luò)教學(xué)的“真實(shí)”性,可以更加方便的實(shí)現(xiàn)師生的交互。因此,遠(yuǎn)程技術(shù)的發(fā)展可以更好的促進(jìn)網(wǎng)絡(luò)教育教學(xué)的發(fā)展。
參考文獻(xiàn):
[1]蔣方劍,周鵬,劉福啟.適合中小型院校的多媒體全自動(dòng)控制系統(tǒng)的研究[J].中國現(xiàn)代教育裝備,2011(13):18-19.
[2]MillerK,Pegah M.Virtualization,Virtually at the Desktop[Z].The Special Interest Group on University andCollege Computing Services,2007:255-260.
[3]Niraj Tolia,David G,Andersen,M.Satyanarayan.Quantifying Interactive User Experience on Thin Clients[J].IEEE Computer,2006.
篇9
關(guān)鍵詞JAVA,網(wǎng)絡(luò),SOCKET,APPLET
網(wǎng)絡(luò)上的系統(tǒng)結(jié)構(gòu)多為客戶/服務(wù)器模式,服務(wù)器端負(fù)責(zé)數(shù)據(jù)和圖像等的存儲(chǔ)、維護(hù)、管理以及傳遞,客戶端則負(fù)責(zé)人機(jī)界面的操作、送出需求及顯示收回的數(shù)據(jù)。
下面介紹一下如何使用JAVA來進(jìn)行網(wǎng)絡(luò)編程:
1)由于客戶端通過IE同服務(wù)器建立聯(lián)系,所以客戶端使用Applet,服務(wù)器端使用Application;
2)服務(wù)器應(yīng)設(shè)置成多線程,應(yīng)答多個(gè)客戶的請(qǐng)求;
3)兩端通信使用SOCKET機(jī)制。
1Java中輸入/輸出流概念:
過濾流DataInputStream和DataOutputStream除了分別作為FilterInputStream和FilterOutputStream的子類外,還分別實(shí)現(xiàn)了接口DataInput和DataOutput。接口DataInput中定義的方法主要包括從流中讀取基本類型的數(shù)據(jù)、讀取一行數(shù)據(jù)、或者讀取指定長(zhǎng)度的字節(jié)數(shù),如readBoolean()readInt()、readLine()、readFully()等。接口DataOutput中定義的方法主要是向流中寫入基本類型的數(shù)據(jù)或者寫入一定長(zhǎng)度的字節(jié)數(shù)組,如writeChar()、writeDouble()DataInputStream可以從所連接的輸入流中讀取與機(jī)器無關(guān)的基本類型數(shù)據(jù),用以實(shí)現(xiàn)一種獨(dú)立于具體平臺(tái)的輸入方式;DataInputStream可以向所連接的輸出流寫入基本類型的數(shù)據(jù)。
2Socket機(jī)制
Socket是面向客戶/服務(wù)器模型設(shè)計(jì)的,網(wǎng)絡(luò)上的兩個(gè)程序通過一個(gè)雙向的通訊連接實(shí)現(xiàn)數(shù)據(jù)的交換,這個(gè)雙向鏈路的一端稱為一個(gè)Socket。Socket通常用來實(shí)現(xiàn)客戶方和服務(wù)方的連接??蛻舫绦蚩梢韵騍ocket寫請(qǐng)求,服務(wù)器將處理此請(qǐng)求,然后通過Socket將結(jié)果返回給用戶。
Socket通信機(jī)制提供了兩種通訊方式:有聯(lián)接和無聯(lián)接方式,分別面向不同的應(yīng)用需求。使用有聯(lián)接方式時(shí),通信鏈路提供了可靠的,全雙工的字節(jié)流服務(wù)。在該方式下,通信雙方必須創(chuàng)建一個(gè)聯(lián)接過程并建立一條通訊鏈路,以后的網(wǎng)絡(luò)通信操作完全在這一對(duì)進(jìn)程之間進(jìn)行,通信完畢關(guān)閉此聯(lián)接過程。使用無聯(lián)接方式時(shí)其系統(tǒng)開銷比無聯(lián)接方式小,但通信鏈路提供了不可靠的數(shù)據(jù)報(bào)服務(wù),不能保證信源所傳輸?shù)臄?shù)據(jù)一定能夠到達(dá)信宿。在該方式下,通信雙方不必創(chuàng)建一個(gè)聯(lián)接過程和建立一條通訊鏈路,網(wǎng)絡(luò)通信操作在不同的主機(jī)和進(jìn)程之間轉(zhuǎn)發(fā)進(jìn)行。
3Java語言
Java語言的優(yōu)點(diǎn)主要表現(xiàn)在:簡(jiǎn)單、面向?qū)ο蟆⒍嗑€程、分布性、體系結(jié)構(gòu)中立、安全性等方面。
(1)簡(jiǎn)單性
Java與C++語言非常相近,但Java比C++簡(jiǎn)單,它拋棄了C++中的一些不是絕對(duì)必要的功能,如頭文件、預(yù)處理文件、指針、結(jié)構(gòu)、運(yùn)算符重載、多重繼承以及自動(dòng)強(qiáng)迫同型。Java實(shí)現(xiàn)了自動(dòng)的垃圾收集,簡(jiǎn)化了內(nèi)存管理的工作。這使程序設(shè)計(jì)更加簡(jiǎn)便,同時(shí)減少了出錯(cuò)的可能。
(2)面向?qū)ο?/p>
Java提供了簡(jiǎn)單的類機(jī)制和動(dòng)態(tài)的構(gòu)架模型。對(duì)象中封裝了它的狀態(tài)變量和方法,很好地實(shí)現(xiàn)了模塊化和信息隱藏;而類則提供了一類對(duì)象的原型,通過繼承和重載機(jī)制,子類可以使用或重新定義父類或超類所提供的方法,從而既實(shí)現(xiàn)了代碼的復(fù)用,又提供了一種動(dòng)態(tài)的解決方案。
Java是一種完全面向?qū)ο蟮某绦蛟O(shè)計(jì)語言,它除了數(shù)組、布爾和字符三個(gè)基本數(shù)據(jù)類型外的其它類都是對(duì)象,它不再支持全局變量。在Java中,如果不創(chuàng)建新類就無法創(chuàng)建程序,Java程序在運(yùn)行時(shí)必須先創(chuàng)建一個(gè)類的實(shí)例,然后才能提交運(yùn)行。
Java同樣支持繼承特性,Java的類可以從其它類中繼承行為,但Java只支持類的單重繼承,即每個(gè)類只能從一個(gè)類中繼承。
Java支持界面,界面允許程序員定義方法但又不立即實(shí)現(xiàn),一個(gè)類可以實(shí)現(xiàn)多個(gè)界面,利用界面可以得到多重繼承的許多優(yōu)點(diǎn)而又沒有多重繼承的問題。
(3)多線程
多線程使應(yīng)用程序可以同時(shí)進(jìn)行不同的操作,處理不同的事件。在多線程機(jī)制中,不同的線程處理不同的任務(wù),他們之間互不干涉,不會(huì)由于一處等待影響其他部分,這樣容易實(shí)現(xiàn)網(wǎng)絡(luò)上的實(shí)時(shí)交互操作。
Java程序可以有多個(gè)執(zhí)行線程,如可以讓一個(gè)線程進(jìn)行復(fù)雜的計(jì)算,而讓另一個(gè)線程與用戶進(jìn)行交互,這樣用戶可以在不中斷計(jì)算線程的前提下與系統(tǒng)進(jìn)行交互。多線程保證了較高的執(zhí)行效率。
(4)分布性
Java是面向網(wǎng)絡(luò)的語言。通過它提供的類庫可以處理TCP/IP協(xié)議,用戶可以通過URL地址在網(wǎng)絡(luò)上很方便的訪問其他對(duì)象。
(5)體系結(jié)構(gòu)中立
Java是一種網(wǎng)絡(luò)語言,為使Java程序能在網(wǎng)絡(luò)的任何地方運(yùn)行,Java解釋器生成與體系結(jié)構(gòu)無關(guān)的字節(jié)碼結(jié)構(gòu)的文件格式。Java為了做到結(jié)構(gòu)中立,除生成機(jī)器無關(guān)的字節(jié)碼外,還制定了完全統(tǒng)一的語言文本,如Java的基本數(shù)據(jù)類型不會(huì)隨目標(biāo)機(jī)的變化而變化,一個(gè)整型總是32位,一個(gè)長(zhǎng)整型總是64位。
為了使Java的應(yīng)用程序能不依賴于具體的系統(tǒng),Java語言環(huán)境還提供了用于訪問底層操作系統(tǒng)功能的類組成的包,當(dāng)程序使用這些包時(shí),可以確保它能運(yùn)行在各種支持Java的平臺(tái)上。
java.lang:一般的語言包。其中包括用于字符串處理、多線程、異常處理和數(shù)字函數(shù)等的類,該包是實(shí)現(xiàn)Java程序運(yùn)行平臺(tái)的基本包
java.util:實(shí)用工具包。其中包括哈希表、堆棧、時(shí)間和日期等
java.io:基于流模型的輸入/輸出包。該包用統(tǒng)一的流模型實(shí)現(xiàn)了各種格式的輸入/輸出,包括文件系統(tǒng)、網(wǎng)絡(luò)和設(shè)備的輸入/輸出等
:網(wǎng)絡(luò)包。該包支持TCP/IP協(xié)議,其中提供了socket、URL和WWW的編程接口
java.awt:抽象窗口工具集。其中實(shí)現(xiàn)了可以跨平臺(tái)的圖形用戶界面組件,包括窗口、菜單、滾動(dòng)條和對(duì)話框等
java.applet:支持applet程序設(shè)計(jì)的基本包
(6)安全性
用于網(wǎng)絡(luò)、分布環(huán)境下的Java必須要防止病毒的入侵,Java不支持指針,一切對(duì)內(nèi)存的訪問都必須通過對(duì)象的實(shí)例變量來實(shí)現(xiàn),這樣就防止了程序員使用欺騙手段訪問對(duì)象的私有成員,同時(shí)也避免了指針操作中容易產(chǎn)生的錯(cuò)誤。
4JAVA工具
(1)JDK
1)Java編譯器
Java編譯器將Java源代碼文件編譯成可執(zhí)行的Java字節(jié)碼。Java源代碼文件的擴(kuò)展名為.java,Java編譯器把這種擴(kuò)展名的文件編譯成擴(kuò)展名為.class的文件。源文件中的每個(gè)類在編譯后都將產(chǎn)生一個(gè)class文件,這意味一個(gè)Java源代碼文件可能編譯生成多個(gè)class文件。
2)Java解釋器
Java解釋器對(duì)編譯生成的字節(jié)碼格式的可執(zhí)行程序的運(yùn)行提供支持,它是運(yùn)行非圖形Java程序的命令行工具。
3)Appletviewer
它是JavaApplet的簡(jiǎn)單測(cè)試工具,可使用它來測(cè)試JavaApplet程序,而不需要WWW瀏覽器的支持。
(2)VisualJ++
VisualJ++集成了可視化界面設(shè)計(jì)、交互式調(diào)試、代碼編輯、聯(lián)機(jī)幫助信息和介紹如何快速掌握該開發(fā)環(huán)境的實(shí)用向?qū)У榷囗?xiàng)功能,同時(shí)具有能充分利用ActiveX和COM新技術(shù)的優(yōu)勢(shì)。利用VisualJ++可創(chuàng)建交互性很強(qiáng)的Internet應(yīng)用程序,是難得的Java開發(fā)系統(tǒng)。
5客戶機(jī)/服務(wù)器通信的實(shí)現(xiàn):
(1)Application同Applet的通信
兩端通過Socket機(jī)制進(jìn)行連接:
1)客戶端的編程流程:
?打開Socket,新建一個(gè)套接字;
?為套接字建立一個(gè)輸入和輸出流;
?根據(jù)服務(wù)器協(xié)議從套接字讀入或向套接字寫入;
?清除套接字和輸入/輸出流;
2)服務(wù)器端的編程流程:
?打開ServerSocket,創(chuàng)建一個(gè)服務(wù)器型套接字和一個(gè)普通套接字,服務(wù)器型套接字在指定端口為客戶端請(qǐng)求的Socket服務(wù);
?使用ServerSocket類的accept()方法使服務(wù)器型套接字處于監(jiān)聽狀態(tài)并把監(jiān)聽結(jié)果返回給普通套接字;
?為該普通套接字創(chuàng)建輸入和輸出流;
?從輸入和輸出流中讀入或?qū)懭胱止?jié)流,進(jìn)行相應(yīng)的處理,并將結(jié)果返回給客戶端;
?在客戶端和服務(wù)器工作結(jié)束后關(guān)閉所有的對(duì)象,如服務(wù)器型的套接字,普通套接字,輸入和輸出流。
正是由于Java系統(tǒng)具有基于Socket的靈活通信機(jī)制,因而其應(yīng)用程序能自由地打開和訪問網(wǎng)絡(luò)上的對(duì)象,就象在本地文件系統(tǒng)中一樣。
(2)Applet之間的通信:
Applet之間的通信使用AppletContext類的getApplet()方法。
<appletcode=applet1.classwidth=200height=200name=first>
只要在程序中加入
Appletoneapplet=getAppletContext().getApplet(“first”);便可使用name為first的Applet中的方法了。
在該課題中大量使用了該種通信方法,因?yàn)閷iT同服務(wù)器端通信的Applet中包含接收信息方法和發(fā)送信息方法,所有客戶端的Applet都要使用負(fù)責(zé)通信的Applet中的方法,所以客戶端的Applet同負(fù)責(zé)通信的Applet必須進(jìn)行通信。
6程序
//服務(wù)器端程序S.java負(fù)責(zé)與客戶端通信
importjava.io.*;
.*;
importjava.lang.*;
importT2;
classThreadEchoHandlerextendsThread//創(chuàng)建線程
{
T2theT2=newT2();
Socketincoming;
intcounter;
ThreadEchoHandler(Socketi,intc)
{incoming=i;
counter=c;}
publicvoidrun()
{
try
{
DataInputStreamin=newDataInputStream(incoming.getInputStream());
DataOutputStreamout=newDataOutputStream(incoming.getOutputStream());
System.out.println("hello");
booleandone=false;
while(!done)
{Stringaa="";
Stringstr=in.readUTF();//從客戶端得到字符串
//在此加入各自的服務(wù)程序
System.out.println(str);
theT2.pass(str);//解碼
theT2.tongji();//修改監(jiān)控庫中的信息
aa=theT2.guan();//操縱數(shù)據(jù)庫
System.out.println("stringzis:"+aa);
if(pareTo("null")!=0)
//若是查詢數(shù)據(jù)庫,返回查詢后的結(jié)果
{//若不是查詢數(shù)據(jù)庫,不向客戶端輸出信息
out.writeUTF(aa);
out.flush();}
}//while
incoming.close();//線程關(guān)閉
}//try
catch(IOExceptione)
{System.out.println(e);}
}//endrun
}
//----------------------------------------
classS
{
publicstaticvoidmain(String[]args)
{
inti=1;
try
{
ServerSockets=newServerSocket(1111);
for(;;)
{
Socketincoming=s.accept();
System.out.println("connect:"+i);
newThreadEchoHandler(incoming,i).start();
i++;
}
}
catch(Exceptione)
{System.out.println(e);}
}
}
//客戶端通信小應(yīng)用程序Echo.java
importjava.io.*;
.*;
importjava.awt.*;
importjava.applet.*;
publicclassEchoextendsApplet
{
TextAreata;
SocketechoSocket;
DataOutputStreamos;
DataInputStreamis;
StringLine;
publicvoidinit()
{
setBackground(Color.white);
ta=newTextArea(5,80);
ta.setEditable(false);
add(ta);
try
{echoSocket=newSocket("10.102.4.41",1111);}//與服務(wù)器建立連接
catch(IOExceptione)
{System.out.println("error");}
}
publicvoidst(Stringstri)//發(fā)送字符串的方法
{
try
{DataOutputStreamos=newDataOutputStream(echoSocket.getOutputStream());
DataInputStreamis=newDataInputStream(echoSocket.getInputStream());
os.writeUTF(""+stri);//向服務(wù)器輸送string
os.flush();
}
catch(IOExceptione)
{System.out.println("error:"+e);}
}
publicStringst1()//接收字符串的方法
{
StringLine="";
try
{DataOutputStreamos=newDataOutputStream(echoSocket.getOutputStream());
DataInputStreamis=newDataInputStream(echoSocket.getInputStream());
Line=is.readUTF();//從服務(wù)器讀來的信息
ta.appendText(""+Line);//在文本域中輸出信息
}
catch(IOExceptione)
{System.out.println("error:"+e);}
returnLine;
}
}
7程序調(diào)試心得:
1)在建立Socket連接時(shí),兩端的端口號(hào)必須設(shè)為一致,否則建立不了連接。服務(wù)器端必須有主機(jī)IP地址或主機(jī)名參數(shù)。
2)連接建立好之后應(yīng)確定輸入和輸出流。起初程序中用的是DataInputStream和PrintStream,結(jié)果只能傳輸英文,傳輸中文時(shí)產(chǎn)生亂碼,將PrintStream改為DataOutputStream,使用readUTF()和writeUTF()方法后,中文傳輸問題得到解決。
3)如果一個(gè)使用某端口的程序沒有關(guān)閉,另一個(gè)程序就不能使用這個(gè)端口。
4)開始進(jìn)行通信的程序均為Application,因不符合客戶機(jī)/服務(wù)器機(jī)制,應(yīng)將客戶端的Application改為Applet。其轉(zhuǎn)化的主要步驟如下:
?創(chuàng)建一個(gè)包含APPLET標(biāo)簽的HTML文件;
?去掉應(yīng)用程序中的main()方法;
?類名應(yīng)繼承Applet類,而不是Frame類,并在程序開頭加入
importjava.applet.*;語句;
?用init()方法代替Application程序中的構(gòu)造方法,當(dāng)瀏覽器創(chuàng)建Applet類對(duì)象的時(shí)候,它自動(dòng)執(zhí)行init()方法;
?如Application中缺省使用了BorderLayout布局管理器,應(yīng)在Applet的init()方法中重新設(shè)定;
?如果Application中有setTitle()方法,必須將其去掉,如Application中使用了菜單,在Applet中用按鈕來替換。
5)懂得了在一程序中如何引用自定義的類中的方法和變量,在程序開頭加入import類名;在程序中加入類名實(shí)例=new類名();然后使用
實(shí)例.方法(),實(shí)例.變量即可。
參考文獻(xiàn):
[1]廖雷等,Java程序設(shè)計(jì)教程,中國電力出版社,2003
篇10
關(guān)鍵詞:智能電器;無線通信;WiFi模塊;單片機(jī)
物聯(lián)網(wǎng)技術(shù)是當(dāng)代信息技術(shù)的一個(gè)重要標(biāo)志,改變了人們的生產(chǎn)生活方式,使傳統(tǒng)電器變得更加便捷而智能。智能電器是將微處理器、傳感器技術(shù)、網(wǎng)絡(luò)通信技術(shù)引入家電設(shè)備后形成的新型產(chǎn)品[1]。通信接口是智能電器的重要組成部分,用來實(shí)現(xiàn)通信節(jié)點(diǎn)之間信息的發(fā)送和接收。穩(wěn)定的通信接口為智能電器系統(tǒng)的正常運(yùn)行提供了有力保障。電器的控制方式分為有線控制和無線控制。有線控制是將控制器放置于強(qiáng)電箱內(nèi),開關(guān)和中控主機(jī)分別通過弱電控制線路進(jìn)行控制。有線控制的優(yōu)點(diǎn):安全、穩(wěn)定、不受干擾;有線控制的缺點(diǎn):方案設(shè)計(jì)要求高、線路架設(shè)要求高、后期拓展改動(dòng)困難。隨著物聯(lián)網(wǎng)和智能電器的發(fā)展,有線通信逐漸被無線通信所替代。當(dāng)前普遍使用的無線通信技術(shù)主要有RFID技術(shù)、藍(lán)牙技術(shù)、ZigBee通信技術(shù)、Z-Wave技術(shù)和WiFi技術(shù)[2,3]。WiFi通信技術(shù)是智能手機(jī)終端接入Internet的主流模式,其他類型的通信設(shè)備要接入Internet需要網(wǎng)關(guān)進(jìn)行轉(zhuǎn)換[4]。局域網(wǎng)絡(luò)中的無線路由多采用WiFi技術(shù)與各節(jié)點(diǎn)進(jìn)行無線通信,不用另設(shè)網(wǎng)關(guān)和網(wǎng)絡(luò)改造便可實(shí)現(xiàn)系統(tǒng)搭建。智能手機(jī)可以通過局域網(wǎng)和廣域網(wǎng)控制設(shè)備的工作狀態(tài)。
1智能電器系統(tǒng)構(gòu)成
智能家電系統(tǒng)由無線路由、智能終端、智能電器三大主要部分構(gòu)成,如圖1所示。無線路由為系統(tǒng)提供WiFi無線網(wǎng)絡(luò),是局域網(wǎng)絡(luò)通信的基礎(chǔ)部件,若要實(shí)現(xiàn)遠(yuǎn)程控制,需要與Internet連接進(jìn)行廣域網(wǎng)3G通信[5]。智能手機(jī)和平板電腦等智能終端可以在無線網(wǎng)絡(luò)下,對(duì)處于網(wǎng)絡(luò)中的智能電器節(jié)點(diǎn)進(jìn)行控制操作。智能家電內(nèi)需要集成WiFi無線通信模塊接收控制指令,實(shí)現(xiàn)電器的非接觸型智能控制。系統(tǒng)的操作流程:首先,配置模塊要連接的路由器的名稱(SSID)、密鑰和服務(wù)器的IP地址;然后,手機(jī)等控制終端連接服務(wù)器下達(dá)操作命令;最后,控制系統(tǒng)根據(jù)指令完成相應(yīng)的動(dòng)作或查詢等操作。智能手機(jī)和智能電器通常以STA站點(diǎn)形式入網(wǎng),即作為無線網(wǎng)絡(luò)的終端使用,形成客戶端-客戶端方式通信。也可以設(shè)置電器為AP,即作為無線接入點(diǎn)形成自組網(wǎng)絡(luò)。無線WiFi模塊在使用之前需要通過串口寫入智能電器的MAC地址、網(wǎng)絡(luò)名稱、密碼和IP等配置信息。圖2為智能電器的系統(tǒng)框圖。
2通信接口設(shè)計(jì)
2.1通信接口構(gòu)成在由路由器構(gòu)建的WLAN無線網(wǎng)絡(luò)中,智能手機(jī)可以和電器中的WiFi模塊進(jìn)行通信。通信串口WiFi模塊內(nèi)嵌TCP/IP協(xié)議,通信接口如圖3所示。硬件構(gòu)成主要是由內(nèi)嵌的一個(gè)單片機(jī)和WiFi模塊構(gòu)成,單片機(jī)主要實(shí)現(xiàn)裸機(jī)驅(qū)動(dòng)程序和TCP/IP協(xié)議;WiFi模塊則必須完成數(shù)據(jù)的無線接收和發(fā)送。模塊內(nèi)部集成了TCP/IP協(xié)議棧和WiFi模塊,用戶可以實(shí)現(xiàn)串口設(shè)備的無線網(wǎng)絡(luò)功能。嵌入式WiFi模塊對(duì)外提供UART串口或者SPI接口,其通信標(biāo)準(zhǔn)為IEEE802.11b/g,支持WPA/WPA2PSK加密,支持AES和TKIP加密算法。智能終端和WiFi模塊的通信格式常用的通信協(xié)議有HTTP、TCP/IP和Socket,HTTP是應(yīng)用層協(xié)議;TPC/IP協(xié)議是傳輸層協(xié)議;Socket是應(yīng)用層與TCP/IP協(xié)議的中間軟件,是對(duì)TCP/IP協(xié)議的封裝和應(yīng)用抽象層[6]。面向嵌入式系統(tǒng)的通信協(xié)議多采用Socket協(xié)議。2.2Socket通信協(xié)議軟件實(shí)現(xiàn)采用Socket通信協(xié)議客戶端的通信過程:①建立通信;②查詢連接;③發(fā)送數(shù)據(jù);④接收數(shù)據(jù);⑤關(guān)閉連接。Android手機(jī)建立連接指令為newSocket(HOST,PORT),關(guān)閉連接指令為socket.close(),發(fā)送數(shù)據(jù)調(diào)用getOutputStream()方法,接收數(shù)據(jù)調(diào)用getInputStream()方法。服務(wù)器的通信過程可概述為:1)建立服務(wù)器端的Socket,偵聽網(wǎng)絡(luò)中的連接請(qǐng)求;2)當(dāng)檢測(cè)到連接請(qǐng)求時(shí),向客戶端發(fā)送收到連接請(qǐng)求的信息并建立連接;3)完成通信后關(guān)閉Socket連接。圖4為客戶端和服務(wù)器的通信流程,圖中的bind()和listen()方法用來綁定并監(jiān)聽Socket和端口號(hào),accept()用來接收來自客戶端的連接請(qǐng)求。當(dāng)點(diǎn)擊智能手機(jī)界面上的功能按鍵,后臺(tái)會(huì)將數(shù)據(jù)以Socket格式發(fā)送給WiFi模塊,發(fā)送指令被電器控制系統(tǒng)接收后,便會(huì)執(zhí)行檢測(cè)、開啟、關(guān)斷、調(diào)節(jié)等響應(yīng)動(dòng)作,并可根據(jù)需要將執(zhí)行結(jié)果返回給智能手機(jī)。2.3單片機(jī)通信接口設(shè)計(jì)1)硬件設(shè)計(jì)通信接口和執(zhí)行機(jī)構(gòu)的硬件設(shè)計(jì)以單片機(jī)為核心,包括單片機(jī)最小系統(tǒng)及其電路設(shè)計(jì),把單片機(jī)、無線模塊、繼電器等模塊有機(jī)的結(jié)合在一起。WiFi模塊的TX和RX與其串口相連,負(fù)責(zé)信息指令的接收和發(fā)送;WiFi模塊和單片機(jī)的通信采用串口模式(UART),串口波特率可達(dá)115200bps,執(zhí)行命令由普通I/O口輸出,可控制執(zhí)行部件響應(yīng)動(dòng)作指令;配以光照、溫度等傳感器裝置送入單片機(jī)自帶ADC模擬數(shù)字轉(zhuǎn)換接口,可以檢測(cè)環(huán)境狀態(tài)并作出相應(yīng)動(dòng)作,使電器更加智能。圖5是單片機(jī)控制繼電器的硬件連接示意圖,WiFi模塊的UART_TX和UART_RX與單片機(jī)串口的RXD和TXD相連,完成UART口雙向通訊功能;繼電器K與普通I/O口相連,通過繼電器電路可以實(shí)現(xiàn)對(duì)智能電器的開關(guān)控制。當(dāng)模塊收到合上指令時(shí),輸出高電平,繼電器的線圈有電流流過,繼電器的觸點(diǎn)吸合,給負(fù)載供電;當(dāng)模塊收到斷開指令時(shí),端口輸出低電平,執(zhí)行斷電操作。設(shè)計(jì)了傳感器的AD轉(zhuǎn)換接口,實(shí)現(xiàn)了可以根據(jù)環(huán)境狀態(tài)的檢測(cè)結(jié)果控制繼電器的動(dòng)作。2)軟件設(shè)計(jì)單片機(jī)系統(tǒng)上電復(fù)位后,首先進(jìn)行硬件初始化,WiFi模塊的初始化在函數(shù)Config()中完成,在函數(shù)中完成波特率、初始化接收、發(fā)送數(shù)據(jù)的中斷類型等設(shè)置。模塊開啟后,尋找并連接網(wǎng)絡(luò),建立數(shù)據(jù)連接,由單片機(jī)封裝數(shù)據(jù)后通過WiFi模塊發(fā)送給智能手機(jī)。接收數(shù)據(jù)時(shí),單片機(jī)程序不斷地對(duì)WiFi模塊進(jìn)行掃描查詢,查詢數(shù)據(jù)緩沖區(qū)BUF中是否有數(shù)據(jù),當(dāng)查詢到模塊接收到手機(jī)用戶發(fā)送操作或者查詢指令時(shí),根據(jù)Socket協(xié)議格式提取相關(guān)信息,對(duì)指令進(jìn)行處理并執(zhí)行相關(guān)動(dòng)作,并通過UART串口返回?cái)?shù)據(jù)到手機(jī)端。接收手機(jī)端數(shù)據(jù)需要使用外部中斷來完成,能夠確保數(shù)據(jù)傳輸?shù)耐叫院蛯?shí)時(shí)性,接收8位為一幀有效數(shù)據(jù)。單片機(jī)主程序流程如圖6所示。單片機(jī)設(shè)置了監(jiān)測(cè)環(huán)境光照功能,由光敏傳感器經(jīng)過ADC芯片轉(zhuǎn)化后送到單片機(jī),數(shù)據(jù)與閾值電壓比較,當(dāng)超過閾值時(shí)關(guān)斷電器設(shè)備。
3結(jié)論
該智能電器通信系統(tǒng)在無線網(wǎng)絡(luò)的平臺(tái)下,在傳統(tǒng)電器上接入無線WiFi模塊,實(shí)現(xiàn)了智能終端對(duì)智能家電的遠(yuǎn)程監(jiān)測(cè)與控制功能,單片機(jī)能夠?qū)崟r(shí)的對(duì)接收到的指令進(jìn)行處理和響應(yīng),滿足了設(shè)計(jì)要求。該系統(tǒng)安全、可靠、性能穩(wěn)定。為大規(guī)模智能電器遠(yuǎn)程的監(jiān)管與控制提供了可能。
參考文獻(xiàn)
[1]劉遠(yuǎn)聰.物聯(lián)網(wǎng)智能家居遠(yuǎn)程控制技術(shù)的研究[D].蘭州:蘭州交通大學(xué),2015.
[2]曹方.物聯(lián)網(wǎng)與短距離無線通信[J].上海信息化,2013(5):32-35.
[3]鄭先海,呂海華,楊弘平.基于AndroidPN技術(shù)的Zig-bee無線網(wǎng)絡(luò)的物聯(lián)網(wǎng)數(shù)據(jù)采集[J].沈陽工程學(xué)院學(xué)報(bào):自然科學(xué)版,2014,10(4):370-372,381.
[4]吳吉義,李文娟,黃劍平,等.移動(dòng)互聯(lián)網(wǎng)研究綜述[J].中國科學(xué):信息科學(xué),2015,45(1):45-69.
[5]羅軍舟,吳文甲,楊明.移動(dòng)互聯(lián)網(wǎng):終端、網(wǎng)絡(luò)與服務(wù)[J].計(jì)算機(jī)學(xué)報(bào),2011,34(11):2029-2051.