代码:
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++发来的消息。
可能是用错函数之类的,后边改为下边的代码接收就没事了。
另外
最大的问题是字符的编码问题,如果发现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麻烦很多嘛,哈哈)
而C++接收方面,只需要用buf装起来,然后转为string就是了。正确显示……代码大概是:
charCount = recv(socket, buf, len, 0);
string resultString(buf);
另外为了更好理解上述的编码问题,大家在java端发送信息到C++端的时候,试试下边的方式试试,很有意思的。记得要在C++那边关注charCount。
接下来是完整的代码说明
java方面:
EchoServerThread是一个Server类,专门等待客户的连接,然后建立EchoThread进行处理。
EchoThread是一个处理消息的线程,主要包括接收消息和发送消息的socket操作。
ClientRequestHandler是处理字符串的实际业务逻辑类……
C++方面:
client.cpp是测试的主函数。
SocketManager.h包含SocketManager类,简单封装了Socket的启动和发送等操作。
connection.h包含Connection类,封装了Socket的底层调用。
conn_exception.h定义了一个异常。