2023年8月3日发(作者:)

java和C++通讯乱码解决java和C++使⽤Socket通信,其实底层Socket都是相通的,所以只需要按照各⾃的语法去做就是了。

java服务器端使⽤ServerSocket的accept创建Socket,跟普通java之间的通信⼀致。C++客户端使⽤makeConnect(server, port, "tcp"),send,recv等函数。

⾃⼰在这次编程中,⾸先遇到的是虽然连接成功了,但java⽆法接收C++发来的消息。可能是⽤错函数之类的,后边改为下边的代码接收就没事了。//接受数据,但不允许有中⽂,因为会乱码DataInputStream in = new DataInputStream(utStream());byte[] buffer = new byte[10000]; //缓冲区的⼤⼩(buffer); //处理接收到的报⽂,转换成字符串

/*** C++传递过来的中⽂字,需要转化⼀下。C++默认使⽤GBK。 * GB2312是GBK的⼦集,只有简体中⽂。因为数据库⽤GB2312,所以这⾥直接转为GB23128 8

* */

message = new String(buffer,"GB2312").trim();

另外最⼤的问题是字符的编码问题,如果发现java接收到的字符串是乱码,就要仔细看看接下来的说明了。

⽽C++在xp运⾏的时候默认使⽤GBK来传输Socket。

所以java接收到C++消息的时候,应该转为GBK或者GB2312,才能显⽰正确中⽂。⽽C++要接收到正确的java消息,就要在java发送的时候转为GBK或者GB2312编码(因为C++转码⽐java⿇烦很多嘛,哈哈)

1 byte[] responseBuffer = newClientRequestHandler(message).response().getBytes("GB2312");2

(responseBuffer, 0,);

⽽C++接收⽅⾯,只需要⽤buf装起来,然后转为string就是了。正确显⽰……代码⼤概是:charCount = recv(socket, buf, len, 0);string resultString(buf);

另外为了更好理解上述的编码问题,⼤家在java端发送信息到C++端的时候,试试下边的⽅式试试,很有意思的。记得要在C++那边关注charCount。

1 //获得输出输出流2 out = newPrintStream(putStream());3 (test);//直接UTF8输出,最终底层每个中⽂⽤3个字节传输4 (newString(es(),"GBK"));//转GBK失败,实际每个中⽂字⽤了4到5个字节传递5 (newString(es("GBK"),"GBK"));//转GBK,但底层还是要拆成字节数组,当然最终还是跟UTF8⼀样

接下来是完整的代码说明java⽅⾯:EchoServerThread是⼀个Server类,专门等待客户的连接,然后建⽴EchoThread进⾏处理。EchoThread是⼀个处理消息的线程,主要包括接收消息和发送消息的socket操作。ClientRequestHandler是处理字符串的实际业务逻辑类……

C++⽅⾯:是测试的主函数。SocketManager.h包含SocketManager类,简单封装了Socket的启动和发送等操作。connection.h包含Connection类,封装了Socket的底层调⽤。conn_exception.h定义了⼀个异常。

2023年8月3日发(作者:)

java和C++通讯乱码解决java和C++使⽤Socket通信,其实底层Socket都是相通的,所以只需要按照各⾃的语法去做就是了。

java服务器端使⽤ServerSocket的accept创建Socket,跟普通java之间的通信⼀致。C++客户端使⽤makeConnect(server, port, "tcp"),send,recv等函数。

⾃⼰在这次编程中,⾸先遇到的是虽然连接成功了,但java⽆法接收C++发来的消息。可能是⽤错函数之类的,后边改为下边的代码接收就没事了。//接受数据,但不允许有中⽂,因为会乱码DataInputStream in = new DataInputStream(utStream());byte[] buffer = new byte[10000]; //缓冲区的⼤⼩(buffer); //处理接收到的报⽂,转换成字符串

/*** C++传递过来的中⽂字,需要转化⼀下。C++默认使⽤GBK。 * GB2312是GBK的⼦集,只有简体中⽂。因为数据库⽤GB2312,所以这⾥直接转为GB23128 8

* */

message = new String(buffer,"GB2312").trim();

另外最⼤的问题是字符的编码问题,如果发现java接收到的字符串是乱码,就要仔细看看接下来的说明了。

⽽C++在xp运⾏的时候默认使⽤GBK来传输Socket。

所以java接收到C++消息的时候,应该转为GBK或者GB2312,才能显⽰正确中⽂。⽽C++要接收到正确的java消息,就要在java发送的时候转为GBK或者GB2312编码(因为C++转码⽐java⿇烦很多嘛,哈哈)

1 byte[] responseBuffer = newClientRequestHandler(message).response().getBytes("GB2312");2

(responseBuffer, 0,);

⽽C++接收⽅⾯,只需要⽤buf装起来,然后转为string就是了。正确显⽰……代码⼤概是:charCount = recv(socket, buf, len, 0);string resultString(buf);

另外为了更好理解上述的编码问题,⼤家在java端发送信息到C++端的时候,试试下边的⽅式试试,很有意思的。记得要在C++那边关注charCount。

1 //获得输出输出流2 out = newPrintStream(putStream());3 (test);//直接UTF8输出,最终底层每个中⽂⽤3个字节传输4 (newString(es(),"GBK"));//转GBK失败,实际每个中⽂字⽤了4到5个字节传递5 (newString(es("GBK"),"GBK"));//转GBK,但底层还是要拆成字节数组,当然最终还是跟UTF8⼀样

接下来是完整的代码说明java⽅⾯:EchoServerThread是⼀个Server类,专门等待客户的连接,然后建⽴EchoThread进⾏处理。EchoThread是⼀个处理消息的线程,主要包括接收消息和发送消息的socket操作。ClientRequestHandler是处理字符串的实际业务逻辑类……

C++⽅⾯:是测试的主函数。SocketManager.h包含SocketManager类,简单封装了Socket的启动和发送等操作。connection.h包含Connection类,封装了Socket的底层调⽤。conn_exception.h定义了⼀个异常。