999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于消息驅動的Android TCP服務器類的設計

2017-05-15 08:17:23馬玉春
海南熱帶海洋學院學報 2017年2期
關鍵詞:方法

劉 雍,孫 冰,馬玉春

(海南熱帶海洋學院 a.海洋信息工程學院; b.海南省嵌入式系統重點實驗室,海南 三亞 572022)

基于消息驅動的Android TCP服務器類的設計

劉 雍a,孫 冰a,馬玉春b

(海南熱帶海洋學院 a.海洋信息工程學院; b.海南省嵌入式系統重點實驗室,海南 三亞 572022)

網絡應用日趨廣泛,本文所提出的Android TCP服務器模型及實現的TcpServer類通過多線程類來處理遠程客戶機的連接請求和數據接收,設置了多種消息用來通知用戶連接是否成功并提交接收到的數據,以及數據收發過程中是否出現錯誤等.該TcpServer類在工程項目中得到了應用,運行可靠,提高了開發效率.

安卓(Android); 傳輸控制協議; 服務器; 多線程

0 引 言

安卓(Android)作為移動設備的開放源碼操作環境與平臺,在移動互聯網發展迅速的今天,不斷擴展網絡應用是其開發的主要方向.目前,Android網絡編程能夠實現信息實時交互、在線存儲,還可以實現電子商務、實時監控與移動辦公等.文獻[1]給出了各種網絡編程的初步方案,特別是傳輸控制協議(TCP:Transmission Control Protocol)的Socket編程.文獻[2]實現了微軟.NET框架下的基于事件驅動的TcpServer類,偵聽遠程客戶機的連接與數據接收都通過多線程在后臺進行,連接成功或收到數據均通過事件提交用戶,節約了系統資源,同時加強了數據接收和發送的處理功能.本文在文獻[1]的基礎之上,結合文獻[2]的原理,設計并實現一個Android平臺下的TcpServer類,使其支持消息驅動和便捷的數據接收與發送等功能.

1 Handler消息傳遞機制

Android中引入Handler作為消息傳遞機制,Handler可以充當子線程與主線程的中介,主要接收子線程發來的數據,并以此數據配合主線程更新界面(UI)控件顯示的內容.當App啟動時,Android首先會開啟一個主線程(即UI線程),主線程為管理界面中的UI控件,對各控件進行事件分發.如果需要執行一個耗時的操作,如:讀寫文件和實時數據傳輸等.如果將這些操作放在主線程中,就會導致App崩潰,因而,這些操作應該放在子線程中.但是,子線程中的數據又需要到主線程的UI中進行更新,Android運行機制不允許在子線程中直接更新主線程中的數據.本文考慮借助Handler消息傳遞機制來解決這個問題.由于Handler對象運行在主線程(UI),同其子線程之間可以通過Message對象來傳遞數據,這樣就可以比較流暢地更新主線程中的數據[3].

在實時監控系統中,可以在初始化Handler對象時定義回調方法,用來接收和處理子線程發送的消息,也可使用Handler對象的postDelayed方法執行定時查詢功能,以便及時做出處理[4].本文所設計的TcpServer類通過主線程的Handler對象向主線程發送連接成功和關閉等事件消息和接收到的數據消息.

2 TcpServer 工作原理模型

TcpServer的內部工作原理模型如圖1所示.首先通過構造函數進行初始化,主線程向構造函數傳送 Handler對象和偵聽接口等參數,然后在多線程中創建ServerSocket對象,調用該對象的accept方法偵聽端口.連接失敗,則發送連接失敗消息;連接成功,則啟動新的線程讀取數據,如果收到數據,則發送數據接收到的消息,供主線程調用.TcpServer初始化并與遠程客戶機連接,成功之后還可以直接供主線程調用,用來發送數據[5].

圖1 TcpServer 內部工作原理模型

3 多線程處理端口偵聽和數據接收

