MINA服务端与C++客户端通讯(2)

本文提供了一个使用UTF-8编码进行跨语言通讯的C++客户端示例,包括字符编码转换的具体实现,以及与Java服务端交互的完整过程。

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服务端下载地址:http://download.csdn.net/source/3418326

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值