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

?

基于Socket實現(xiàn)Android(java)與C#的同步通信

2015-04-02 14:03何誠等
無線互聯(lián)科技 2015年2期

何誠等

摘 要:基于Socket的通信機制,闡述了Java和C#語言通過Socket編程來互相通信的步驟,并給出了一種C/S模式的Socket通信系統(tǒng)框架,該框架解決了通過USB連接的安卓應(yīng)用和Windows桌面應(yīng)用之間通信的問題,達到了不同平臺下文件和不同語言的對象的互傳。

關(guān)鍵詞:Socket編程;Java;C#;Json;數(shù)據(jù)同步

1 引言

隨著Android智能手機市場的擴大,基于Android系統(tǒng)的應(yīng)用程序也越來越多。Android程序多以Java語言為基礎(chǔ)進行開發(fā),而在Windows平臺上,c#已經(jīng)成為開發(fā)桌面程序的主流平臺。在一些應(yīng)用場景中,需要Android設(shè)備與裝有Windows系統(tǒng)的計算機通過USB連接,用C#編寫客戶端,java編寫服務(wù)器,實現(xiàn)跨平臺的通信。

而標準的Socket方法可以實現(xiàn)任何平臺和任何進程之間的Socket通信,在PC和Android手機通過USB連接的情況下,可用Android系統(tǒng)的ADB工具進行端口的轉(zhuǎn)發(fā),從而使兩端設(shè)備的Socket連通。

2 實現(xiàn)通信的關(guān)鍵技術(shù)

基于以下技術(shù),實現(xiàn)滿足需求的Socket通信系統(tǒng)框架:

2.1 Socket通信技術(shù)

Socket是一種套接字規(guī)范,利用客戶/服務(wù)器模式,解決了進程之間建立通信連接的問題。安裝了TCP協(xié)議軟件和實現(xiàn)了套接字規(guī)范的設(shè)備之間即可通過Socket進行通信。套接字之間連接的過程需要經(jīng)過這三個步驟:服務(wù)端開啟監(jiān)聽,客戶端發(fā)出請求,服務(wù)端通過監(jiān)聽收到請求后再確認連接。兩端連接上后即可進行數(shù)據(jù)傳輸?shù)牟僮鳌?/p>

Socket有兩種操作方式,一種使用TCP協(xié)議,在本系統(tǒng)中要求數(shù)據(jù)傳輸?shù)臏蚀_性,因此采取使用TCP協(xié)議的來傳輸數(shù)據(jù)的方法。

2.2 C#中的套接字編程

Microsoft.Net.Framework的名字空間System.Net和System.Net.Socket包含豐富用以網(wǎng)絡(luò)編程的類,其中Socket類為實現(xiàn)套接字網(wǎng)絡(luò)編程提供了大量方法。

通過Encoding.UTF8.GetBytes(String),C#可以將將字符串轉(zhuǎn)換為UTF-8字節(jié)數(shù)組,通過Encoding.UTF8.GetString(bytes[],0,Length)將UTF-8字節(jié)數(shù)組轉(zhuǎn)換為字符串。

在創(chuàng)建Socket對象后,可通過Send方法發(fā)送字節(jié)數(shù)組形式的數(shù)據(jù),或使用Receive方法接收字節(jié)數(shù)組數(shù)據(jù),再用以上方法轉(zhuǎn)換為相應(yīng)字符串進行處理。

2.3 Java中的套接字編程

Java在包java.net中提供了兩個類,Socket和ServerSocket。服務(wù)端和客戶端之間先建立Socket之間的連接,之后進行通信。在服務(wù)端新建ServerSocket對象,循環(huán)執(zhí)行accept方法來監(jiān)聽設(shè)備指定的端口,當(dāng)客戶端有Socket來連接它時,它會接受該Socket的連接請求,同時在服務(wù)端建立一個對應(yīng)的Socket對象并和它進行通信。這樣兩邊各一個互相連接的Socket對象,通過兩個socket傳遞數(shù)據(jù)實現(xiàn)了通信。

Java同樣提供了字節(jié)數(shù)組和字符串之間的進行轉(zhuǎn)換的方法,將字節(jié)數(shù)組轉(zhuǎn)換為字符串的過程如下:

String string = new String(charArray, 0, length);

字符串轉(zhuǎn)換為字節(jié)數(shù)組的過程如下:

byte[] byte = strContent.getBytes("UTF-8");

2.4 用Json將對象序列化

除了傳輸文件數(shù)據(jù)外,在面向?qū)ο缶幊讨校l(fā)送的數(shù)據(jù)要用實體類封裝,將封裝的對象存入List()泛型集合中,可以通過序列化List對象來靈活的封裝和傳遞大量數(shù)據(jù)。

