您的位置:首页 > 编程语言 > C语言/C++

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

2012-01-15 04:14 816 查看
======================================================

注:本文源代码点此下载

======================================================

代码:
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//接受数据,但不允许有中文,因为会乱码
22datainputstream in = new datainputstream(clientsocket.getinputstream());
33byte[] buffer = new byte[10000];//缓冲区的大小
44in.read(buffer);//处理接收到的报文,转换成字符串
55/**
6 6* c++传递过来的中文字,需要转化一下。c++默认使用gbk。
7 7* gb2312是gbk的子集,只有简体中文。因为数据库用gb2312,所以这里直接转为gb2312
8 8* */
99message = 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麻烦很多嘛,哈哈)
1byte[] responsebuffer = newclientrequesthandler(message).response().getbytes("gb2312");
2out.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());
3out.print(test);//直接utf8输出,最终底层每个中文用3个字节传输
4out.print(newstring(test.getbytes(),"gbk"));//转gbk失败,实际每个中文字用了4到5个字节传递
5out.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定义了一个异常。

======================================================

在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定
这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