firefly学习笔记之C客户端与Python服务器交互(2)

来源:互联网 发布:犀牛软件 手机建模 编辑:程序博客网 时间:2024/06/06 11:42


    承接上文,这里我们介绍另外一种通信格式!

  

   2.xml数据

      Xml数据,以前在用gsoap的时候稍微接触过,相比较json,xml数据过大,而且解析xml数据也不是很块,不过xml的数据可读性稍微强一点。而且他很json很像,所以就跳过了。

   3.json解析

   这里客户端json解析用的是rapidjson,相比较JsonCpp而言, 性能提高了很多,就选它了。  Cocos2dx也在2.2.2版本将Jsoncpp替换为rapidJson.,下面显示几张,python和json数据的转换图

  

 

// 中文testpython.cpp : Defines the entry point for the console application.////中文#include "stdafx.h"#include <Windows.h>#include "rapidjson.h"#include "document.h"#include "reader.h"#include "writer.h"#include "stringbuffer.h"#include <string>using namespace std;#pragma comment(lib,"ws2_32.lib")#pragma pack(push)#pragma pack(1)struct sTest{int id;char szName[10];};#pragma pack(pop)//iconv也行string Utf8ToGBK(string str){string strOutUTF8 = "";  wchar_t * str1;  int n = MultiByteToWideChar(CP_UTF8, 0, str.c_str(), -1, NULL, 0);//获取长度str1 = new wchar_t[n];MultiByteToWideChar(CP_UTF8, 0, str.c_str(), -1, str1, n);//unicoden = WideCharToMultiByte(CP_ACP, 0, str1, -1, NULL, 0, NULL, NULL);//unicodeTogbkchar * str2 = new char[n];  WideCharToMultiByte(CP_ACP, 0, str1, -1, str2, n, NULL, NULL);  strOutUTF8 = str2;  delete[]str1;  str1 = NULL;  delete[]str2;  str2 = NULL;  return strOutUTF8.c_str();  }//对象转换为string对象string ConvertTestToChars(sTest *pTest){//利用jsonif (pTest == NULL)return NULL;rapidjson::Document doc;doc.SetObject();//设置为对象rapidjson::Document::AllocatorType &allocator = doc.GetAllocator();//添加成员doc.AddMember("id",1,allocator);doc.AddMember("name",pTest->szName,allocator);//转换为字符串rapidjson::StringBuffer buf;//utf8rapidjson::Writer<rapidjson::StringBuffer> write(buf);doc.Accept(write);return buf.GetString();}sTest *ConvertcharsToTes(char* pBytes){sTest *pTest = new sTest;//解析jsonrapidjson::Document doc;doc.Parse<0>(pBytes);rapidjson::Value &id   = doc["id"];pTest->id = id.GetInt();rapidjson::Value &name   = doc["name"];sprintf(pTest->szName ,"%s",Utf8ToGBK(name.GetString()).c_str());//默认是utf8,可以用iconv解析return pTest;}string ConvertArrayTestsToString(sTest *pTest,int nCount){//生成json数据rapidjson::Document doc;doc.SetObject();rapidjson::Document::AllocatorType &allocator = doc.GetAllocator();//设置一个数组rapidjson::Value array(rapidjson::kArrayType);for (int i = 0; i < nCount;++i){char szTmp[10] = {0};//定义一个对象rapidjson::Value object(rapidjson::kObjectType);object.AddMember("id",i,allocator);sprintf(szTmp,"天地%d",i);object.AddMember("name",szTmp,allocator);array.PushBack(object,allocator);}doc.AddMember("cnt",nCount,allocator);doc.AddMember("values",array,allocator);rapidjson::StringBuffer buf;rapidjson::Writer<rapidjson::StringBuffer> write(buf);doc.Accept(write);return buf.GetString();}sTest *ConvertStringToArrayTests(char *pBytes,int &nCnt){//json解析出来默认是utf8字符串rapidjson::Document doc;doc.Parse<rapidjson::kParseDefaultFlags> (pBytes);rapidjson::Value &cnt = doc["cnt"];nCnt = cnt.GetInt();sTest *pTest = new sTest[nCnt];rapidjson::Value &values = doc["values"];//是否为数组if (values.IsArray()){for (int i = 0; i < nCnt; ++i){rapidjson::Value &vax = values[i];if (!vax.IsNull() && vax.IsObject()){rapidjson::Value &id = vax["id"];rapidjson::Value &name = vax["name"];pTest[i].id = id.GetInt();sprintf(pTest[i].szName,"%s",Utf8ToGBK(name.GetString()).c_str());}}}return pTest;}int _tmain(int argc, _TCHAR* argv[]){WSADATA wd;WSAStartup(MAKEWORD(2,2),&wd);SOCKET client = socket(AF_INET,SOCK_STREAM,0);if (client == SOCKET_ERROR){printf("error:%d\n",WSAGetLastError());exit(0);}SOCKADDR_IN addr;addr.sin_family = AF_INET;addr.sin_port = htons(8877);addr.sin_addr.s_addr  = inet_addr("127.0.0.1");int ret = connect(client,(SOCKADDR*)&addr,sizeof(SOCKADDR_IN));if (ret != 0){printf("error:%d\n",WSAGetLastError());exit(0);}sTest*pTest = new sTest;pTest->id = 1;sprintf(pTest->szName,"天地");//pTest转换为json数据string str = ConvertTestToChars(pTest);printf("%s",str.c_str());int sendsize = send(client,str.c_str(),str.length(),0);printf("%d\n",sendsize);char recvbuf[1024];//解析int recvsize = recv(client,recvbuf,1024,0);recvbuf[recvsize] = '\0';sTest *pTest2 = NULL;pTest2 = ConvertcharsToTes(recvbuf);printf("%d,%s",pTest2->id,pTest2->szName);//发送数组sTest *pTest3 = new sTest[5];for ( int i = 0; i < 5; ++i){pTest3[i].id = i+5;char szTmp[10] = {0};sprintf(szTmp,"天才%d",i);strcpy(pTest3[i].szName,szTmp);}string senddata = ConvertArrayTestsToString(pTest3,5);sendsize = send(client,senddata.c_str(),senddata.length(),0);//recvmemset(recvbuf,0,1024);recvsize = recv(client,recvbuf,1024,0);recvbuf[recvsize] = '\0';int nCnt = 0;sTest*pTest4 = ConvertStringToArrayTests(recvbuf,nCnt);for (int i = 0; i < nCnt;++i){printf("(%d,%s)\n",pTest4[i].id,pTest4[i].szName);}WSACleanup();system("pause");return 0;}