因為跨語言的需要,用Java或C#一方自己的序列化方式是行不通的,而Json提供了一個通用的序列化格式。

C#可以用開源的項目JSON.NET,在項目中添加引用:using Newtonsoft.Json;和using Newtonsoft.Json.Converters即可使用以下方法:

序列化:

JsonConvert.SerializeObject(string);

反序列化:

JsonConvert.DeserializeObject(obj);

Java可以用開源項目google-gson,在項目中導(dǎo)入這個項目的第三方j(luò)ar包,然后添加引用:import com.google.gson.Gson;就可使用以下方法:

序列化:

Gson gson=new Gson();

String s=gson.toJson(obj);

反序列化:

Gson gson=new Gson();

Object obj=gson.fromJson(s,Object.class);

2.5 C#啟動cmd調(diào)用Android系統(tǒng)的調(diào)試工具ADB

通過C#名字空間System.Diagnostics提供的Process類調(diào)用Windows系統(tǒng)

的cmd.exe,在USB連接的情況下,執(zhí)行“adb forward tcp:12581 tcp:10087”命令轉(zhuǎn)發(fā)端口信息,并通過“adb shell am broadcast -a”命令發(fā)送一個廣播給Android應(yīng)用程序,以啟動Android程序相應(yīng)的service,在service中編寫socket實現(xiàn)通信。

3 數(shù)據(jù)同步方法實現(xiàn)流程

根據(jù)以上列舉的關(guān)鍵技術(shù)來設(shè)計一個實現(xiàn)Android應(yīng)用程序和桌面程序通信的模型,分為C#客戶端和Java服務(wù)端兩部分:

3.1 客戶端程序編寫流程如下

⑴C#通過ADB發(fā)送Android系統(tǒng)的BroadCast廣播,來啟動Android的Service后臺程序。

⑵新建一個Socket對象,Android默認手機端的IP為“127.0.0.1”,因此以“127.0.0.1”和指定的端口號為參數(shù),執(zhí)行該對象的Connect方法。

⑶發(fā)送對象時將要傳遞的對象用Json序列化函數(shù)JsonConvert.SerializeObject()序列化為字符串,再將字符串轉(zhuǎn)換為字節(jié)數(shù)組,最后通過Socket對象的Send方法發(fā)送數(shù)據(jù)。

⑷接收數(shù)據(jù)時執(zhí)行Socket對象的Receive方法,將得到的字節(jié)數(shù)組轉(zhuǎn)換為字符串,再用JsonConvert.DeserializeObject()方法反序列化字符串得到對象。

⑸程序關(guān)閉時執(zhí)行Socket對象的close()方法關(guān)閉socket連接,并發(fā)送關(guān)閉service的廣播。

3.2 服務(wù)端程序編寫流程如下

⑴編寫一個Android端繼承了Service類的后臺運行的程序,作為服務(wù)器端,再編寫一個繼承BroadcastReceiver類的程序來接收廣播,當(dāng)接收到客戶端發(fā)來的廣播時來打開或關(guān)閉Service。

⑵Service啟動的時候以固定端口號作為參數(shù)新建一個SocketServer的對象,當(dāng)有客戶端的socket連接時,通過SocketServer的accept方法新建Socket類的對象。

⑶新建BufferedOutputStream對象來發(fā)送Socket要發(fā)送的數(shù)據(jù),新建BufferedInputStream對象來接收Socket對象接收的的數(shù)據(jù)。

⑷新建Gson對象,執(zhí)行該對象的序列化和反序列化方法,將要發(fā)送的數(shù)據(jù)轉(zhuǎn)換為字節(jié)數(shù)組,將接收的字節(jié)數(shù)組轉(zhuǎn)換為對象。

⑸Service關(guān)閉時關(guān)閉通訊流和Socket。

4 結(jié)語

給出了解決C#平臺和基于java的Android平臺的同步通信的一個方案,總結(jié)了實現(xiàn)該方案所用到的技術(shù)基礎(chǔ),即Java和c#系統(tǒng)具有基于Socket的靈活通信機制,并在格式方面可以通過Json進行轉(zhuǎn)換。

[參考文獻]

[1]周培.基于Socket的即時通信系統(tǒng)的研究與實現(xiàn)[D].廣州:華南大學(xué),2010.

[2]李楊,耿昌宇,張麗芬.基于Socket通訊模式下的跨平臺數(shù)據(jù)同步[J].北京理工大學(xué)學(xué)報,2002(2).

[3]米洪,鄭瑩.基于SOCKET和JNI的Java與C++通信對比研究[J].軟件導(dǎo)刊,2009(1).