java和C++通讯乱码解决

C++写的服务器与Java写的客户端通过Socket通信java代码 C++写的服务器与Java写的客户端通过Socket通信C++代码,by zxy,编程交流QQ群:168424095 立即下载

java和C++使用Socket通信,其实底层Socket都是相通的,所以只需要按照各自的语法去做就是了。

 

java服务器端使用ServerSocket的accept创建Socket,跟普通java之间的通信一致。

C++客户端使用makeConnect(server, port, "tcp"),send,recv等函数。

 

自己在这次编程中,首先遇到的是虽然连接成功了,但java无法接收C++发来的消息。

可能是用错函数之类的,后边改为下边的代码接收就没事了。


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

java c++ 通信之间的乱码解决方法 java c++ socket java c++ socket java c++ socket java c++ socket java c++ socket java c++ socket java c++ socket java c++ socket java c++ socket java c++ socket java c++ socket 立即下载

相关推荐

C++实现简单Socket通信

C++实现简单Socket通信,最基本的代码。可以作为初始学习socket功能使用,仅供参考...................

C++与其他语言通过socket通信中文乱码问题

C++与其他语言通过socket通信中文乱码问题 我这里是c++与java通过socket通信,传输中文时发现中文乱码。 最终查阅资料发现c++ 的socket输入输出流的编码方式是 gb2312。那么问题就好解决了,在java中对接收到的数据通过 gb2312编码方式进行编解码即可! ...

weixin_39839588的博客 5330

从原理到实践:详解RGBD相机深度与彩色图像对齐(D2C)算法

本文深入解析了RGBD相机深度与彩色图像对齐(D2C)算法的原理与实现。针对自组装相机中深度图与彩色图不匹配的核心痛点,文章从相机模型、坐标系变换等数学基础讲起,剖析了传统点映射算法的缺陷,并重点介绍了高效的矩形区域映射算法。该算法通过将深度像素视为矩形区域进行映射,有效解决了空洞和遮挡问题,并附有可直接复用的C++代码与优化技巧,为三维重建、机器人视觉等应用奠定坚实基础。

weixin_28363123的博客 242

java c socket通信 中文乱码解决

前言(扯淡) 作为一个一直从事Java的人来说,突然做C++很多地方都是乱撞墙,就发送的这个乱码就让人感到十分头秃,昨天跟老板对话,老板说不行咱就花钱找别人做。。。能力别质疑的感觉真是让人糟心啊- - 不扯太多,程序员节快乐,大家一起头秃吧。。虽然我并不想秃。 问题 言归正传,c++接收信息是gb2312,Java发数据是UTF-8,我Java接收数据没有问题,但是发给C++就遇到乱码问题...

shenshaoming的博客 2万+

Open3D DBSCAN聚类

DBSCAN算法做为一种有名的密度聚类算法,它是通过邻域参数(Distance,MinPts)来刻画样本分布的紧密程度。而在真正开始之前,首先要理解下面这几个概念:更为具体的内容也可参考这篇文章点云DBSCAN聚类算法。...

dayuhaitang1的博客 1800

数据挖掘实战-基于决策树算法构建北京市空气质量预测模型

通过分析这些数据,我们将利用决策树算法建立预测模型。决策树算法具有直观易懂、分类效果好等优点,适合用于此类预测问题。我们将采用适当的方法对模型进行训练和优化,以提高预测精度。最终,我们将评估模型的预测效果,并探讨其在实际应用中的可行性和潜在价值。希望通过本实验,能为北京市的空气质量改善工作提供一定的支持。通过基于决策树算法构建的北京市空气质量预测模型的实验研究,我们在多方面取得了显著的进展。首先,我们成功地整合了来自气象、环保、交通等多个领域的大量数据,形成了一个全面而综合的空气质量分析框架。

m0_64336780的博客 2万+

C++程序和JAVA程序通信的中文乱码问题

背景 C++程序作为ICE客户端通过ICE中间件发送消息给JAVA服务端程序。C++客户端以默认编码格式的字符串传输给JAVA服务端,导致中文乱码。 问题 C++客户端通过GBK格式发送如下消息给JAVA服务端: "Name:"计算机监控快报","Status":"1","Type":"AGENT" JAVA服务端收到消息直接打印输出结果如下: 表明中文乱码,考虑在JAVA服务端进行转换处理。JAVA端实现转为GB2312编码格式: try{ System.out.println(Syst