python server.py:

#coding:utf8'''@author: Administratorjson为通信格式'''import socket;import sys;import json;if __name__ == "__main__":    host="127.0.0.1";    port=8877;    addr=(host,port);        #socket创建    try:        server = socket.socket(socket.AF_INET,socket.SOCK_STREAM);    except socket.error,msg:        print "socket create error:%d errmsg:%s"%(msg[0],msg[1]);        sys.exit();    else:        print "socket create success!";        #bind    try:        server.bind(addr);    except socket.error,msg:        print "socket bind error:%d errmsg:%s"%(msg[0],msg[1]);        sys.exit();    else:        print "socket bind sucess!";        #listen    server.listen(10);        #accept    while True:        client,caddr = server.accept();                print " connect server" +str(caddr);                recvdata = client.recv(1024);                print len(recvdata);               #解码        recvdata = recvdata.decode("gbk");               #json数据        #josn对象python词典        recvjson = json.loads(recvdata);                idx = recvjson["id"];        name = recvjson["name"];                print "(%d,%s)"%(idx,name);                #自定义json对象发送        chardata = {};                chardata["id"] = 11;        chardata["name"] = "天地2";                print chardata;        #默认encoding        senddata = json.dumps(obj = chardata);                client.sendall(senddata);                        #接收数组消息        recvdata = client.recv(1024);         print len(recvdata);                recvdata = recvdata.decode("gbk");                recvjson = json.loads(recvdata);                ncnt = recvjson["cnt"];                #list        values = recvjson["values"];                for data in values:            print data["id"],data["name"].decode("utf8");                #send        charinfo = {};                cnt = 2;        charinfo["cnt"] = cnt;                charlist = [];        for i in range(cnt):            charlist.append({"id":i+10,"name":"古"});                charinfo["values"] = charlist;                senddata = json.dumps(charinfo);                client.sendall(senddata);        client.close();    server.close();  

0 0