码迷,mamicode.com
首页 > 编程语言 > 详细

java 和 C++ Socket通信(java作为服务端server,C++作为客户端client,解决中文乱码问题GBK和UTF8)

时间:2015-08-17 16:50:51      阅读:135      评论:0      收藏:0      [点我收藏+]

标签:

 

原文链接: http://www.cnblogs.com/kenkofox/archive/2010/04/25/1719649.html

 

代码:

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             //接受数据,但不允许有中文,因为会乱码
 2              DataInputStream in = new DataInputStream(clientSocket.getInputStream());
 3             byte[] buffer = new byte[10000];  //缓冲区的大小
 4              in.read(buffer);               //处理接收到的报文,转换成字符串
 5              /**
6              * C++传递过来的中文字,需要转化一下。C++默认使用GBK。
7              * GB2312是GBK的子集,只有简体中文。因为数据库用GB2312,所以这里直接转为GB2312
8              * */
 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  

 

//获得输出输出流
out = newPrintStream(clientSocket.getOutputStream());
 out.print(test);//直接UTF8输出,最终底层每个中文用3个字节传输
 out.print(newString(test.getBytes(),"GBK"));//转GBK失败,实际每个中文字用了4到5个字节传递
 out.print(newString(test.getBytes("GBK"),"GBK"));//转GBK,但底层还是要拆成字节数组,当然最终还是跟UTF8一样

java 和 C++ Socket通信(java作为服务端server,C++作为客户端client,解决中文乱码问题GBK和UTF8)

标签:

原文地址:http://www.cnblogs.com/huhu0013/p/4736771.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!