温暖不了你的心的博客 1641

Microsemi Libero系列教程(四)——PLL的使用

文章目录PLL是什么Libero中PLL的使用官方文档 系列教程:Microsemi Libero系列教程 PLL是什么 PLL(Phase Locked Loop): 为锁相回路或锁相环,用来统一整合时钟信号,使高频器件正常工作,如内存的存取资料等。PLL用于振荡器中的反馈技术。 许多电子设备要正常工作,通常需要外部的输入信号与内部的振荡信号同步。一般的晶振由于工艺与成本原因,做不到很高的频率...

whik1194的博客 7214

java socket recv 乱码_c++利用socket模拟http,返回乱码

我利用c++的socket模拟了http访问某网站,结果返回乱码。这个乱码很奇怪,它不是完全乱码,具体情况就是:一部分中文乱码,一部分英文乱码,大部分还是正确的。我用wireshark查看的时候,发现http返回是200。同时,我查看了返回的html文本,也是正确的。但就是在用socket接收的时候,会出现部分乱码。对于本程序,我的思路是:在myhttp.h中,封装一个mysocket的类,实现s...

weixin_30045055的博客 366

Unreal从入门到精通之 UE4 vs UE5 VR性能优化实战

这篇文章分享了UE5 VR项目的性能优化经验。作者通过对比UE4和UE5的VR模板性能,发现UE5默认帧率只有45FPS,远低于UE4的100FPS。主要性能瓶颈来自Lumen全局光照、虚拟阴影贴图等新特性。文章详细列出了12项关键优化设置,包括禁用Lumen、关闭虚拟阴影、使用前向渲染等,并分析了各项调整对性能的影响程度。特别指出删除默认的VolumetricCloud可立即提升5帧。最后建议根据场景需求平衡画质与性能,对于高帧率要求的VR项目,可能需要谨慎使用UE5或关闭其部分高级渲染功能。

TxNet 1384

R语言 地理加权随机森林(GWRFC )

随机森林可以产生高准确度的分类器,被广泛用于解决模式识别问题。然而,随机森林赋予每个决策树相同的权重,这在一定程度上降低了整个分类器的性能。该算法引入二次训练过程,提高分类正确率高目前,鲜有中文文章介绍GWRFC的技术文档,作者想使用该方法时会遇到重重困难,因此有必要利用R来建模,通过流程演示,供读者参阅。............

qingchen98的博客 6636

java socket utf-8_Java和C++通过Socket通信中文乱码的解决

理想的开发状态是我开始就是C开发,一直是C的开发,现在还是C的开发,若干年后,幸运的话,我可以成为C语言的高手或者专家……更实际的情况是我开始是C开发,后来变成了JAVA开发,然后又做起了VC++的开发,几年下来,发现自己几乎一无所长,成为了编程界的万金油,这种产物很重要,但是也比较尴尬。前一段时间我用C开发了一个服务器程序,前端是VC开发的客户端。现在我用JAVA开发了一个类似的服务器程序,前端...

weixin_42512494的博客 5756

雷电模拟器+ADB全栈爬虫实战:绕过APP反爬的终极方案与2026最新踩坑指南

现在主流的模拟器爬虫方案有三种,我对比了它们的优缺点,最终选择了雷电模拟器+纯ADB控制方案优势劣势适用场景Appium生态完善,支持多平台重依赖,启动慢,反爬检测率高大型项目,需要跨平台Airtest图像识别强大,上手简单性能差,多开不稳定,反爬检测率高简单的自动化测试纯ADB轻量无依赖,速度快,反爬检测率极低需要自己封装工具工业级爬虫,追求稳定性和反爬逆向接口速度最快,性能最好开发成本高,维护成本高接口简单,反爬弱的APP为什么选雷电模拟器?

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1989

JAVA与C++用socket通讯出现中文乱码

