java 和 C++ Socket通訊(java作為服務端server,C++作為用戶端client,解決中文亂碼問題GBK和UTF8)

來源:互聯網
上載者:User

代碼:

http://files.cnblogs.com/kenkofox/Client-CPlusPlus.rar
http://files.cnblogs.com/kenkofox/Server_Java.rar

 

java和C++使用Socket通訊,其實底層Socket都是相通的,所以只需要按照各自的文法去做就是了。

 

java伺服器端使用ServerSocket的accept建立Socket,跟普通java之間的通訊一致。

C++用戶端使用makeConnect(server, port, "tcp"),send,recv等函數。

 

自己在這次編程中,首先遇到的是雖然串連成功了,但java無法接收C++發來的訊息。

可能是用錯函數之類的,後邊改為下邊的代碼接收就沒事了。

1 1             //接受資料,但不允許有中文,因為會亂碼
2  2 DataInputStream in = new DataInputStream(clientSocket.getInputStream());
3  3 byte[] buffer = new byte[10000]; //緩衝區的大小
4  4 in.read(buffer); //處理接收到的報文,轉換成字串
5  5 /**
6 6 * C++傳遞過來的中文字,需要轉化一下。C++預設使用GBK。
7 7 * GB2312是GBK的子集,只有簡體中文。因為資料庫用GB2312,所以這裡直接轉為GB2312
8 8 * */
9  9 message = new String(buffer,"GB2312").trim();

 

 

另外

最大的問題是字元的編碼問題,如果發現java接收到的字串是亂碼,就要仔細看看接下來的說明了。

 

Java代碼在運行時,預設用UTF8來處理字串,Socket發送字串(如果用高層輸出資料流直接輸出String的話,最後還是自動用UTF8方式把字串拆分成byte數組再傳輸的。(可以見http://www.cnblogs.com/kenkofox/archive/2010/04/23/1719009.html)

而C++在xp啟動並執行時候預設使用GBK來傳輸Socket。

 

所以java接收到C++訊息的時候,應該轉為GBK或者GB2312,才能顯示正確中文。

而C++要接收到正確的java訊息,就要在java發送的時候轉為GBK或者GB2312編碼(因為C++轉碼比java麻煩很多嘛,哈哈)

 

1    byte[] responseBuffer = newClientRequestHandler(message).response().getBytes("GB2312");
2 out.write(responseBuffer, 0,responseBuffer.length);

 

 

而C++接收方面,只需要用buf裝起來,然後轉為string就是了。正確顯示……代碼大概是:

charCount = recv(socket, buf, len, 0);

string resultString(buf);

 

另外為了更好理解上述的編碼問題,大家在java端發送資訊到C++端的時候,試試下邊的方式試試,很有意思的。記得要在C++那邊關注charCount  

1 //獲得輸出輸出資料流
2 out = newPrintStream(clientSocket.getOutputStream());
3  out.print(test);//直接UTF8輸出,最終底層每個中文用3個位元組傳輸
4  out.print(newString(test.getBytes(),"GBK"));//轉GBK失敗,實際每個中文字用了4到5個位元組傳遞
5  out.print(newString(test.getBytes("GBK"),"GBK"));//轉GBK,但底層還是要拆成位元組數組,當然最終還是跟UTF8一樣

 

 

 

接下來是完整的代碼說明

java方面:

EchoServerThread是一個Server類,專門等待客戶的串連,然後建立EchoThread進行處理。

EchoThread是一個處理訊息的線程,主要包括接收訊息和發送訊息的socket操作。

ClientRequestHandler是處理字串的實際商務邏輯類……

 

C++方面:

client.cpp是測試的主函數。 

SocketManager.h包含SocketManager類,簡單封裝了Socket的啟動和發送等操作。

connection.h包含Connection類,封裝了Socket的底層調用。

conn_exception.h定義了一個異常。

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.