C#(伺服器)與Java(用戶端)通過Socket傳遞對象

來源:互聯網
上載者:User

         最近做項目,需要C#與java間的互動,也就是C#編寫伺服器,java編寫用戶端,讓兩者進行通訊。

         通訊無非就是互發資料,首選Socket技術,通過TCP協議建立長串連,一般是以位元組數組的形式傳遞資料,也就是說,無論傳遞什麼東東,都先拆成位元組數組。

既然是物件導向編程,發送的資料要用實體類封裝,同時配合List<>泛型集合,可以達到非常好的靈活性、便捷性。

         廢話少說,本文的核心問題就是:C#與java如通過傳遞對象通訊?

         剛開始我也很迷茫,不知道這個能不能實現,但同時又很興奮,因為自己在做一件很有意思的事。經過探索研究,發現沒有問題!可行!下面分享一下!

 

         需要用到的核心技術:

 

         n  Socket。

         n  Json。

        

        

         下面詳細講解實現的關鍵步驟:

 

         通訊關鍵:

 

         C#和java用Socket通訊,發送資料和接收資料可以統一採用UTF-8編碼,經過測試,使用UTF-8編碼可以成功傳遞對象。

         對於Socket技術,發送資料之前,一般將字串轉換成位元組數組,然後發送位元組數組;接收資料時,收到的也是位元組數組,很多時候需要轉換成字串後使用。

         下邊是一些常用的轉換。

 

         C#語言字串轉換成UTF-8位元組數組:

 

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

 

         C#語言UTF-8位元組數群組轉換成字串:

 

         // receiveData是位元組數組,receiveN是位元組數組length

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

 

         Java語言字串轉換成UTF-8位元組數組:

 

         /* strContent 是要轉換的字串*/

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

 

         Java語言UTF-8位元組數群組轉換成字串:

 

         /* charArray 是UTF-8格式的位元組數組,一般從IO流中擷取的時候就指定為UTF-8,read_rst 是位元組數組length*/

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

 

         序列化關鍵:

 

         大家都知道,對象是儲存在記憶體中的,具體點說是記憶體中的堆區。因此當我們嘗試儲存、傳遞對象時,必須先把對象序列化,變成字元表示,把無形變成有形。

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

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

 

         經過測試,用如下方法可實現上述轉換。

 

         C#端可以用開源項目JSON.NET,下載後根據自己的.NET版本,選擇相應的Newtonsoft.Json.dll,引用後再添加:using Newtonsoft.Json;using Newtonsoft.Json.Converters;即可使用。

 

         C#用Json序列化對象方法:

 

         //te是要序列化的對象;obj是對象序列化後的字串

         string obj = JsonConvert.SerializeObject(te);

 

         C#用Json還原序列化對象方法:

 

         //TestEntity是目標類型;obj是經過Json序列化的對象,字串形式

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

 

         Java端可以用開源項目google-gson,下載後是一個jar格式的包,直接在項目中匯入這個包,並添加引用:import com.google.gson.Gson;即可使用。

 

         Java用Json序列化對象方法:

 

         Gson gson = new Gson();

         /*te是需要序列化的對象*/

         String s = gson.toJson(te);

 

         Java用Json還原序列化對象方法:

 

         Gson gson = new Gson();

         /*s是經過Json序列化的對象,字串類型;TestEntity是目標類型*/

         /*注意:使用fromJson方法還原序列化一個對象時,該對象的類型必須顯示的聲明一個不帶參數的構造方法*/

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

 

         關鍵的部分就這些,其他的地方都非常容易實現,網上有很多成熟的代碼,就不贅述了。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.