跨語言之間的socket通信(C--Java的握手)

跨語言之間的socket通信(C--Java的握手) 

作者:  xuanner  發佈日期: 2008-1-7 17:15:01  Email:[email protected]

----------------------------------(原創作品,請保留作者著作信息)--------------------------------------------

       這些日子在公司開發一個基於B/S的服務器監控的, 服務器端是視頻電話系統,是C語言UDP的WinSock建立的Socket監聽,客戶端我是用了JSP進行開發,開發環境是MyEclipse6.0+Tomcat5.5+jdk6.0,於是要用Java的UDP socket與WinSock進行握手談話,嘻嘻,說得形象了點。首先開始談話吧!!!!!!!!.................

(1)談話開始,先講下一點網絡知識吧。

xuanner老師:socket握手後,雙方通信的是什麼東西呢?
學生:就是字節。
xuanner老師:那是什麼字節?主機字節還是網絡字節?
學生:網絡字節。
xuanner老師:那解釋下網絡字節跟主機字節有什麼區別?
學生:想了想說,就是高位在前跟在後的區別了,網絡字節是低位在前,高位在後的,而主機字節是高位在前,低位在後。比如說在C語言聲明一個int類型的值,它是四個字節保存的,它的前兩個字節就是高位,後兩個字節就是低位,有一種算法可以把它轉爲網絡字節。(後面提供)
xuanner老師:好,不錯!!那麼 WinSock握手後發數據包時,Java Socket取得到後如何處理呢?
學生:得到數據包(字節數組)後,再把網絡字節轉爲主機字節就可以了,有一種算法可以把它轉爲主機字節。(後面提供)
xuanner老師:對,還挺聰明的。但如果WinSock握手後發送的數據包含有字符呢,或是中文字符呢?該如何實現呢?
學生:想了又想,不知道怎麼回答。回答不會。
xuanner老師:首先要了解C語言與Java語言數據類型的數據編碼與存儲格式,C語言字符是以系統默認GBK爲編碼格式,而Java語言字符是以JVM爲編碼格式。WinSock發送數據包是字符以ANSI存儲格式發送的,到了Java Socket後,直接將其轉換爲String類型。
xuanner老師:那如果是Java Socket發送的數據包含有中文字符,如何打包?
學生:直接把String以GBK編碼格式轉換爲bytes即可。

好啦,網絡socket握手講解完畢。

(2)數據類型編碼算法
<1>Java 中int類型主機字節轉換爲網絡字節算法[ 封包 ]

/** 
  * 將int轉爲低字節在前,高字節在後的byte數組
  
*/

 
// 封包int算法
private static byte[] InttoByteArray(int n) {
        byte[] b = new byte[4];
        b[0] = (byte) (n & 0xff);
        b[1] = (byte) (n >> 8 & 0xff);
        b[2] = (byte) (n >> 16 & 0xff);
        b[3] = (byte) (n >> 24 & 0xff);
        return b;
}

<2>Java中short類型主機字節轉換爲網絡字節算法[ 封包 ]

/**
  * 將short轉爲低字節在前,高字節在後的byte數組(網絡字節)
  
*/

//封包short算法
private static byte[] ShorttoByteArray(short n) {
        byte[] b = new byte[2];
        b[1] = (byte) (n & 0xff);
        b[0] = (byte) (n >> 8 & 0xff);        
        return b;
}

<3>Java 中int類型網絡字節轉換爲主機字節算法[ 解包 ]

// 解包爲int算法
private static int ByteArraytoInt(byte[] b) {
        int iOutcome = 0;
        byte bLoop;
        for (int i = 0; i < 4; i++) {
                bLoop = b[i];
                iOutcome += (bLoop & 0xff) << (8 * i);
        }

        return iOutcome;
}

<4>Java 中short類型網絡字節轉換爲主機字節算法[ 解包 ]

// 解包爲short算法
privatestatic short ByteArraytoShort(byte[] b) {
        short iOutcome = 0;
        byte bLoop;
        for (int i = 0; i < 2; i++) {
                bLoop = b[i];
                iOutcome += (bLoop & 0xff) << (8 * i);
        }

        return iOutcome;
}

<5>Java中ANSI字符數組轉爲String字符串[ 解包 ]
// 解包爲String算法
private static String ByteArraytoString(byte[] b) {
        // 轉化爲Unicode編碼格式
        String retStr = "";
        try {
                retStr = new String(b, "GBK");         //"GB2312"也可以
        }
 catch (Exception e) {
        }

        return retStr.trim();
}
<6>Java中String字符串轉換爲ANSI字符數組[ 封包 ]
public byte[] StringtoByteArray(String str) {
        byte[] retBytes = null;
        try {
                retBytes = str.getBytes("GBK");         //"GB2312"也可以
        }
 catch(Exception ex) {}
        return retBytes;
}

       總結:解決java的字符編碼問題首先需要明確的是你的問題中涉及到哪些編碼,當前默認編碼(不一定是系統的,而是JVM的)是什麼,然後纔好利用各種解決方法來解決。
發佈了7 篇原創文章 · 獲贊 1 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章