posts - 241,  comments - 116,  trackbacks - 0

                  最近在嘗試使用ActiveMQ做系統(tǒng)間的繼承,當(dāng)然少不了Java和C++客戶端的交互問(wèn)題。由于Java與C++在字符串上采用了不同方式的編碼 (Java-Unicode, C++ - ascii)造成了文本數(shù)據(jù)傳輸過(guò)程中的編碼問(wèn)題, 下面記錄一下解決方

          環(huán)境:

          C++ 端:

          操作系統(tǒng):         Win7

          JMS客戶端:     CMS 1.0 (新版本的CMS需要VS2008編譯)

          開(kāi)發(fā)環(huán)境:         VS2005

                    Java端:

                             操作系統(tǒng):          WinXp

                             JMS客戶端:       ActiveMQ5.4.1-Core

                             開(kāi)發(fā)環(huán)境:           JDK1.6.22

                    ActiveMQ:

                             ActiveMQ 5.4.1


          解決方法:

                  根據(jù)JMS API對(duì)Message類別的定義,最適合多語(yǔ)言見(jiàn)交互的Message類型應(yīng)該是BytesMessage和TextMessage。由于 BytesMessage的readUTF方法在CMS1.0中,接收J(rèn)ava端發(fā)出的UTF字符時(shí)會(huì)拋出異常,導(dǎo)致BytesMessage不好使用;壞賬

                  TextMessage中,無(wú)論C++端以哪種格式的數(shù)據(jù)setText() , Java端接收到的數(shù)據(jù)都是以ISO-8859-1 格式編碼的字符。所以統(tǒng)一在發(fā)送和接收時(shí)都采用 ISO-8859-1 的方式進(jìn)行數(shù)據(jù)傳輸

          發(fā)送時(shí)的代碼:

              private void writeTextMessage(String txt) {
                  try {
                      String msg = txt;        
                                  
                      String iso = new String(txt.getBytes("GBK"), "ISO-8859-1");
                      
                      TextMessage message = pubSession.createTextMessage();
                      message.setStringProperty("language", "java");
                      message.setText(iso);
                      
                      pub.publish(message);
                      
                  } catch (JMSException e) {
                      e.printStackTrace();
                  } catch (UnsupportedEncodingException e) {
                      e.printStackTrace();
                  }
              }

          接收時(shí)的代碼:

              private void onTextMessage(TextMessage message) throws JMSException {
                  String txt = message.getText();
                  
                  try {
                      String gbk = new String(txt.getBytes("ISO-8859-1"), "GBK");
                      System.out.println(gbk);
                  } catch (UnsupportedEncodingException e) {
                      e.printStackTrace();
                  }
              }

          posted on 2011-05-06 10:15 墻頭草 閱讀(6155) 評(píng)論(5)  編輯  收藏

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          人人游戲網(wǎng) 軟件開(kāi)發(fā)網(wǎng) 貨運(yùn)專家
          主站蜘蛛池模板: 江孜县| 章丘市| 玛纳斯县| 新乡县| 溧阳市| 元氏县| 漳浦县| 河池市| 科尔| 额敏县| 宜宾市| 榆林市| 昭苏县| 青河县| 南郑县| 合川市| 兴山县| 青田县| 额尔古纳市| 文昌市| 射阳县| 天祝| 珠海市| 闵行区| 墨脱县| 伊川县| 甘南县| 精河县| 宿松县| 新邵县| 宁夏| 商洛市| 含山县| 保山市| 区。| 苍南县| 庄浪县| 海淀区| 奎屯市| 保山市| 江津市|