端口偵聽通過多線程嵌入類Th_Accept實現,其中run方法中的關鍵代碼為

try{

_ss = new ServerSocket(_nPort);

_connection = _ss.accept();

_bis = new BufferedInputStream(_connection.getInputStream());

_bos = new BufferedOutputStream(_connection.getOutputStream());

_bConnected = true; //缺省為false

} catch (UnknownHostException e) {

} catch (IOException e) {}

if (_bConnected){

_handler.obtainMessage(MESSAGE_Connected, 0, 0,null).sendToTarget();

th_ReadData = new Th_ReadData();

th_ReadData.start();

}

else

_handler.obtainMessage(MESSAGE_ConnectError, 0, 0,null).sendToTarget();

傳入端口號生成ServerSocket對象_ss,調用_ss對象的accept方法等候遠程客戶機的連接請求,此時多線程處于阻塞狀態.連接成功后,生成BufferedInputStream對象_bis,用于后續的數據讀取(接收),再生成BufferedOutputStream對象_bos,用于后續的數據發送.如果以上各項都取得成功,則將連接狀態參數_bConnected修改為true(否則,保持false不變).

如果連接成功,則Handler對象_handler通過obtainMessage方法獲得連接成功消息,并通過消息的sendToTarget方法發送到主線程,隨后啟動讀取數據的多線程Th_ReadData對象;如果連接失敗,則向主線程發送連接失敗的消息.

Th_ReadData也是一個多線程嵌入類,用于在后臺讀取數據,run方法中為一個讀取數據的死循環,其關鍵代碼為:

while(true){

if(_bConnected != true) return;

if(_bStopConnect) return;

try {

if(_bis.available() > 0){

ByteBuffer byteBuf = readByteBuffer();

if(_bConnected != true) return; //be necessary!!

_handler.obtainMessage(MESSAGE_DataArrived, 0, 0, byteBuf).sendToTarget();

}

} catch (IOException e) {}

}

如果連接狀態_bConnected不為true,或者主線程主動終止連接導致_bStopConnect為true,則退出死循環.否則,嘗試接收數據,假如_bis對象的可用數據大于0,則讀取數據存入byteBuf對象,并向主線程發送數據到達消息,同時攜帶所接收的數據(存于byteBuf).如果在讀取數據的時候發生錯誤,也可在catch代碼模塊中添加發送讀取數據錯誤消息.

4 數據接收與發送的實現

上一節Th_ReadData類中調用的readByteBuffer方法是TcpServer類中的私有方法,其定義如下所示.首先分配一個1024個字節的緩沖區,用ByteBuffer對象buf來保存數據,然后記錄當前時間lStart,通過while循環將延遲在_nDelay(一般定義為50毫秒)內的數據進行合并,最后作為一個數據包返回.如果在讀取數據包的過程中發生錯誤,還可以在catch代碼模塊中添加讀取數據錯誤消息.

private ByteBuffer readByteBuffer(){

ByteBuffer buf = ByteBuffer.allocate(1024);

long lStart = System.currentTimeMillis();

while(System.currentTimeMillis() - lStart < _nDelay){

try{

while(_bis.available()>0){

byte[]bIn = new byte[_bis.available()];

_bis.read(bIn, 0, _bis.available());

buf.put(bIn);

}

}catch (IOException e) {}

}

return buf;

}

發送數據通過sendBytes方法直接調用,因而為公有方法,參數即為需要發送的字節數組,通過BufferedOutputStream對象_bos的write方法進行發送,第一個參數為所需要發送的字節數組,第二個參數為偏移量,這里指從第0個字節開始發送,第三個參數為需要發送的字節數.同理,如果在發送數據包的過程中發生錯誤,還可以在catch代碼模塊中添加發送數據錯誤消息.

