socket通信范文
時間:2023-03-30 03:41:55
導語:如何才能寫好一篇socket通信,這就需要搜集整理更多的資料和文獻,歡迎閱讀由公務員之家整理的十篇范文,供你借鑒。
篇1
計算機網絡時代的到來推動了很多產業的發展升級,將計算機網絡技術應用到各行各業中是當前的發展潮流。計算機的網絡具有靈活性、開放性,網絡本身不受企業或廠商的控制,所以在許多行業都能夠發揮其價值。網絡編程是應用網絡發揮其價值的一個重要方式,而掌握SOCKET網絡編程技術能夠實現網絡通信的效能。本文就BSD Unix網絡版在套接字接口之上的網絡通信過程展開了分析討論。
一、TCP/IP協議在分層以及應用程序編程接口
基于TCP/IP的網絡能夠為應用程序供應兩個常規編程接口,分別為套接字接口和傳輸層接口,套接字接口便是本文所重點討論的SOCKET,SOCKET是在BSD Unix系統的基礎上開發并普及開的,傳輸層接口(TLI)是AT&T公司開發出的,SOCKET API具有普遍的通用性,能夠基于多種傳輸協議運行,當前已經發展成了網絡編程的既定事實標準,所以本文就通用性只討論套接字接口編程。
二、TCP/IP提供的服務以及編程模式
套接字實際上是IP地址在附上端口編號后,IP地址的標識網絡中單一主機,端口編號的標識能夠在主機之上展開工作的一個進程,能夠系統化展開網間通信則需要建立在兩個進程中,達成這一條件還需要共用相同的高層協議。
OSI術語里把網絡層下面的各分層視為通信子網,為實現網間的進程通信,在此基A上還要做到控制差錯、控制流量、管理各項連接、排序組合數據等功能,這就需要準備兩種服務方式,分別為無連接的服務和面向連接(虛電路)。
TCP/IP網絡應用中,進行通信工作的兩個進程之間會互相產生作用和聯系,為用戶供應所需求的服務,然后將數據回復到客戶的結果。
三、BSD Unix套接字接口網間進程的通信過程
SOCKET在TCP/IP基礎上所能夠提供的套接字類型主要有一下三種:
3.1流式套接字(SOCK STREAM)
流式套接字所提供的服務在連接上的應用比較多,能夠為用戶提供準確可靠的數據傳輸服務,并且保證了數據避免出錯,同時還也能夠避免多次重復發送,數據在傳輸過程中仍保持著隊列順序,對于數據還有準確的流量控制,防止了數據流超出限制值的出現。
3.2數據報式套接字(SOCK DGRAM)
數據報式套接字能夠為用戶提供無連接服務,獨立的服務包傳送出,對于錯誤沒有保證,數據在傳輸的過程中可能會丟失或出現重復發送的現象,另一端接受到的數據也是雜亂無序的,數據長度有限制:最大為64KB,網絡文件系統中(NFS)使用的便是數據報式套接字。
3.3原始式套接字(SOCK RAW)
原始式套接字的接口要求能夠實現對底層協議間的信息傳輸,比如IP、ICMP的直接訪問,這種訪問常常用在對新的協議實現情況以及訪問服務配置中的新設備的檢驗工作中,通常是不會為普通用戶提供的,所以本文并未展開深入研究。
四、總結
本文針對以SOCKET在編程上的應用展開的了分析討論,并對其在網絡通信功能的應用進行了研究。網絡編程是應用網絡發揮其價值的一個重要方式,而掌握SOCKET網絡編程技術能夠實現網絡通信的效能。本文就BSD Unix網絡版在套接字接口之上的網絡通信過程展開的研究仍不全面,需要更多的計算機網絡技術人員投入,深入的研究并將其應用于網絡通信領域。
參 考 文 獻
[1]歐軍,吳清秀,裴云,張洪. 基于socket的網絡通信技術研究[J]. 網絡安全技術與應用,2011,07:19-21.
[2]王遠洋,周淵平,郭煥麗. Linux下基于socket多線程并發通信的實現[J]. 微計算機信息,2009,15:70-72.
[3]王志偉,沈杰峰,郭啟峰,唐俊. 基于Socket的GPRS遠程數據采集方法[J]. 西華大學學報(自然科學版),2006,01:37-39+93+3.
篇2
關鍵詞:套接字;嵌入式Linux;網絡通信;TCP/IP協議
中圖分類號:G642.0 文獻標志碼:A 文章編號:1674-9324(2017)30-0274-02
一、引言
隨著數字信息技術和網絡技術的高速發展,嵌入式技術已經廣泛應用到各個領域、各類產業以及人們的日常生活等各方面,成為引人矚目的熱點。為適應嵌入式和網絡應用需求,標準的一種或多種網絡通信接口成為嵌入式系統的必備需求,需要TCP/IP協議支持。而socket是TCP/IP網絡最為通用的API,計算機可以通過這個端口與任何具有socket接口的設備通信。
二、socket簡介
TCP/IP是一組支持網絡通信的協議系統,其協議參考模型分4層:網絡接口層、互聯網層、傳輸層和應用層。網絡通信中一個非常重要的概念就是套接字(socket),它是介于網絡應用層和傳輸層之間的編程接口,在Linux網絡層次模型中的位置如圖1所示。套結字利用IP地址與端口號與Internet中的網絡進程一一對應,進而實現網絡通信。最常使用的socket有兩種:(1)數據流式socket(SOCK-STREAM),使用TCP協議,提供面向連接的可靠通信流;(2)數據報式socket(SOCK-DGRAM),使用UDP協議,提供無連接的服務,并且不保證可靠、無差錯。本文所使用的是流式套接字。
三、socket通信的設計與實現
1.socket通信過程。網絡程序具備Client/Server結構。下面分TCP Client端及TCP Server端為說明TCP網絡程序的流程,如圖2所示。
Server端啟動后,先調用socket()函數建立socket,其次通過bind()函數綁定socket和本地IP地址,然后調用listen()函數做好偵聽準備,再調用accept()函數進行接收。Client端建立socket后,通過connect()函數和Server端建立連接。之后即可調用send()和recv()來實現發送和接收。關閉socket通過調用close()來實現。
2.socket通信的實現。本實驗PC機上安裝的是Redhat 9.0版本的Linux操作系統,嵌入式實驗平臺采用三星S3C2410微處理器,嵌入式操作系統內核版本為2.4.18。分別編寫服務器端應用程序server.c和客戶端應用程序client.c,實現網絡通信,程序流程圖如圖3、圖4所示。
四、結果分析
設置PC機和目標平臺的IP地址分別為:192.168.1.20和192.168.1.22。PC機Linux終端和目標平臺分別運行Server和client程序,通過超級終端觀察到運行結果如圖5所示,可見PC機與目標平臺成功建立連接,實現通信,達到了預期目標。
五、結語
研究socket通信對開發具有網絡功能的嵌入式產品有著非常重要的作用。本文的實現對于嵌入式產品的網絡應用是一個很好的探索,對于同類系統的設計具有實際的參考和推廣價值。嵌入式系統與網絡的結合,必然使其具有更加廣闊的應用空間。
參考文獻:
[1]劉崢嶸.嵌入式Linux應用開發詳解[M].北京:機械工業出版社,2004:394-433.
篇3
(吉林大學物理學院,吉林長春130012)
摘要:為了適應在復雜實驗條件下對多個電源單元的管理控制,設計基于Socket網絡通信的多電源單元管理系統。為了對多電源單元的高效管理,Socket網絡通信采用的是異步通信連接,同步通信的通信模式,同時存儲電源數據(電壓、電流)到excel文件,方便查閱與記錄。實驗證明這種方式比單獨異步或者單獨同步通信方式都高效、準確。
關鍵字:C#;Socket;異步通信;同步通信;數據保存
中圖分類號:TN86?34 文獻標識碼:A 文章編號:1004?373X(2015)20?0137?03
收稿日期:2015?05?12
Multi?power management system based on Socket communicationXI Yongguang,FU 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
為了適應在復雜實驗條件下對多個電源單元的有效管理,運用C#語言編寫了基于Socket 網絡通信的多電源管理系統,并且能把每臺電源單元的數據保存到Excel 表格中,方便查閱與記錄。Socket 通信的同步通信方式是在客戶端在發送請求之后必須等到服務器回應之后才可以發送下一條請求,是阻塞通信方式。這樣的方式對于電源單元的管理比較準確。但對于多個電源單元同時管理時,就會出現連接長時間通信不上的問題。而異步連接就能很好的解決多個單元的連接問題,但是異步通信的缺點是對多電源單元管理時會出現數據錯亂的問題。本系統使用面向對象C#編程,采用了Socket 異步連接電源,同步通信收/發數據方式進行設計,很好地滿足了多電源管理系統的要求。
1 系統設計
1.1 Socket通信原理
1.1.1 服務器端的步驟
(1)在實用Socket之前,要首先初始化Socket,就是實用Socket初始化函數;
(2) 在初始化完成以后,就可以建立服務端的Socket,然后實用該Sokcet開始偵聽整個網絡中的連接請求;
(3)當檢測到來自客戶端的連接請求時,向客戶端發送收到連接請求的信息,并建立與客戶端的連接;
(4)在通信的過程中,服務器端產生的Socket會通過一個消息響應函數OnReceive來接收到達的數據,數據的發送可以使用Send()來完成;
(5)當完成通信后,服務器關閉與客戶端的Socket連接。
1.1.2 客戶端的步驟
(1)同樣的,初始化Socket,并建立客戶端的Socket,確定要連接的服務器的主機名和端口;
(2)發送連接請求到服務器,并等待服務器的回饋信息;
(3)連接成功后,與服務器進行數據的交互;
(4) 數據的讀取同服務端一樣,也是通過OnRe?ceive函數來完成的,數據的發送通過Send函數即可;
(5)數據處理完畢后,關閉自身的Socket連接。
1.2 Socket異步通信與同步通信
(1)異步通信方式
程序執行到發送、接收和監聽語句的時候,不論工作是否完成,都會繼續往下執行。并且在服務端不存時,仍然能繼續進行后繼工作的。
(2)同步通信方式
Socket 通信用TCP 協議進行編程時程序執行到發送、接收和監聽語句時,在未完成工作前不再繼續往下執行,即處于阻塞狀態,直到該語句完成某個工作后才繼續執行下一條語句。并且服務端不存、從而在拋出異常之前,是無法繼續進行后繼工作的。
1.3 主要設計思路
1.3.1 采用同步通信方式
同步通信方式如圖1所示。
1.3.2 采用異步通信方式
異步通信方式如圖2所示。
1.3.3 采用異步連接,同步通信的方式
電源管理系統界面,根據每個電源的IP 地址,端口,通過網口進行異步通信的連接,然后在界面上輸入需要的電源電壓電流數據,通過同步通信方式進行收/發數據,進而完成對電源的控制。管理界面還能保存電源的電壓電流變化的數據,方便以后查驗。
(1)Socket異步連接電源部分程序
2 實際測試
2.1 采用同步通信方式
測試過程中出現,在一個電源單元數據通信完成后,才能和下一個電源單元進行通信的情況。這樣的管理系統只能每次處理一個電源單體,不能實現對多電源管理的問題。
2.2 采用異步通信方式
在實驗測試過程中,能夠同時和多個電源單元進行通信,但是在通信過程中出現數據錯亂和數據發送延遲的問題。
2.3 采用異步連接,同步通信的方式
實驗測試,對電源單元和多電源單元進行多批次長時間的測試,系統是高效、準確的,數據保存也是實時準確的,如圖4所示。
3 結語
多電源單體管理系統能對多臺電源進行高效準確地管理,優點有:
(1)在復雜的實驗條件下,能實時高效準確地管理多個電源單元,能極大地簡化實驗過程,讓實驗更加高效精確。
(2)能在遠距離條件下,方便實驗人員操作復雜的電路實驗。
(3) 能實時精確地保存數據,方便數據的記錄和計算。
參考文獻
[1] 周晟,金甌,賀建飚,等.基于Socket的異構形平臺的網絡通信研究[J].計算機與數字工程,2006(5):4?8.
[2] STEVENS W R.TCP?IP 詳解卷一:協議[M].北京:機械工業出版社,2000.
[3] 張文,趙子銘.P2P網絡技術原理與C++開發案例[M].北京:人民郵電出版社,2008.
[4] 馬駿.C#程序設計及應用教程[M].北京:人民郵電出版社,2009.
[5] JONES A,OHLUND J.Windows網絡編程[M].北京:清華大學出版社,2002.
[6] 任柯.ZigBee多媒體教室電源管理系統設計與實現[J].西南民族大學學報:自然科學版,2012(4):669?673.
[7] 趙勇,黃東,張天開,等.基于μIP和Socket的遠程機房電源控制系統設計[J].電子設計工程,2015(4):40?43.
篇4
關鍵詞:嵌入式;Socket;串口通信;網絡通信
本文的背景是研究通過對攝像頭的遠程控制從而對運動圖像加以采集和處理。該系統的音視頻編解碼部分,是基于Windows系統用VC進行的開發,實現對圖像視頻的編解碼處理,攝像頭的遠程控制系統主要是通過Linux系統設計。統通過串口和網絡進行傳輸和控制。系統采用C/S模型,PC機作為client端,根據采集到的數據進行編解碼后,發送出對攝像頭的控制命令,通過網絡傳輸到ARM9平臺上,ARM平臺作為server端在接收到client端發送的命令后,通過串口發送命令來控制攝像頭。
1 串口通信
1.1 Linux下串口通信基本原理
Linux系統將設備和文件的操作都作為對文件的處理,所以對設備的操作,內核會返回一個文件描述符,需要將其作為參數傳給相對應的函數。Linux中所有的設備文件都放在“/dev”目錄下,通過“ttyS+編號”命名相應的串口資源,所以對應路徑是“/devttyS*”。因而可以相對文件讀寫那樣訪問一個串口設備。
1.2 Linux下的串口設置
首先要對串口進行設置,在termios.h完成對波特率等的設置。
struct termios
{tcflag t c iflag;
tcflag t c oflag;
tcflag t c cflag;
tcflag t c lflag;
cc t c cc [NCCS];
};
open()函數:int fd = open ("/dev/ttyS *", O RDWR|O NOCTTY|O NDELA Y);
然后調用read()和write()函數讀寫端口,返回實際讀寫的字節數,如果有錯誤發生則返回-1。
讀取串口結束后,首先恢復串口原始屬性,然后才可以關閉串口并退出程序。
1.3 串口控制應用程序
下面給出本系統中一個通過串口控制攝像頭的函數的一部分結構:
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 網絡通信
2.1 Socket基本原理介紹
Socket是一種通信機制,客戶/服務器系統既可以在本地單機上運行,也可以在網絡中運行。
首先需要了解socket中的一些重要函數:
1) 創建Socket:int socket( intdomain, inttype, intprotocol);
2) 配置Socket:bind函數指定本地信息int bind( intsocket, const structsockaddr* address, size_taddress_len);
3) 使用listen( )和accept( )函數獲取遠端信息:
Int listen(int socket, int backlog);
Int accept(int socket, struct sockaddr* address, size_t* address_len);
4) 通信處理:send( ),write( ),recv( ),read( )。
5) 通信結束:使用closesocket( )。
2.2 Windows和Linux下socket應用程序
客戶端程序:創建一個未命名的套接字,然后把它連接到服務器套接字server_socket上,向服務器寫一個字符,再讀回經服務器處理后的一個字符。
服務器端程序:首先創建一個服務器套接字,綁定到一個名字,然后創建一個監聽隊列,接收來自客戶程序的連接。
下面我們分別在Windows和Linux下進行socket編程,實現二者之間的通信,具體函數實現的主要部分如下:
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 結束語
本文設計了基于嵌入式平臺上可移動攝像頭遠程控制,對串口通信和網絡通信的原理和機制加以闡述,對串口驅動和網絡驅動的編寫提出了具體的方法,并且在實際的操作應用中給出了具體函數的編寫。本文所提供的處理方法已在實際的項目中的得到應用,對于其他的通過串口通信和網絡通信控制的設備,具有參考意義,今后我們還將展開進一步的相關研究。
參考文獻:
[1] 劉智國,張海春.基于S3C2410的嵌入式串口通信設計[J].微計算機信息(嵌入式與SOC),2009,25(4-2).
篇5
關鍵詞:網絡控制器;通信協議;Rabbit2000單片機;套接字;串口通信
中圖分類號:TN91 文獻標識碼:B
文章編號: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等網絡通信的出現,將串口通信與網絡通信相結合的趨勢越來越明顯,這是保護使用者既往投資和整體利益的一種有效辦法。本文所討論的通信技術就是將串口與網絡通信相結合并在實際應用中取得良好效果的一種通信解決方案。
“家校通”是利用現代信息技術實現家庭與學校實時溝通的教育網絡平臺,其組成部分為:家校互聯卡、讀卡器、無線網關、網絡控制器、短信發射接收機。網絡控制器的主要功能是通過無線網關從讀卡器獲取信息,并與互聯網服務平臺進行網絡通信,是家校通系統的核心。
2 網絡控制器的硬件平臺
根據網絡控制器的功能要求,考慮整體的性能、價格方面,CPU采用Rabbit2000單片機,他是Z-World公司特別為中小型控制器而設計的高性能8位微處理器。編譯環境為Dynamic C,提供Socket級TCP/IP編程。網絡控制器的硬件結構如圖1所示。
3 應用層通信協議
3.1 網絡控制器與讀卡器的串口通信協議
網絡控制器與讀卡器的通信主要通過異步串行RS 485接口,基于通用串行通信RS 485數據傳輸單元(字節格式)有不帶校驗位的10 b和帶奇偶校驗位的11 b兩種數據格式。為了提高數據傳送的效率和可靠性,采用無奇偶校驗位的10 b數據格式,并由BBC校驗生成校驗碼與數據一起發送。
開始標志讀卡器地址信息長度命令和參數校驗
2 B1 B2 B14 B1 B
(3)命令字:
A1:從讀卡器讀取一條記錄。
A2:控制器正確接收記錄信息后,返回更新記錄的讀地址命令,使地址指針指向下一條記錄。
A4:設置校正讀卡器時間。
A6:測試控制器與讀卡是否正常通信。
3.2 網絡控制器與服務平臺的網絡通信協議
網絡協議通常分不同的層次進行開發,每一層分別負責不同的通信功能。TCP/IP通常是一個4層協議,包括數據鏈路層、網絡層(含IP協議)、傳輸層(含TCP協議)和應用層。本網絡協議就是基于TCP/IP協議之上的應用層協議,采用請求應答的通信模式。考慮到協議的可靠性和實現的方便性,數據采用ASCII碼表示。
(1)報文組成
4 通信技術
控制器建立socket連接后,向服務器發送連接請求和數據傳輸,并實時判斷連接的有效性,在有效連接的狀態下,實現控制器、服務器、讀卡器三者的正常通訊,程序流程如圖2所示。
4.1 網絡通信技術的實現
socket初始化: 首先要對RTL8019AS的控制寄存器進行初始化配置,Dynamic C已將這部分配置封裝成函數放入REALTEK.LIB庫中,應用時只需調用相關函數。之后再調用函數庫dcrtcp.lib中的幾個簡單函數可完成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:一種是被動的方式,調用函數tcp[CD#*2]listen(),等待客戶端進行連接;一種是主動的方式,調用函數tcp[CD#*2]open(),根據相應的參數(IP地址和端口號)主動連接到服務器端。本通信技術采用的就是主動方式(作為客戶端)。
Socket數據的發送與接收:數據發送調用sock[CD#*2]write(&socket,str[CD#*2]send,str[CD#*2]send[CD#*2]len)。在讀取socket緩沖區數時,先判斷緩沖區中是否有數據,有數據再進行讀操用,同時有超時設置。
start[CD#*2]time=SEC[CD#*2]TIMER;
/*SEC[CD#*2]TIMER為秒級系統時間*/
end[CD#*2]time=start[CD#*2]time;
while((end[CD#*2]time
!recv[CD#*2]count)/*READ[CD#*2]TIME為設定的等待時間*/
{
str[CD#*2]recvbuf[CD#*2]len=sock[CD#*2]bytesready(&socket);
/*判斷socket讀緩沖區是否有數據*/
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 串口通信技術的實現
主要包含3個步驟:命令字的組合,設置串口D,通過設置Rabbit2000的PE3來控制數據的發送與接收。以A6命令為例,程序主體框架如下:
command[0]=0xA6;/*A6命令*/
create[CD#*2]command(addr,command,pack);
/*組合命令字*/
serDopen(9600);/*9600為波特率*/
send[CD#*2]command(command,returnlen);/*發送數據*/
read[CD#*2]command(readbuf,sizeof(readbuf),10);
/*接收數據*/
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 數據采集與分析
網絡控制器聯網正常運行時,向服務器發送的一包測試記錄數據為:
對數據包進行分析:0244為數據包的總長度,01為協議版本號,02為命令字,000003為序列號,21000102*****為設備號,09為數據包中的刷卡記錄總數,0080D122為測試卡號,07070414152715為刷卡時間(順序為年周月日時分秒),03為狀態。
采集從服務器返回的命令:001501020000031,其中
列號,1為正確接收。返回命令格式符合協議要求,內容正確。
網絡控制器向讀卡器發送的命令(以A6為例): aa ff 01 00 03 a6 41 41 f1,其中aa ff表示本命令為控制器發給讀卡器,01為讀卡器地址,00 03為數據長度,a6為命令字,41 41為測試數據,f1為校驗位。
采集從讀卡器返回的命令:bb ff 01 00 02 41 41 47 d1 22 07 07 04 14 15 42 17 1 6b 00 00 00,其中bb ff表示本命令為讀卡器發給控制器,01為讀卡器地址,00 02為數據長度,41 41為測試數據,47為校驗位,之后的為無效數據。
6 結 語
基于Rabbit2000實現串口與網絡結合的通信技術可以實時、準確地對數據進行處理、發送與接收。由采集到的數據表明數據收發的正確性,證明了本通信技術的可行性與可靠性。本通信技術已在家校通系統中取得了良好的通信效果,并可應用于其他數據傳輸系統中,具有廣泛的發展前景。
參 考 文 獻
[1]Z-World Inc.Rabbit2000 Microprocessor Designer′s Hand-book,2003.
[2]Z-WorldInc.Dynamic C TCP/IP User′s Manual,2003.
[3]林麗,朱宏.基于Rabbit2000的網絡通信技術[J].福建電腦,2005(4):45-46.
篇6
關鍵詞 JAVA,網絡,SOCKET,APPLET
網絡上的系統結構多為客戶/服務器模式,服務器端負責數據和圖像等的存儲、維護、管理以及傳遞,客戶端則負責人機界面的操作、送出需求及顯示收回的數據。
下面介紹一下如何使用JAVA來進行網絡編程:
1) 由于客戶端通過IE同服務器建立聯系,所以客戶端使用Applet,服務器端使用Application;
2) 服務器應設置成多線程,應答多個客戶的請求;
3) 兩端通信使用SOCKET機制。
1 Java中輸入/輸出流概念:
過濾流DataInputStream 和DataOutputStream 除了分別作為FilterInputStream 和FilterOutputStream的子類外,還分別實現了接口DataInput 和DataOutput。接口DataInput 中定義的方法主要包括從流中讀取基本類型的數據、讀取一行數據、或者讀取指定長度的字節數,如readBoolean() readInt()、readLine()、readFully()等。接口DataOutput中定義的方法主要是向流中寫入基本類型的數據或者寫入一定長度的字節數組,如writeChar()、writeDouble() DataInputStream可以從所連接的輸入流中讀取與機器無關的基本類型數據,用以實現一種獨立于具體平臺的輸入方式;DataInputStream 可以向所連接的輸出流寫入基本類型的數據。
2 Socket 機制
Socket是面向客戶/服務器模型設計的,網絡上的兩個程序通過一個雙向的通訊連接實現數據的交換,這個雙向鏈路的一端稱為一個Socket。 Socket通常用來實現客戶方和服務方的連接。客戶程序可以向Socket寫請求,服務器將處理此請求,然后通過Socket將結果返回給用戶。
Socket通信機制提供了兩種通訊方式:有聯接和無聯接方式,分別面向不同的應用需求。使用有聯接方式時,通信鏈路提供了可靠的,全雙工的字節流服務。在該方式下,通信雙方必須創建一個聯接過程并建立一條通訊鏈路,以后的網絡通信操作完全在這一對進程之間進行,通信完畢關閉此聯接過程。使用無聯接方式時其系統開銷比無聯接方式小,但通信鏈路提供了不可靠的數據報服務,不能保證信源所傳輸的數據一定能夠到達信宿。在該方式下,通信雙方不必創建一個聯接過程和建立一條通訊鏈路,網絡通信操作在不同的主機和進程之間轉發進行。
3 Java語言
Java語言的優點主要表現在:簡單、面向對象、多線程、分布性、體系結構中立、安全性等方面。
(1) 簡單性
Java與C++語言非常相近,但Java比C++簡單,它拋棄了C++中的一些不是絕對必要的功能,如頭文件、預處理文件、指針、結構、運算符重載、多重繼承以及自動強迫同型。 Java實現了自動的垃圾收集,簡化了內存管理的工作。這使程序設計更加簡便,同時減少了出錯的可能。
(2) 面向對象
Java提供了簡單的類機制和動態的構架模型。對象中封裝了它的狀態變量和方法,很好地實現了模塊化和信息隱藏;而類則提供了一類對象的原型,通過繼承和重載機制,子類可以使用或重新定義父類或超類所提供的方法,從而既實現了代碼的復用,又提供了一種動態的解決方案。
Java是一種完全面向對象的程序設計語言,它除了數組、布爾和字符三個基本數據類型外的其它類都是對象,它不再支持全局變量。在Java中,如果不創建新類就無法創建程序,Java程序在運行時必須先創建一個類的實例,然后才能提交運行。
Java同樣支持繼承特性,Java的類可以從其它類中繼承行為,但Java只支持類的單重繼承,即每個類只能從一個類中繼承。
Java支持界面,界面允許程序員定義方法但又不立即實現,一個類可以實現多個界面,利用界面可以得到多重繼承的許多優點而又沒有多重繼承的問題。
(3) 多線程
多線程使應用程序可以同時進行不同的操作,處理不同的事件。在多線程機制中,不同的線程處理不同的任務,他們之間互不干涉,不會由于一處等待影響其他部分,這樣容易實現網絡上的實時交互操作。
Java程序可以有多個執行線程,如可以讓一個線程進行復雜的計算,而讓另一個線程與用戶進行交互,這樣用戶可以在不中斷計算線程的前提下與系統進行交互。多線程保證了較高的執行效率。
(4) 分布性
Java是面向網絡的語言。通過它提供的類庫可以處理TCP/IP協議,用戶可以通過URL地址在網絡上很方便的訪問其他對象。
(5) 體系結構中立
Java是一種網絡語言,為使Java程序能在網絡的任何地方運行,Java解釋器生成與體系結構無關的字節碼結構的文件格式。Java為了做到結構中立,除生成機器無關的字節碼外,還制定了完全統一的語言文本,如Java的基本數據類型不會隨目標機的變化而變化,一個整型總是32位,一個長整型總是64位。
為了使Java的應用程序能不依賴于具體的系統,Java語言環境還提供了用于訪問底層操作系統功能的類組成的包,當程序使用這些包時,可以確保它能運行在各種支持Java的平臺上。
java.lang: 一般的語言包。其中包括用于字符串處理、多線程、異常處理和數字函數等的類,該包是實現Java程序運行平臺的基本包
java.util: 實用工具包。其中包括哈希表、堆棧、時間和日期等
java.io: 基于流模型的輸入/輸出包。該包用統一的流模型實現了各種格式的輸入/輸出,包括文件系統、網絡和設備的輸入/輸出等
java.net: 網絡包。該包支持TCP/IP協議,其中提供了socket、URL和WWW的編程接口
java.awt: 抽象窗口工具集。其中實現了可以跨平臺的圖形用戶界面組件,包括窗口、菜單、滾動條和對話框等
java.applet: 支持applet程序設計的基本包
(6) 安全性
用于網絡、分布環境下的Java必須要防止病毒的入侵,Java不支持指針,一切對內存的訪問都必須通過對象的實例變量來實現,這樣就防止了程序員使用欺騙手段訪問對象的私有成員,同時也避免了指針操作中容易產生的錯誤。
4 JAVA工具
(1) JDK
1) Java編譯器
Java編譯器將Java源代碼文件編譯成可執行的Java字節碼。Java源代碼文件的擴展名為 .java,Java編譯器把這種擴展名的文件編譯成擴展名為.class的文件。源文件中的每個類在編譯后都將產生一個class文件,這意味一個Java源代碼文件可能編譯生成多個class文件。
2) Java解釋器
Java解釋器對編譯生成的字節碼格式的可執行程序的運行提供支持,它是運行非圖形Java程序的命令行工具。
3) Appletviewer
它是Java Applet的簡單測試工具,可使用它來測試Java Applet程序,而不需要WWW瀏覽器的支持。
(2) Visual J++
Visual J++ 集成了可視化界面設計、交互式調試、代碼編輯、聯機幫助信息和介紹如何快速掌握該開發環境的實用向導等多項功能,同時具有能充分利用Active X和COM新技術的優勢。利用Visual J++可創建交互性很強的Internet應用程序,是難得的Java 開發系統。
5 客戶機/服務器通信的實現:
(1) Application 同 Applet 的通信
兩端通過Socket機制進行連接:
1) 客戶端的編程流程:
? 打開Socket,新建一個套接字;
? 為套接字建立一個輸入和輸出流;
? 根據服務器協議從套接字讀入或向套接字寫入;
? 清除套接字和輸入/輸出流;
2)服務器端的編程流程:
? 打開Server Socket,創建一個服務器型套接字和一個普通套接字,服務器型套接字在指定端口為客戶端請求的Socket 服務;
? 使用ServerSocket類的accept()方法使服務器型套接字處于監聽狀態并把監聽結果返回給普通套接字;
? 為該普通套接字創建輸入和輸出流;
? 從輸入和輸出流中讀入或寫入字節流,進行相應的處理,并將結果返回給客戶端;
? 在客戶端和服務器工作結束后關閉所有的對象,如服務器型的套接字,普通套接字,輸入和輸出流。
正是由于Java系統具有基于Socket的靈活通信機制,因而其應用程序能自由地打開和訪問網絡上的對象,就象在本地文件系統中一樣。
(2) Applet之間的通信:
Applet之間的通信使用Applet Context類的getApplet()方法。
只要在程序中加入
Applet oneapplet=getAppletContext().getApplet(“first”);便可使用name為first的Applet中的方法了。
在該課題中大量使用了該種通信方法,因為專門同服務器端通信的 Applet中包含接收信息方法和發送信息方法,所有客戶端的Applet都要使用負責通信的Applet中的方法,所以客戶端的Applet同負責通信的Applet必須進行通信。
6 程序
//服務器端程序S.java 負責與客戶端通信
import java.io.*;
import java.net.*;
import java.lang.*;
import T2;
class ThreadEchoHandler extends Thread //創建線程
{
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(); //從客戶端得到字符串
//在此加入各自的服務程序
System.out.println (str);
theT2.pass(str); //解碼
theT2.tongji(); //修改監控庫中的信息
aa=theT2.guan(); //操縱數據庫
System.out.println ("string z is:"+aa);
if(aa.compareTo("null")!=0 )
//若是查詢數據庫,返回查詢后的結果
{ //若不是查詢數據庫,不向客戶端輸出信息
out.writeUTF(aa);
out.flush(); }
}//while
incoming.close(); //線程關閉
}//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); }
}
}
//客戶端通信小應用程序 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);} //與服務器建立連接
catch(IOException e)
{System.out.println("error");}
}
public void st(String stri) //發送字符串的方法
{
try
{ DataOutputStream os=new DataOutputStream(echoSocket.getOutputStream());
DataInputStream is=new DataInputStream(echoSocket.getInputStream());
os.writeUTF(""+ stri ); //向服務器輸送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(); //從服務器讀來的信息
ta.appendText(""+Line); //在文本域中輸出信息
}
catch(IOException e)
{System.out.println(" error:"+e); }
return Line;
}
}
7 程序調試心得:
1) 在建立Socket連接時,兩端的端口號必須設為一致,否則建立不了連接。服務器端必須有主機IP地址或主機名參數。
2) 連接建立好之后應確定輸入和輸出流。起初程序中用的是DataInputStream和PrintStream,結果只能傳輸英文,傳輸中文時產生亂碼,將PrintStream改為DataOutputStream,使用readUTF()和writeUTF()方法后,中文傳輸問題得到解決。
3) 如果一個使用某端口的程序沒有關閉,另一個程序就不能使用這個端口。
4) 開始進行通信的程序均為 Application,因不符合客戶機/服務器機制,應將客戶端的Application改為Applet。其轉化的主要步驟如下:
? 創建一個包含APPLET標簽的HTML文件;
? 去掉應用程序中的main()方法;
? 類名應繼承Applet類,而不是Frame類,并在程序開頭加入
import java.applet.*;語句;
? 用init()方法代替Application程序中的構造方法,當瀏覽器創建Applet類對象的時候,它自動執行init()方法;
? 如Application中缺省使用了BorderLayout布局管理器,應在Applet的init()方法中重新設定;
? 如果Application中有setTitle()方法,必須將其去掉,如Application中使用了菜單,在Applet 中用按鈕來替換。
5) 懂得了在一程序中如何引用自定義的類中的方法和變量,在程序開頭加入import 類名;在程序中加入 類名 實例=new 類名(); 然后使用
實例.方法(),實例.變量即可。
參考文獻
[1] 廖雷等,Java程序設計教程,中國電力出版社,2003
篇7
下面我將對LINUX平臺下網絡通信設計的工作流程、數據發送、數據接收三個模塊進行詳細的介紹。
1工作流程
首先調用SOCKET函數創建一個用于通信的套接字,然后給已經創建的套接字(SOCKET)綁定本地地址/端口號(Bind()),成功之后就在相應的SOCKET上監聽(Listen())。當Accept()函數捕捉到一個連接服務(Connect())請求時,接受并生成一個新的SOCKET,并通過這個新的SOCKET與客戶端連接,用Read()/Write()或相關函數讀取和發送數據,傳輸完畢時,用Close()關閉所有進程,結束這次通信。客戶端程序設計流程:客戶端也先要創建一個SOCKET,將該SOCKET與本地地址/端口號綁定,還需要指定服務器端的地址與端口號,隨后向服務器端發出連接(Connect())請求,請求被服務器端接受后,用函數進行了數據的接收與發送,傳輸完畢后,用Close()關閉套接口,通信結束。
2數據發送模塊
從應用層到物理層發送數據時,函數調用順序如下: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網絡連接創建好以后,就可以進行發送數據了。
3數據接收模塊
當網絡上的數據到達接收計算機時,網卡控制器產生中斷,調用該中斷的中斷處理程序ei—interrupt()。在這個函數中主要通過判斷中斷狀態寄存器(ISR)的內容,調用相應的處理程序來接收數據。如果中斷狀態寄存器顯示接收到數據或者接收到有錯誤的數據時,就調用ei—receive()函數進行數據的接收。在ei—receive()函數中要正確設定邊界指針寄存器(BNRY)和當前頁寄存器(CPR)的內容,當BNRY或者CPR等于頁停止寄存器(PSTOP)時,把它們的內容設置成頁開始寄存器(PSTART).當CPR=BNRY時,表示緩沖區全部被存滿,數據沒有被用戶讀走,這時網卡將停止往內存寫數據,新收到的數據包將被丟棄不要,而不覆蓋舊的數據;當CPR=BNRY+1時,表示網卡的接收緩沖區里沒有數據,用戶通過這個判斷知道沒有包可以讀,當CPR!=BNRY+1時,表示接收到新的數據包。
結束語
篇8
關鍵詞:網絡教學;遠程控制;Socket技術;輸入/輸出
中圖分類號:TP399
隨著信息技術的發展,目前社會已經進入信息時代。在信息時代,信息量呈爆炸式增長,知識的更新速度越來越快,人才競爭越來越激烈,人們的教育也開始從“學校教育”朝“全民教育”、“終生教育”方向發展。目前網絡已經成為了社會上最為有效的信息獲取工具之一,網絡教學的信息傳遞便捷、信息量大,因此網絡遠程教學已經成為了目前最為有效地終身教育和全民教育方式。在網絡教學中,可以采用視頻、音頻、動畫等豐富的多媒體教學手段來進行多媒體教學,但是由于教育者和受教育者受到空間的限制,導致網絡教學的交互性較弱。而遠程控制技術可以在一定程度上增強網絡教學的交互性,因此在網絡教學中廣泛應用。
1 遠程控制需求分析
處理器、存儲器和輸入/輸出時在計算機模型中的主要組成部分,其中輸入/輸出模塊式計算機系統與用戶進行交互的主要方式。因此,為了提高網絡教學的交互性,遠程控制的基本需求就是能夠通過教學端和學習端的輸入/輸出共享。而針對目前計算機系統以鍵盤、鼠標輸入和屏幕圖像輸出的主流方式,遠程控制需要實現如下的功能:(1)可以記錄提取遠端計算機的鍵盤、鼠標輸入事件;(2)可以在本地計算機上響應遠端的鍵盤、鼠標事件;(3)能夠獲取目標計算機的屏幕圖像,并且在本地計算機上顯示。
2 遠程控制接口設計
通過對遠程控制需求的分析,遠程控制的實現需要如下的接口來實現遠端計算機和本地計算機之間的信息通信。
3 基于Socket的遠程控制通信
為了方便鼠標事件、鍵盤事件和屏幕截屏數據在因特網上的傳輸,在網絡教學的遠程控制中可以采用基于TCP/IP通信協議的Socket通信技術實現鼠標事件、鍵盤事件和屏幕截屏數據的傳輸。在遠程控制技術中,師生端Socket的通信實現流程如下所示:
3.1 建立Socket服務端。在需要接受遠程控制的學生端建立服務器套接字,準備接受教師端的鼠標、鍵盤事件,并且將截屏圖像信息通過該套接字進行傳輸。在Java技術中,建立Socket服務器端的代碼表示如下:
//建立Socket服務端,并且監聽7088端口
ServerSocket ss=new ServerSocket(7088);
通過如上的方式可以非常便捷的建立Socket服務端,同時也可以使用其他接口來限制連接該Socket服務器的客戶端數量,或者綁定到某個具體的服務器IP地址。
3.2 等待客戶端連接。在建立Socket服務端,并且監聽了本地計算機某個具體的通信端口之后,就可以使用accept()接口來監聽客戶端的連接。accept()接口是一種阻塞I/O操作,會持續監聽通信端口,直到接收到某個來自客戶端的連接,在遠程控制技術中,可以使用多線程循環監聽端口,以實現持續的遠程操作。
3.3 接收客戶端請求。在建立Socket服務器端,并且與客戶端建立連接之后,教師端和學生端就可以通過建立的Socket連接進行鼠標/鍵盤事件和屏幕圖像的網絡傳輸。一個完整的遠程控制通信實現如下所示:
4 結束語
遠程控制技術的發展增加了網絡教學的“真實”性,可以更加方便的實現師生的交互。因此,遠程技術的發展可以更好的促進網絡教育教學的發展。
參考文獻:
[1]蔣方劍,周鵬,劉福啟.適合中小型院校的多媒體全自動控制系統的研究[J].中國現代教育裝備,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
關鍵詞JAVA,網絡,SOCKET,APPLET
網絡上的系統結構多為客戶/服務器模式,服務器端負責數據和圖像等的存儲、維護、管理以及傳遞,客戶端則負責人機界面的操作、送出需求及顯示收回的數據。
下面介紹一下如何使用JAVA來進行網絡編程:
1)由于客戶端通過IE同服務器建立聯系,所以客戶端使用Applet,服務器端使用Application;
2)服務器應設置成多線程,應答多個客戶的請求;
3)兩端通信使用SOCKET機制。
1Java中輸入/輸出流概念:
過濾流DataInputStream和DataOutputStream除了分別作為FilterInputStream和FilterOutputStream的子類外,還分別實現了接口DataInput和DataOutput。接口DataInput中定義的方法主要包括從流中讀取基本類型的數據、讀取一行數據、或者讀取指定長度的字節數,如readBoolean()readInt()、readLine()、readFully()等。接口DataOutput中定義的方法主要是向流中寫入基本類型的數據或者寫入一定長度的字節數組,如writeChar()、writeDouble()DataInputStream可以從所連接的輸入流中讀取與機器無關的基本類型數據,用以實現一種獨立于具體平臺的輸入方式;DataInputStream可以向所連接的輸出流寫入基本類型的數據。
2Socket機制
Socket是面向客戶/服務器模型設計的,網絡上的兩個程序通過一個雙向的通訊連接實現數據的交換,這個雙向鏈路的一端稱為一個Socket。Socket通常用來實現客戶方和服務方的連接。客戶程序可以向Socket寫請求,服務器將處理此請求,然后通過Socket將結果返回給用戶。
Socket通信機制提供了兩種通訊方式:有聯接和無聯接方式,分別面向不同的應用需求。使用有聯接方式時,通信鏈路提供了可靠的,全雙工的字節流服務。在該方式下,通信雙方必須創建一個聯接過程并建立一條通訊鏈路,以后的網絡通信操作完全在這一對進程之間進行,通信完畢關閉此聯接過程。使用無聯接方式時其系統開銷比無聯接方式小,但通信鏈路提供了不可靠的數據報服務,不能保證信源所傳輸的數據一定能夠到達信宿。在該方式下,通信雙方不必創建一個聯接過程和建立一條通訊鏈路,網絡通信操作在不同的主機和進程之間轉發進行。
3Java語言
Java語言的優點主要表現在:簡單、面向對象、多線程、分布性、體系結構中立、安全性等方面。
(1)簡單性
Java與C++語言非常相近,但Java比C++簡單,它拋棄了C++中的一些不是絕對必要的功能,如頭文件、預處理文件、指針、結構、運算符重載、多重繼承以及自動強迫同型。Java實現了自動的垃圾收集,簡化了內存管理的工作。這使程序設計更加簡便,同時減少了出錯的可能。
(2)面向對象
Java提供了簡單的類機制和動態的構架模型。對象中封裝了它的狀態變量和方法,很好地實現了模塊化和信息隱藏;而類則提供了一類對象的原型,通過繼承和重載機制,子類可以使用或重新定義父類或超類所提供的方法,從而既實現了代碼的復用,又提供了一種動態的解決方案。
Java是一種完全面向對象的程序設計語言,它除了數組、布爾和字符三個基本數據類型外的其它類都是對象,它不再支持全局變量。在Java中,如果不創建新類就無法創建程序,Java程序在運行時必須先創建一個類的實例,然后才能提交運行。
Java同樣支持繼承特性,Java的類可以從其它類中繼承行為,但Java只支持類的單重繼承,即每個類只能從一個類中繼承。
Java支持界面,界面允許程序員定義方法但又不立即實現,一個類可以實現多個界面,利用界面可以得到多重繼承的許多優點而又沒有多重繼承的問題。
(3)多線程
多線程使應用程序可以同時進行不同的操作,處理不同的事件。在多線程機制中,不同的線程處理不同的任務,他們之間互不干涉,不會由于一處等待影響其他部分,這樣容易實現網絡上的實時交互操作。
Java程序可以有多個執行線程,如可以讓一個線程進行復雜的計算,而讓另一個線程與用戶進行交互,這樣用戶可以在不中斷計算線程的前提下與系統進行交互。多線程保證了較高的執行效率。
(4)分布性
Java是面向網絡的語言。通過它提供的類庫可以處理TCP/IP協議,用戶可以通過URL地址在網絡上很方便的訪問其他對象。
(5)體系結構中立
Java是一種網絡語言,為使Java程序能在網絡的任何地方運行,Java解釋器生成與體系結構無關的字節碼結構的文件格式。Java為了做到結構中立,除生成機器無關的字節碼外,還制定了完全統一的語言文本,如Java的基本數據類型不會隨目標機的變化而變化,一個整型總是32位,一個長整型總是64位。
為了使Java的應用程序能不依賴于具體的系統,Java語言環境還提供了用于訪問底層操作系統功能的類組成的包,當程序使用這些包時,可以確保它能運行在各種支持Java的平臺上。
java.lang:一般的語言包。其中包括用于字符串處理、多線程、異常處理和數字函數等的類,該包是實現Java程序運行平臺的基本包
java.util:實用工具包。其中包括哈希表、堆棧、時間和日期等
java.io:基于流模型的輸入/輸出包。該包用統一的流模型實現了各種格式的輸入/輸出,包括文件系統、網絡和設備的輸入/輸出等
:網絡包。該包支持TCP/IP協議,其中提供了socket、URL和WWW的編程接口
java.awt:抽象窗口工具集。其中實現了可以跨平臺的圖形用戶界面組件,包括窗口、菜單、滾動條和對話框等
java.applet:支持applet程序設計的基本包
(6)安全性
用于網絡、分布環境下的Java必須要防止病毒的入侵,Java不支持指針,一切對內存的訪問都必須通過對象的實例變量來實現,這樣就防止了程序員使用欺騙手段訪問對象的私有成員,同時也避免了指針操作中容易產生的錯誤。
4JAVA工具
(1)JDK
1)Java編譯器
Java編譯器將Java源代碼文件編譯成可執行的Java字節碼。Java源代碼文件的擴展名為.java,Java編譯器把這種擴展名的文件編譯成擴展名為.class的文件。源文件中的每個類在編譯后都將產生一個class文件,這意味一個Java源代碼文件可能編譯生成多個class文件。
2)Java解釋器
Java解釋器對編譯生成的字節碼格式的可執行程序的運行提供支持,它是運行非圖形Java程序的命令行工具。
3)Appletviewer
它是JavaApplet的簡單測試工具,可使用它來測試JavaApplet程序,而不需要WWW瀏覽器的支持。
(2)VisualJ++
VisualJ++集成了可視化界面設計、交互式調試、代碼編輯、聯機幫助信息和介紹如何快速掌握該開發環境的實用向導等多項功能,同時具有能充分利用ActiveX和COM新技術的優勢。利用VisualJ++可創建交互性很強的Internet應用程序,是難得的Java開發系統。
5客戶機/服務器通信的實現:
(1)Application同Applet的通信
兩端通過Socket機制進行連接:
1)客戶端的編程流程:
?打開Socket,新建一個套接字;
?為套接字建立一個輸入和輸出流;
?根據服務器協議從套接字讀入或向套接字寫入;
?清除套接字和輸入/輸出流;
2)服務器端的編程流程:
?打開ServerSocket,創建一個服務器型套接字和一個普通套接字,服務器型套接字在指定端口為客戶端請求的Socket服務;
?使用ServerSocket類的accept()方法使服務器型套接字處于監聽狀態并把監聽結果返回給普通套接字;
?為該普通套接字創建輸入和輸出流;
?從輸入和輸出流中讀入或寫入字節流,進行相應的處理,并將結果返回給客戶端;
?在客戶端和服務器工作結束后關閉所有的對象,如服務器型的套接字,普通套接字,輸入和輸出流。
正是由于Java系統具有基于Socket的靈活通信機制,因而其應用程序能自由地打開和訪問網絡上的對象,就象在本地文件系統中一樣。
(2)Applet之間的通信:
Applet之間的通信使用AppletContext類的getApplet()方法。
<appletcode=applet1.classwidth=200height=200name=first>
只要在程序中加入
Appletoneapplet=getAppletContext().getApplet(“first”);便可使用name為first的Applet中的方法了。
在該課題中大量使用了該種通信方法,因為專門同服務器端通信的Applet中包含接收信息方法和發送信息方法,所有客戶端的Applet都要使用負責通信的Applet中的方法,所以客戶端的Applet同負責通信的Applet必須進行通信。
6程序
//服務器端程序S.java負責與客戶端通信
importjava.io.*;
.*;
importjava.lang.*;
importT2;
classThreadEchoHandlerextendsThread//創建線程
{
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();//從客戶端得到字符串
//在此加入各自的服務程序
System.out.println(str);
theT2.pass(str);//解碼
theT2.tongji();//修改監控庫中的信息
aa=theT2.guan();//操縱數據庫
System.out.println("stringzis:"+aa);
if(pareTo("null")!=0)
//若是查詢數據庫,返回查詢后的結果
{//若不是查詢數據庫,不向客戶端輸出信息
out.writeUTF(aa);
out.flush();}
}//while
incoming.close();//線程關閉
}//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);}
}
}
//客戶端通信小應用程序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);}//與服務器建立連接
catch(IOExceptione)
{System.out.println("error");}
}
publicvoidst(Stringstri)//發送字符串的方法
{
try
{DataOutputStreamos=newDataOutputStream(echoSocket.getOutputStream());
DataInputStreamis=newDataInputStream(echoSocket.getInputStream());
os.writeUTF(""+stri);//向服務器輸送string
os.flush();
}
catch(IOExceptione)
{System.out.println("error:"+e);}
}
publicStringst1()//接收字符串的方法
{
StringLine="";
try
{DataOutputStreamos=newDataOutputStream(echoSocket.getOutputStream());
DataInputStreamis=newDataInputStream(echoSocket.getInputStream());
Line=is.readUTF();//從服務器讀來的信息
ta.appendText(""+Line);//在文本域中輸出信息
}
catch(IOExceptione)
{System.out.println("error:"+e);}
returnLine;
}
}
7程序調試心得:
1)在建立Socket連接時,兩端的端口號必須設為一致,否則建立不了連接。服務器端必須有主機IP地址或主機名參數。
2)連接建立好之后應確定輸入和輸出流。起初程序中用的是DataInputStream和PrintStream,結果只能傳輸英文,傳輸中文時產生亂碼,將PrintStream改為DataOutputStream,使用readUTF()和writeUTF()方法后,中文傳輸問題得到解決。
3)如果一個使用某端口的程序沒有關閉,另一個程序就不能使用這個端口。
4)開始進行通信的程序均為Application,因不符合客戶機/服務器機制,應將客戶端的Application改為Applet。其轉化的主要步驟如下:
?創建一個包含APPLET標簽的HTML文件;
?去掉應用程序中的main()方法;
?類名應繼承Applet類,而不是Frame類,并在程序開頭加入
importjava.applet.*;語句;
?用init()方法代替Application程序中的構造方法,當瀏覽器創建Applet類對象的時候,它自動執行init()方法;
?如Application中缺省使用了BorderLayout布局管理器,應在Applet的init()方法中重新設定;
?如果Application中有setTitle()方法,必須將其去掉,如Application中使用了菜單,在Applet中用按鈕來替換。
5)懂得了在一程序中如何引用自定義的類中的方法和變量,在程序開頭加入import類名;在程序中加入類名實例=new類名();然后使用
實例.方法(),實例.變量即可。
參考文獻:
[1]廖雷等,Java程序設計教程,中國電力出版社,2003
篇10
關鍵詞:智能電器;無線通信;WiFi模塊;單片機
物聯網技術是當代信息技術的一個重要標志,改變了人們的生產生活方式,使傳統電器變得更加便捷而智能。智能電器是將微處理器、傳感器技術、網絡通信技術引入家電設備后形成的新型產品[1]。通信接口是智能電器的重要組成部分,用來實現通信節點之間信息的發送和接收。穩定的通信接口為智能電器系統的正常運行提供了有力保障。電器的控制方式分為有線控制和無線控制。有線控制是將控制器放置于強電箱內,開關和中控主機分別通過弱電控制線路進行控制。有線控制的優點:安全、穩定、不受干擾;有線控制的缺點:方案設計要求高、線路架設要求高、后期拓展改動困難。隨著物聯網和智能電器的發展,有線通信逐漸被無線通信所替代。當前普遍使用的無線通信技術主要有RFID技術、藍牙技術、ZigBee通信技術、Z-Wave技術和WiFi技術[2,3]。WiFi通信技術是智能手機終端接入Internet的主流模式,其他類型的通信設備要接入Internet需要網關進行轉換[4]。局域網絡中的無線路由多采用WiFi技術與各節點進行無線通信,不用另設網關和網絡改造便可實現系統搭建。智能手機可以通過局域網和廣域網控制設備的工作狀態。
1智能電器系統構成
智能家電系統由無線路由、智能終端、智能電器三大主要部分構成,如圖1所示。無線路由為系統提供WiFi無線網絡,是局域網絡通信的基礎部件,若要實現遠程控制,需要與Internet連接進行廣域網3G通信[5]。智能手機和平板電腦等智能終端可以在無線網絡下,對處于網絡中的智能電器節點進行控制操作。智能家電內需要集成WiFi無線通信模塊接收控制指令,實現電器的非接觸型智能控制。系統的操作流程:首先,配置模塊要連接的路由器的名稱(SSID)、密鑰和服務器的IP地址;然后,手機等控制終端連接服務器下達操作命令;最后,控制系統根據指令完成相應的動作或查詢等操作。智能手機和智能電器通常以STA站點形式入網,即作為無線網絡的終端使用,形成客戶端-客戶端方式通信。也可以設置電器為AP,即作為無線接入點形成自組網絡。無線WiFi模塊在使用之前需要通過串口寫入智能電器的MAC地址、網絡名稱、密碼和IP等配置信息。圖2為智能電器的系統框圖。
2通信接口設計
2.1通信接口構成在由路由器構建的WLAN無線網絡中,智能手機可以和電器中的WiFi模塊進行通信。通信串口WiFi模塊內嵌TCP/IP協議,通信接口如圖3所示。硬件構成主要是由內嵌的一個單片機和WiFi模塊構成,單片機主要實現裸機驅動程序和TCP/IP協議;WiFi模塊則必須完成數據的無線接收和發送。模塊內部集成了TCP/IP協議棧和WiFi模塊,用戶可以實現串口設備的無線網絡功能。嵌入式WiFi模塊對外提供UART串口或者SPI接口,其通信標準為IEEE802.11b/g,支持WPA/WPA2PSK加密,支持AES和TKIP加密算法。智能終端和WiFi模塊的通信格式常用的通信協議有HTTP、TCP/IP和Socket,HTTP是應用層協議;TPC/IP協議是傳輸層協議;Socket是應用層與TCP/IP協議的中間軟件,是對TCP/IP協議的封裝和應用抽象層[6]。面向嵌入式系統的通信協議多采用Socket協議。2.2Socket通信協議軟件實現采用Socket通信協議客戶端的通信過程:①建立通信;②查詢連接;③發送數據;④接收數據;⑤關閉連接。Android手機建立連接指令為newSocket(HOST,PORT),關閉連接指令為socket.close(),發送數據調用getOutputStream()方法,接收數據調用getInputStream()方法。服務器的通信過程可概述為:1)建立服務器端的Socket,偵聽網絡中的連接請求;2)當檢測到連接請求時,向客戶端發送收到連接請求的信息并建立連接;3)完成通信后關閉Socket連接。圖4為客戶端和服務器的通信流程,圖中的bind()和listen()方法用來綁定并監聽Socket和端口號,accept()用來接收來自客戶端的連接請求。當點擊智能手機界面上的功能按鍵,后臺會將數據以Socket格式發送給WiFi模塊,發送指令被電器控制系統接收后,便會執行檢測、開啟、關斷、調節等響應動作,并可根據需要將執行結果返回給智能手機。2.3單片機通信接口設計1)硬件設計通信接口和執行機構的硬件設計以單片機為核心,包括單片機最小系統及其電路設計,把單片機、無線模塊、繼電器等模塊有機的結合在一起。WiFi模塊的TX和RX與其串口相連,負責信息指令的接收和發送;WiFi模塊和單片機的通信采用串口模式(UART),串口波特率可達115200bps,執行命令由普通I/O口輸出,可控制執行部件響應動作指令;配以光照、溫度等傳感器裝置送入單片機自帶ADC模擬數字轉換接口,可以檢測環境狀態并作出相應動作,使電器更加智能。圖5是單片機控制繼電器的硬件連接示意圖,WiFi模塊的UART_TX和UART_RX與單片機串口的RXD和TXD相連,完成UART口雙向通訊功能;繼電器K與普通I/O口相連,通過繼電器電路可以實現對智能電器的開關控制。當模塊收到合上指令時,輸出高電平,繼電器的線圈有電流流過,繼電器的觸點吸合,給負載供電;當模塊收到斷開指令時,端口輸出低電平,執行斷電操作。設計了傳感器的AD轉換接口,實現了可以根據環境狀態的檢測結果控制繼電器的動作。2)軟件設計單片機系統上電復位后,首先進行硬件初始化,WiFi模塊的初始化在函數Config()中完成,在函數中完成波特率、初始化接收、發送數據的中斷類型等設置。模塊開啟后,尋找并連接網絡,建立數據連接,由單片機封裝數據后通過WiFi模塊發送給智能手機。接收數據時,單片機程序不斷地對WiFi模塊進行掃描查詢,查詢數據緩沖區BUF中是否有數據,當查詢到模塊接收到手機用戶發送操作或者查詢指令時,根據Socket協議格式提取相關信息,對指令進行處理并執行相關動作,并通過UART串口返回數據到手機端。接收手機端數據需要使用外部中斷來完成,能夠確保數據傳輸的同步性和實時性,接收8位為一幀有效數據。單片機主程序流程如圖6所示。單片機設置了監測環境光照功能,由光敏傳感器經過ADC芯片轉化后送到單片機,數據與閾值電壓比較,當超過閾值時關斷電器設備。
3結論
該智能電器通信系統在無線網絡的平臺下,在傳統電器上接入無線WiFi模塊,實現了智能終端對智能家電的遠程監測與控制功能,單片機能夠實時的對接收到的指令進行處理和響應,滿足了設計要求。該系統安全、可靠、性能穩定。為大規模智能電器遠程的監管與控制提供了可能。
參考文獻
[1]劉遠聰.物聯網智能家居遠程控制技術的研究[D].蘭州:蘭州交通大學,2015.
[2]曹方.物聯網與短距離無線通信[J].上海信息化,2013(5):32-35.
[3]鄭先海,呂海華,楊弘平.基于AndroidPN技術的Zig-bee無線網絡的物聯網數據采集[J].沈陽工程學院學報:自然科學版,2014,10(4):370-372,381.
[4]吳吉義,李文娟,黃劍平,等.移動互聯網研究綜述[J].中國科學:信息科學,2015,45(1):45-69.
[5]羅軍舟,吳文甲,楊明.移動互聯網:終端、網絡與服務[J].計算機學報,2011,34(11):2029-2051.