代码:
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++发来的消息。
可能是用错函数之类的,后边改为下边的代码接收就没事了。
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->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麻烦很多嘛,哈哈)
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->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。
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->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定义了一个异常。
分享到:
相关推荐
服务端和客户端中分别对socket进行的操作,进行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 java c++ socket
C++实现服务端跟客户端通信,已验证 简单例子,适合新手学习 , 创建工程直接运行即可 ,有兴趣的可以共同学习 ,
简单tcp socket 客户端 服务端代码实现 附C++代码源码
Java客户端,c++服务端通过socket进行网络通信,传输数据
java与c++通过socket通信。其中java作为客户端,c++作为服务器。主要解决了C++中的结构体在java中如何实现和模拟。还有int,float,及字符串的处理。极具代表性。
一个C++高性能http服务端和客户端库,个C++高性能http服务端和客户端库一个C++高性能http服务端和客户端库 一个C++高性能http服务端和客户端库 一个C++高性能http服务端和客户端库 一个C++高性能http服务端和客户端...
基于tcp通讯,涉及java的netty服务器的推送功能和c++socket的封装以及protobuf在java和c++中的使用。
本代码是c++ socket编程实例。包含客户端和服务端,可以实现客户端发送消息,服务端接收消息并写入日志。 server.cpp为服务端。 client.cpp为客户端。
基于 socket通信的服务端和客户端 C++网络编程
一个特别好的SOCKET通信实例程序,同时实现了服务端和客户端!接收数据写入Excel,代码简单易懂,注释详细!不需要精通MFC和Socket通信。
c++ socket 服务端&客户端实现源码 大家一起学习下 c++ socket 服务端&客户端实现源码 大家一起学习下 c++ socket 服务端&客户端实现源码 大家一起学习下
一个socket对应多个client,每个socket开启一个新的线程。可直接使用。
C++写的服务器与Java写的客户端通过Socket通信C++代码,by zxy,编程交流QQ群:168424095
java和c++通信,支持多用户并发,采用java非阻塞式socket通信。
vs2010实现的socket服务端代码,C++编程,适合入门者下载看看
socket通信库,c++编写,只需调用几个函数即可完成socket通信过程。简单易用,C#等其他语言可调用.问题沟通可发送邮件至gaocongly@126.com
服务端C++程序,客户端java程序,发送报文格式:结构体报头+数据负载,客户端发送和接收时需要做字节序的转换。 Ecplise+jdk1.6 运行成功
socket server关闭时导致socket client也关闭 的原因及解决办法 tcp socket进程结束时,tcp socket客户端也会结束(崩溃)的原因及解决办法
C++ 客户端与服务端之间点对点的通讯 希望能够帮到你们