public void sendBytes(byte[]bOut){

try {

_bos.write(bOut, 0, bOut.length);

_bos.flush();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

TcpServer類中還包括直接發送與接收文本字符串的方法,可以很方便地處理POP3協議之類的純文本協議[4].處理文本字符串的方法與處理字節流的方法類似,這里不再贅述.

5 應用測試

文獻[2]中的I-7013D溫度采集模塊采用RS-485接口,可以監視1路溫度量的變化.為了讓學生進行擴展學習,實現了一個Visual Basic 2010 版的I-7013D模塊仿真軟件.利用本文的TcpServer類,進一步實現了Android版的支持TCP協議的I-7013D模塊仿真軟件,方法是在UI主線程中定義一個嵌入類IncomingHandlerCallback,實現處理消息的接口方法handleMessage,其代碼如下所示.

class IncomingHandlerCallback implements Handler.Callback{

public boolean handleMessage(Message msg) {

processMessage(msg);

return true;

}

}

processMessage方法用來處理各種消息,一般使用switch語句對消息進行分類處理,為了方便,這里僅用條件語句來處理數據到達消息,判斷數據到達,則將消息中的數據對象進行強制轉換,然后即可進行隨后的處理.

private void processMessage(Message msg){

if(msg.what == TcpServer.MESSAGE_DataArrived){

ByteBuffer byteBuf = (ByteBuffer)msg.obj;

// 進一步處理數據

}

}

在UI主線程的onCreate方法中,對Handler和TcpServer進行初始化,即可等待遠程客戶機的連接,連接成功后響應其查詢命令.

mHandler = new Handler(new IncomingHandlerCallback());

server = new TcpServer(mHandler, nPort);

圖2所示為Android版I-7013D主控軟件運行效果,能完整地實時取得運行TcpServer對象的I-7013D仿真模塊中的數據,分別通過文本框(當前溫度31.79度)和繪圖方式進行展示.

圖2 I-7013D主控機軟件運行

6 結束語

Android網絡應用廣泛.本文所提出的Android TCP服務器模型及實現的TcpServer原型類可以在后臺處理遠程客戶機的連接請求和接收數據,設置了多種消息用來通知用戶連接是否成功,提交接收到的數據,以及數據收發過程中是否出現錯誤等.由于通過多線程處理耗時工作,TcpServer類不會引起App崩潰,且占用資源少.利用TcpServer類研發的支持Tcp協議的Android版I-7013D模塊仿真軟件,可以與對應的主控機軟件無縫連接,運行可靠[6].

[1]陳文,郭依正.深入理解Android網絡編程[M].北京:機械工業出版社, 2013.

[2]馬玉春.計算機監控系統的仿真開發[M].北京:國防工業出版社,2015.

[3]陳偉.Android Handler消息傳遞機制在人機界面軟件設計中的應用[J].科技信息,2014, 13 (6):90-92.

[4]劉雍.基于ARM9 的嵌入式視頻監控系統的設計與實現[J].瓊州學院學報,2015, 22 (2):35-38.

[5]楊宗德,呂光宏,劉雍.Linux高級程序設計 [M].北京:人民郵電出版社,2012.

[6]文松,王敏,胡春陽, 等.一種用于移動設備的Web 服務遠程證明方法[EB/OL].(2016-11-29)[2016-11-29].http://www.cnki.net/kcms/detail/46.1071.G4.20161129.1713.005.html.

(編校:曾福庚)

Design of Message Driven TCP Server on Android Platform

LIU Yonga, SUN Binga,MA Yu-chunb

(a.School of Ocean Information Engineering; b.Hainan Key Laboratory of Embedded Systems,Hainan Tropic Ocean University, Sanya Hainan 572022, China)

Android network application is becoming more and more extensive.In this paper, on Android platform a message driven TCP server model is established and implemented, in which the connection request from remote client and data receiving is handled by embedded Thread class, with connection establishment and data receiving functioning as messages to main Thread running UI.Prototype class TCP Server has been applied in real project and running reliably.

Android; transmission control protocol; server; thread

格式:劉雍,孫冰,馬玉春.基于消息驅動的Android TCP服務器類的設計[J].海南熱帶海洋學院學報,2017,24(2):59-63.

2017-02-16

劉雍(1979 - ),女,四川閬中人, 海南熱帶海洋學院海洋信息工程學院副教授,碩士,研究方向為移動應用與嵌入式系統.

馬玉春(1969-),男,江蘇南京人, 海南熱帶海洋學院海洋信息工程學院教授,博士,研究方向為移動應用與計算機監控技術.

TP311.52

A

2096-3122(2017) 02-0059-05

10.13307/j.issn.2096-3122.2017.02.12

猜你喜歡
方法
中醫特有的急救方法
中老年保健(2021年9期)2021-08-24 03:52:04
高中數學教學改革的方法
河北畫報(2021年2期)2021-05-25 02:07:46
化學反應多變幻 “虛擬”方法幫大忙
變快的方法
兒童繪本(2020年5期)2020-04-07 17:46:30
學習方法
用對方法才能瘦
Coco薇(2016年2期)2016-03-22 02:42:52
最有效的簡單方法
山東青年(2016年1期)2016-02-28 14:25:23
四大方法 教你不再“坐以待病”!
Coco薇(2015年1期)2015-08-13 02:47:34
賺錢方法
捕魚
主站蜘蛛池模板: 精品自拍视频在线观看| 亚洲 成人国产| 青青草原国产av福利网站| 亚洲中文字幕23页在线| 亚洲高清资源| 91麻豆精品视频| 青青草国产在线视频| 欧美成人A视频| 中文纯内无码H| 色综合天天视频在线观看| 不卡无码h在线观看| 激情爆乳一区二区| 欧美狠狠干| 污污网站在线观看| 亚洲人成网站18禁动漫无码| 中文字幕在线观| 亚洲中文字幕手机在线第一页| 久久大香香蕉国产免费网站| 91欧美在线| 亚洲一级毛片免费看| 成人亚洲视频| 中文字幕伦视频| 中国一级毛片免费观看| 亚洲精品综合一二三区在线| 伊人久久福利中文字幕| 成人av专区精品无码国产| 青青热久麻豆精品视频在线观看| 国产午夜人做人免费视频中文| 亚洲中文字幕久久精品无码一区 | 久久九九热视频| 制服丝袜一区| 五月激情婷婷综合| 丰满人妻被猛烈进入无码| 日本www色视频| 1级黄色毛片| AV熟女乱| 午夜福利视频一区| 国内a级毛片| 二级毛片免费观看全程| 国产激爽大片高清在线观看| 老司机久久精品视频| 国产最新无码专区在线| 婷五月综合| 国产毛片高清一级国语 | 欧美天堂在线| 中国精品久久| 国产精品不卡片视频免费观看| 久青草网站| 国产精品女人呻吟在线观看| 久久精品人妻中文系列| www.91中文字幕| 亚洲Av激情网五月天| 国产91av在线| 一级毛片中文字幕| 熟妇无码人妻| 91成人精品视频| 日韩在线永久免费播放| 久久午夜夜伦鲁鲁片无码免费| 国产精品久久久久久影院| 国产成人无码Av在线播放无广告| 中文字幕不卡免费高清视频| 婷婷六月色| 精品人妻无码中字系列| 2021天堂在线亚洲精品专区| 亚洲欧美一区二区三区蜜芽| 2022国产无码在线| 真实国产精品vr专区| 亚洲人成成无码网WWW| 亚洲成AV人手机在线观看网站| 91在线无码精品秘九色APP| 国产凹凸视频在线观看| 久久综合干| 国产欧美日韩综合在线第一| 亚洲三级色| 亚洲一区免费看| 幺女国产一级毛片| 国内精品免费| 国产男女XX00免费观看| 综合久久五月天| 国产精品自在拍首页视频8| 亚洲一区二区三区在线视频| 亚洲中文久久精品无玛|