java接收C++数据出现中文乱码: 将java这边的socket编码改为GBK就行了!   java和C++使用Socket通信,其实底层Socket都是相通的,所以只需要按照各自的语法去做就是了。   java服务器端使用ServerSocket的accept创建Socket,跟普通java之间的通信一致。 C++客户端使用makeConnect(serve

xuelang_007的专栏 2231

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

androd java socket通讯 中文乱码的解决

1、android java(client) 远程获取 (server)端目录结构中文乱码(解决办法) Server(QT/C++等) Client(android java) Server(QT )------发送未编码中文文件名字符序列---->  Client(java)     java client读取byte[] data序列时通过     String zh

gaoxuefeng的专栏 1186

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Java socket接收出现中文乱码

今天写Tcp,发现中文乱码的问题,百度了一下,发现这篇文章,开头两句话就解决了我的问题,读完受益匪浅啊,呵呵,收藏先。 尊重版权:原文地址:http://hi.baidu.com/linjk03/blog/item/10023afad8303cd9b48f311a.html in = new BufferedReader(new InputStreamReader(socket.get

WITNESS 1万+

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

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

weixin_45866907的博客 354

socket通信java代码des_Java和C++通过Socket通信中文乱码的解决

理想的开发状态是我开始就是C开发,一直是C的开发,现在还是C的开发,若干年后,幸运的话,我可以成为C语言的高手或者专家……更实际的情况是我开始是C开发,后来变成了JAVA开发,然后又做起了VC++的开发,几年下来,发现自己几乎一无所长,成为了编程界的万金油,这种产物很重要,但是也比较尴尬。前一段时间我用C开发了一个服务器程序,前端是VC开发的客户端。现在我用JAVA开发了一个类似的服务器程序,前端...

weixin_28715081的博客 162

java和lora通信_Java与C++Socket通讯注意

c++与java进行socket通信时注意事项 因为java发送的都是网络字节序(big-endium),而c++是主机字节序(little-endium),所以当消息中有整型,浮点型(应尽量避免使用)的时候需要用htonl,htons,ntohl,ntohs等函数转换一下,字符串由于是单字节排序的不需要转换,但应注意c++字符串是以'/0'作为结束符的,如果找不到'/0'可能会出现一些乱...

weixin_39715187的博客 1453

C++与Java通过WebService通信(上)

一、 前言 本篇讲述如果通过C++客户端访问Java服务端发布的SOAP模式的WebService接口。文档中的样例代码拷贝出去即可运行,所有的代码都是本地测试OK的;不但解决了接口调用的问题,同时解决了中文乱码的问题。可以说,看到了这篇文章就不需要在google其它的文章了。 二、 环境准备 1、 CXF组件:Java端用于发布WebService服务的开源组件,内部自带jetty W

Neo.Yang的专栏 7538

@value 乱码_STM32串口打印输出乱码的解决办法

前言最近在试用uFUN开发板,下载配套的Demo程序,串口数据输出正常,当使用另一个模板工程,调用串口printf调试功能时,输出的却是乱码,最后发现是外部晶振频率不一样。很多STM32开发板都是使用的8M晶振,这个也是ST官方推荐的晶振频率,而且固件库默认是8M频率,倍频系数9。而uFUN开发板的晶振是和CH340共用一个12M晶振。如果固件库的参数不和硬件实际连接的晶振频率一致,那么不仅是串口...

weixin_39960920的博客 358

项目中碰见的错误(二) java socket接收中文乱码问题

今天写Tcp,发现中文乱码的问题,百度了一下,发现这篇文章,开头两句话就解决了我的问题,读完受益匪浅啊,呵呵,收藏先。尊重版权:原文地址:http://hi.baidu.com/linjk03/blog/item/10023afad8303cd9b48f311a.htmlin = new BufferedReader(new InputStreamReader(socket.g

cpcpc的专栏 3204

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

原文链接:http://www.cnblogs.com/kenkofox/archive/2010/04/25/1719649.html 代码: http://files.cnblogs.com/kenkofox/Client-CPlusPlus.rarhttp://files.cnblogs.com/kenkofox/Server_Java.rar java和C++使用...

weixin_30537451的博客 183
上一篇: 介绍几种java中网络通信的方式
下一篇: HTTP协议理解
戎兰
博客等级 码龄17年 34粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值