西西軟件下載最安全的下載網(wǎng)站、值得信賴的軟件下載站!

首頁(yè)編程開(kāi)發(fā)java → Java客戶端與C#服務(wù)器通過(guò)Socket傳遞對(duì)象

Java客戶端與C#服務(wù)器通過(guò)Socket傳遞對(duì)象

相關(guān)軟件相關(guān)文章發(fā)表評(píng)論 來(lái)源:西西整理時(shí)間:2012/12/23 9:06:36字體大。A-A+

作者:西西點(diǎn)擊:0次評(píng)論:0次標(biāo)簽: Socket

  • 類型:服務(wù)器區(qū)大小:21KB語(yǔ)言:中文 評(píng)分:6.6
  • 標(biāo)簽:
立即下載

最近做項(xiàng)目,需要C#與java間的交互,也就是C#編寫(xiě)服務(wù)器,java編寫(xiě)客戶端,讓兩者進(jìn)行通信。

通信無(wú)非就是互發(fā)數(shù)據(jù),首選Socket技術(shù),通過(guò)TCP協(xié)議建立長(zhǎng)連接,一般是以字節(jié)數(shù)組的形式傳遞數(shù)據(jù),也就是說(shuō),無(wú)論傳遞什么東東,都先拆成字節(jié)數(shù)組。

既然是面向?qū)ο缶幊,發(fā)送的數(shù)據(jù)要用實(shí)體類封裝,同時(shí)配合List<>泛型集合,可以達(dá)到非常好的靈活性、便捷性。

廢話少說(shuō),本文的核心問(wèn)題就是:C#與java如通過(guò)傳遞對(duì)象通信?

剛開(kāi)始我也很迷茫,不知道這個(gè)能不能實(shí)現(xiàn),但同時(shí)又很興奮,因?yàn)樽约涸谧鲆患苡幸馑嫉氖隆=?jīng)過(guò)探索研究,發(fā)現(xiàn)沒(méi)有問(wèn)題!可行!下面分享一下!

需要用到的核心技術(shù):

n Socket。

n Json。

下面詳細(xì)講解實(shí)現(xiàn)的關(guān)鍵步驟:

通信關(guān)鍵:

C#和java用Socket通信,發(fā)送數(shù)據(jù)和接收數(shù)據(jù)可以統(tǒng)一采用UTF-8編碼,經(jīng)過(guò)測(cè)試,使用UTF-8編碼可以成功傳遞對(duì)象。

對(duì)于Socket技術(shù),發(fā)送數(shù)據(jù)之前,一般將字符串轉(zhuǎn)換成字節(jié)數(shù)組,然后發(fā)送字節(jié)數(shù)組;接收數(shù)據(jù)時(shí),收到的也是字節(jié)數(shù)組,很多時(shí)候需要轉(zhuǎn)換成字符串后使用。

下邊是一些常用的轉(zhuǎn)換。

C#語(yǔ)言字符串轉(zhuǎn)換成UTF-8字節(jié)數(shù)組:

byte[] b = Encoding.UTF8.GetBytes("123");

C#語(yǔ)言UTF-8字節(jié)數(shù)組轉(zhuǎn)換成字符串:

// receiveData是字節(jié)數(shù)組,receiveN是字節(jié)數(shù)組length

string removeMsg = Encoding.UTF8.GetString(receiveData, 0, receiveN);

Java語(yǔ)言字符串轉(zhuǎn)換成UTF-8字節(jié)數(shù)組:

/* strContent 是要轉(zhuǎn)換的字符串*/

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

Java語(yǔ)言UTF-8字節(jié)數(shù)組轉(zhuǎn)換成字符串:

/* charArray 是UTF-8格式的字節(jié)數(shù)組,一般從IO流中獲取的時(shí)候就指定為UTF-8,read_rst 是字節(jié)數(shù)組length*/

String resultStr = new String(charArray, 0, read_rst);

序列化關(guān)鍵:

大家都知道,對(duì)象是保存在內(nèi)存中的,具體點(diǎn)說(shuō)是內(nèi)存中的堆區(qū)。因此當(dāng)我們嘗試保存、傳遞對(duì)象時(shí),必須先把對(duì)象序列化,變成字符表示,把無(wú)形變成有形。

由于是跨語(yǔ)言的交互,我們即不能用Java特有的序列化方式,也不能用C#特有的序列化方式,必須找一個(gè)通用的序列化格式才能交互。顯然,Json是不二的選擇。

由此可知,我們需要Json完成以下功能:

經(jīng)過(guò)測(cè)試,用如下方法可實(shí)現(xiàn)上述轉(zhuǎn)換。

C#端可以用開(kāi)源項(xiàng)目JSON.NET,下載后根據(jù)自己的.NET版本,選擇相應(yīng)的Newtonsoft.Json.dll,引用后再添加:using Newtonsoft.Json;using Newtonsoft.Json.Converters;即可使用。

C#用Json序列化對(duì)象方法:

//te是要序列化的對(duì)象;obj是對(duì)象序列化后的字符串

string obj = JsonConvert.SerializeObject(te);

C#用Json反序列化對(duì)象方法:

//testEntity是目標(biāo)類型;obj是經(jīng)過(guò)Json序列化的對(duì)象,字符串形式

TestEntity te = JsonConvert.DeserializeObject<TestEntity>(obj);

Java端可以用開(kāi)源項(xiàng)目google-gson,下載后是一個(gè)jar格式的包,直接在項(xiàng)目中導(dǎo)入這個(gè)包,并添加引用:import com.google.gson.Gson;即可使用。

Java用Json序列化對(duì)象方法:

Gson gson = new Gson();

/*te是需要序列化的對(duì)象*/

String s = gson.toJson(te);

Java用Json反序列化對(duì)象方法:

Gson gson = new Gson();

/*s是經(jīng)過(guò)Json序列化的對(duì)象,字符串類型;TestEntity是目標(biāo)類型*/

/*注意:使用fromJson方法反序列化一個(gè)對(duì)象時(shí),該對(duì)象的類型必須顯示的聲明一個(gè)不帶參數(shù)的構(gòu)造方法*/

TestEntity te = gson.fromJson(s,TestEntity.class);

關(guān)鍵的部分就這些,其他的地方都非常容易實(shí)現(xiàn),網(wǎng)上有很多成熟的代碼,就不贅述了。

    相關(guān)評(píng)論

    閱讀本文后您有什么感想? 已有人給出評(píng)價(jià)!

    • 8 喜歡喜歡
    • 3 頂
    • 1 難過(guò)難過(guò)
    • 5 囧
    • 3 圍觀圍觀
    • 2 無(wú)聊無(wú)聊

    熱門(mén)評(píng)論

    最新評(píng)論

    發(fā)表評(píng)論 查看所有評(píng)論(0)

    昵稱:
    表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
    字?jǐn)?shù): 0/500 (您的評(píng)論需要經(jīng)過(guò)審核才能顯示)
    推薦文章

    沒(méi)有數(shù)據(jù)