Java与C++通讯还有编码转码的问题存在,假设通讯编码采用UTF-8
C++客户端发送时需要转码成UTF-8编码,接收服务端应答消息后再转回Unicode或者GBK编码
下面给出完成的C++客户端通讯示例:
void Transcoding(LPCTSTR src, UINT srcCode, string& dest, UINT destCode)
{
int len = MultiByteToWideChar(srcCode, 0, src, -1, NULL, 0);
WCHAR* srcTemp = new WCHAR[len];
MultiByteToWideChar(srcCode, 0, src, -1, srcTemp, len);
len = WideCharToMultiByte(destCode, 0, srcTemp, -1, NULL, 0, NULL, NULL);
char* destTemp = new char[len];
WideCharToMultiByte(destCode, 0, srcTemp, -1, destTemp, len, NULL, NULL);
dest = destTemp;
delete []srcTemp;
delete []destTemp;
}
int _tmain(int argc, _TCHAR* argv[])
{
// client connect
CXSocket client;
client.initWinSocket();
client.setAddress("127.0.0.1");
client.setPort(1234);
client.setProtoType(TCP);
int ret = client.connect();
if(ret < 0)
{
getchar();
return 0;
}
// 加通讯协议头demo
// client send
char send[] = {"CXSocket 第一个测试用例."};
string utf8;
Transcoding(send, CP_ACP, utf8, CP_UTF8);
XNET::TPacketHeader sendHeader;
sendHeader.m_HeaderSig = 0xABCD;
swap_2(sendHeader.m_HeaderSig);
sendHeader.m_Length = (int)utf8.length();
swap_4(sendHeader.m_Length);
char buffer[1024] = {0};
memcpy(buffer, &sendHeader, XNET::TCP_HEADLEN);
memcpy(&buffer[XNET::TCP_HEADLEN], utf8.c_str(), utf8.length());
client.sendBuf(buffer, (int)(XNET::TCP_HEADLEN + utf8.length()));
// client recv
XNET::TPacketHeader recvHeader;
client.receiveBuf(&recvHeader, XNET::TCP_HEADLEN);
swap_2(recvHeader.m_HeaderSig);
swap_4(recvHeader.m_Length);
char* recv = new char[recvHeader.m_Length + 1];
memset(recv, 0, recvHeader.m_Length + 1);
client.receiveBuf(recv, recvHeader.m_Length);
string ansi;
Transcoding(recv, CP_UTF8, ansi, CP_ACP);
client.close();
client.uninitWinSocket();
getchar();
return 0;
}
CXSocket类下载地址:http://code.google.com/p/x-net/
MINA服务端Demo下载地址:http://download.csdn.net/source/3418326