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
- firefly学习笔记之C客户端与Python服务器交互(2)
- firefly学习笔记之C客户端与Python服务器交互(1)
- firefly学习笔记之C客户端与Python服务器交互(3)
- firefly笔记之python socket
- android服务器与客户端交互之servlet
- node.js学习笔记之创建UDP服务器与客户端
- android客户端 与服务器交互
- fms 服务器与客户端交互
- Android 客户端与服务器交互
- 客户端与服务器的交互
- HLS协议之服务器与客户端之前的交互流程
- HLS协议之服务器与客户端之前的交互流程
- python与c语言交互---学习012
- Android学习总结(2)——App客户端与服务器交互中的token
- lua 与 C交互 学习笔记
- FireFly开发之路(一)python学习一
- FireFly开发之路(二)python学习二
- 基于TCP的服务器与客户端的简单交互2
- 使用ScriptX实现特殊效果的页面打印功能
- 黑马程序员-单例设计模式
- A* 寻路算法
- poj 1281 MANAGER(简单模拟题)
- 无线网络通信技术完全介绍
- firefly学习笔记之C客户端与Python服务器交互(2)
- 块状元素(div)与内联元素(span)
- 网站文件的同步
- cocos2d-x的初步连连看一
- fpga流水线理解
- 黑马程序员.bobo.DAY.6
- Webkit for android java层主要类库关系及浏览器实例讲解
- jQuery基础---filter()和find()
- Windows环境下Oracle VM VirtualBox安装ubuntu