本文目錄一覽:
- 1、java怎麼實現JSON打包UDP
- 2、有哪些 C++ 的 JSON 庫比較好
- 3、cocos2d-x集成anychat行不行
- 4、有沒有誰在stm32上使用過cJSON庫
- 5、linux 下c程序哪一個json庫比較好用
- 6、如何提高 C/C++ 編程能力?
java怎麼實現JSON打包UDP
java實現JSON打包UDP cJSON支持在C程序中創建和解析JSON數據,其提供多種方法供C程序使用,最直接的是將cJSON.c和cJSON.h加入到C工程中
(1) QJsonObject用於在Qt中創建JSON對象
(2)數據傳輸通過UDP運行
代碼如下
首先在pro文件中加入
QT += network
h文件內容:
首先在pro文件中加入
QT += network
h文件內容:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include QMainWindow
#includeQtNetwork
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
QUdpSocket *sender;
QByteArray byteArray;
private slots:
void on_pushButton_clicked();
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
cpp文件內容:
#include “mainwindow.h”
#include “ui_mainwindow.h”
#includeQJsonObject
#includeQJsonDocument
#includeQDebug
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui-setupUi(this);
sender = new QUdpSocket(this);
QJsonObject rectJson;
rectJson.insert(“Type”,”Rectangle”);
rectJson.insert(“height”,42);
rectJson.insert(“widght”,23);
QJsonDocument rectJsonDoc;
rectJsonDoc.setObject(rectJson);
byteArray = rectJsonDoc.toJson(QJsonDocument::Compact);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
QHostAddress address;
address.setAddress(QString(“192.168.230.140”));
sender-writeDatagram(byteArray.data(),byteArray.size(),
address,4444);
}
程序通過端口4444,向IP為192.168.230.140的主機發送JSON數據
C程序如下:
{
int sock_fd;
char rcv_buff[512];
struct sockaddr_in client_addr;
struct sockaddr_in server_addr;
int client_len;
int rcv_num = -1;
if ((sock_fd = socket(AF_INET, SOCK_DGRAM,0)) 0)
{
perror(“socket create error\n”);
exit(1);
}
memset(server_addr,0,sizeof(struct sockaddr_in));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(4444);
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
client_len = sizeof(struct sockaddr_in);
if (bind(sock_fd, (struct sockaddr *)server_addr, sizeof(struct sockaddr_in)) 0)
{
perror(“bind socket error.\n”);
exit(1);
}
while (1)
{
/*zero the buff of rvbsm and hvbsm? zhp*/
rcv_num= recvfrom(sock_fd, rcv_buff, sizeof(rcv_buff), 0, (struct sockaddr*)client_addr, client_len);
if (rcv_num0)
{
rcv_buff[rcv_num] = ‘\0’;
printf(“rx bsm num = %d\n”,rcv_num);
//printf();
printf(“%s %u says: %s\n”,inet_ntoa(client_addr.sin_addr),ntohs(client_addr.sin_port),rcv_buff);
//parse_UDP_data(rcv_num,rcv_buff);
if(rcv_buff != NULL)
{
cJSON* pJson = cJSON_Parse(rcv_buff);
if(pJson == NULL)
{
printf(“Json Parse failed.\n”);
return 0;
}
cJSON* pSub1 = cJSON_GetObjectItem(pJson,”Type”);
cJSON* pSub2 = cJSON_GetObjectItem(pJson,”height”);
cJSON* pSub3 = cJSON_GetObjectItem(pJson,”widght”);
if(pSub1!=NULL)
{
printf(“Type : %s\n”, pSub1-valuestring);
}
if(pSub2!=NULL)
{
printf(“height : %d\n”, pSub2-valueint);
}
if(pSub3!=NULL)
{
printf(“widght : %d\n”, pSub3-valueint);
}
}
}
else
{
perror(“recv BSM error\n”);
break;
}
}
close(sock_fd);
}
編譯C程序:gcc -I. -lm -o rencode *.c
由於cJSON使用了標準數學庫,所以在編譯中需鏈接其庫文件-lm;
在IP為192.168.230.140的Linux服務器中執行./rencode
輸出結果為:
有哪些 C++ 的 JSON 庫比較好
我現在用的是cJSON這個JSON庫,在github上可以下載到,是開源的,Windows和Linux系統開發都可以用。而且是最輕量級的JSON庫,下載下來之後再解壓,只需要將裡面的cJSON.c和cJSON.h這兩個文件複製到你的項目(源碼)目錄就可以了(需要調用cJSON的那個代碼文件要加上一句#include “cJSON.h”)。使用起來也超簡單,通過閱讀cJSON.h中的函數注釋和github上面的說明你就會知道怎麼用。
cocos2d-x集成anychat行不行
一、功能描述、SDK版本和帳號準備
功能大致是這樣的:在遊戲中設置一個按鈕,點擊這個按鈕,彈出知名社交平台的分享圖標集窗口,用戶選擇分享目標後,相關信息分享到對應的社交平台。分享結果通知通過Toast顯示在屏幕的下方。
這次依舊使用ShareSDK for Android 2.3.7版本(ShareSDK-Android-2.3.7),Cocos2d-x的版本為3.0rc2。
集成前,你需要有一個基於Cocos2d-x 3.0rc2的可運行的Android平台遊戲project,我們的集成就基於該project,這裡我們的project名為GameDemo,GameDemo的源碼結構大致是:
複製代碼 代碼如下:
GameDemo/
– Classes/
– proj.android/
– Resources/
– cocos2d/
– CMakeLists.txt
– … …
使用ShareSDK前,你需要在各大主流社交平台(微信、微博)申請開發者帳號以及遊戲接入權限(app_key、app_secret)等,當然在ShareSDK站點也應該有自己的帳號和應用AppKey,這些申請的審核需要幾個工作日,甚至更長。
二、ShareSDK集成步驟
按照ShareSDK官方manual說法,Cocos2d-x集成ShareSDK有三種方式,之前在Cocos2d-x 2.2.2引擎中採用的是專用組件集成的方式,該組件(C2DXShareSDKSample)可以在這裡下載(,該組件近期已經fix了我之前發現的bug)。
1.jar包集成
這次我們主要做微博、微信的社交分享,因此只需要微博、微信相關jar包。在C2DXShareSDKSample/proj.android/libs下,我們找到以下幾個jar包:
複製代碼 代碼如下:
-rw-rw-r– 1 tonybai tonybai 97K 4月 8 18:10 mframework.jar
-rw-rw-r– 1 tonybai tonybai 112K 4月 8 17:39 ShareSDK-Core-2.3.7.jar
-rw-rw-r– 1 tonybai tonybai 19K 4月 8 17:39 ShareSDK-SinaWeibo-2.3.7.jar
-rw-rw-r– 1 tonybai tonybai 4.3K 4月 8 17:39 ShareSDK-Wechat-2.3.7.jar
-rw-rw-r– 1 tonybai tonybai 29K 4月 8 17:39 ShareSDK-Wechat-Core-2.3.7.jar
-rw-rw-r– 1 tonybai tonybai 4.6K 4月 8 17:39 ShareSDK-Wechat-Favorite-2.3.7.jar
-rw-rw-r– 1 tonybai tonybai 4.4K 4月 8 17:39 ShareSDK-Wechat-Moments-2.3.7.jar
把這些jar包文件Copy到GameDemo/proj.android/libs下。
2. 配置文件與資源部分集成
修改GameDemo/proj.android/AndroidManifest.xml文件,在application標籤下,添加如下Activity標籤:
複製代碼 代碼如下:
activity
android:name=”cn.sharesdk.framework.ShareSDKUIShell”
android:configChanges=”keyboardHidden|orientation|screenSize”
android:screenOrientation=”portrait”
android:theme=”@android:style/Theme.Translucent.NoTitleBar”
android:windowSoftInputMode=”stateHidden|adjustResize”
/activity
activity
android:name=”.wxapi.WXEntryActivity”
android:configChanges=”keyboardHidden|orientation|screenSize”
android:exported=”true”
android:screenOrientation=”portrait”
android:theme=”@android:style/Theme.Translucent.NoTitleBar” /
將C2DXShareSDKSample/proj.android/res下的如下目錄中的文件複製到GameDemo/proj.android/res下:
複製代碼 代碼如下:
drawable-hdpi/ drawable-ldpi/ drawable-mdpi/
drawable-xhdpi/ layout/ values/ values-en/
注意,類似icon.png這種文件就不要複製了,自己做一下判斷就好。
3. C++部分代碼集成
將C2DXShareSDKSample/Classes下的C2DXShareSDK文件夾Copy到GameDemo/Classes下面。
由於Cocos2d-x 3.0rc2的類命名發生了變化,我們需要對C2DXShareSDK中使用到的引擎中的類名以及方法名進行修改。但實際上Cocos2d-x 3.0rc2考慮到了一些兼容性的問題,大部分名字通過cocos2d/cocos/deprecated/CCDeprecated.h中定義的typedef得以保留,雖然這些名字已經被建議deprecated了。rc2中CCObject被改名為Ref了,這個我們需要手工在C2DXShareSDK進行修改。
另外ShareSDK組件在實現時大量使用了CCDictionary、CCArray和CCString,而這三個類在Cocos2d-x 3.0rc2中均被deprecated了,但我們依然可以使用,所以我們可以不做修改。但以後隨着cocos2d-x版本的演進,這些類很可能被徹底移除出引擎,我們就需要重新使用其替代品進行實現了。
此外我們還需要手工修改一下C2DXShareSDK/Android/JSON/CCJSONConverter.cpp文件中的getObjJson方 法,因為rc2中CCDictionary、CCString、CCArray這些類的真實名稱都已經換成了__Dictionary、__String 和__Array,CCDictionary、CCString、CCArray只是些typedef,因此要像下面這樣做些修改(如果你是集成 cocos2d-x 2.x.x版本,則無需做下面修改):
複製代碼 代碼如下:
cJSON * CCJSONConverter::getObjJson(Ref * obj)
{
std::string s = typeid(*obj).name();
if(s.find(“__Dictionary”)!=std::string::npos){
cJSON * json = cJSON_CreateObject();
convertDictionaryToJson((CCDictionary *)obj, json);
return json;
}else if(s.find(“__Array”)!=std::string::npos){
cJSON * json = cJSON_CreateArray();
convertArrayToJson((CCArray *)obj, json);
return json;
}else if(s.find(“__String”)!=std::string::npos){
CCString * s = (CCString *)obj;
cJSON * json = cJSON_CreateString(s-getCString());
return json;
}else if(s.find(“CCNumber”)!=std::string::npos){
CCNumber * n = (CCNumber *)obj;
cJSON * json = cJSON_CreateNumber(n-getDoubleValue());
return json;
}else if(s.find(“CCNull”)!=std::string::npos){
cJSON * json = cJSON_CreateNull();
return json;
}
CCLog(“CCJSONConverter encountered an unrecognized type”);
return NULL;
}
CCNumber和CCNull是ShareSDK組件自己實現的類名,這裡無需修改。
接下來我們需要在AppDelegate.cpp中對ShareSDK做初始化了:
複製代碼 代碼如下:
bool AppDelegate::applicationDidFinishLaunching() {
… …
initShareSDK();
… ..
}
void AppDelegate::initShareSDK()
{
// sina weibo
CCDictionary *sinaConfigDict = CCDictionary::create();
sinaConfigDict-setObject(CCString::create(“YOUR_WEIBO_APPKEY”), “app_key”);
sinaConfigDict-setObject(CCString::create(“YOUR_WEBIO_APPSECRET”), “app_secret”);
sinaConfigDict-setObject(CCString::create(“”), “redirect_uri”);
C2DXShareSDK::setPlatformConfig(C2DXPlatTypeSinaWeibo, sinaConfigDict);
CCDictionary *wcConfigDict = CCDictionary::create();
wcConfigDict-setObject(CCString::create(“YOUR_WECHAT_APPID”), “app_id”);
C2DXShareSDK::setPlatformConfig(C2DXPlatTypeWeixiSession, wcConfigDict);
C2DXShareSDK::setPlatformConfig(C2DXPlatTypeWeixiTimeline, wcConfigDict);
C2DXShareSDK::setPlatformConfig(C2DXPlatTypeWeixiFav, wcConfigDict);
C2DXShareSDK::open(CCString::create(“YOUR_SHARESDK_APPKEY”), false);
}
在Share按鈕的事件回調函數中調用ShareSDK的接口進行社交平台分享:
複製代碼 代碼如下:
void GameScene::menuShareCallback(Ref* sender)
{
Dictionary *content = Dictionary::create();
content-setObject(String::create(“ShareSDK for Cocos2d-x 3.0rc2社交分享測試。”)
有沒有誰在stm32上使用過cJSON庫
源碼編譯一次就可以了。以後都可以不用編譯的。你知道make這個工具不,只要沒有被修改,文件就不會變編譯。你用的是mdk還是iar?如果是mdk你只要按編譯工具欄的中間那個鍵就是make;最右邊的是編譯所有文件這個就比較費時;最左邊的是檢查當前文件的語法。
我的等級不讓插入圖片如果有什麼不明白的,給我留言。
linux 下c程序哪一個json庫比較好用
推薦使用 cJSON, 很精巧的json解析庫,只有一個頭文件和一個源文件, 代碼精鍊,只有500多行。庫中附帶使用案例
如何提高 C/C++ 編程能力?
提高c和c++的最好辦法是去做項目、做題。
通常學習算法的人,會不停的做題目,要做題,國內去poj,zoj吧,不會的,直接網上找答案。
然後找一些開源的項目練練手,比如
Webbench
Webbench是一個在linux下使用的非常簡單的網站壓測工具。它使用fork()模擬多個客戶端同時訪問我們設定的URL,測試網站在壓力下工作的性能,最多可以模擬3萬個並發連接去測試網站的負載能力。Webbench使用C語言編寫, 代碼實在太簡潔,源碼加起來不到600行。下載鏈接:LippiOuYang/WebBench · GitHub
Tinyhttpd
Tinyhttpd是一個超輕量型Http Server,使用C語言開發,全部代碼只有502行(包括注釋),附帶一個簡單的Client,可以通過閱讀這段代碼理解一個 Http Server 的本質。下載鏈接鏈接:LippiOuYang/Tinyhttpd · GitHub
cJSON
cJSON是C語言中的一個JSON編解碼器,非常輕量級,C文件只有500多行,速度也非常理想。
cJSON也存在幾個弱點,雖然功能不是非常強大,但cJSON的小身板和速度是最值得讚賞的。其代碼被非常好地維護着,結構也簡單易懂,可以作為一個非常好的C語言項目進行學習。
項目主頁:cJSON | SourceForge.net
Libev
libev是一個開源的事件驅動庫,基於epoll,kqueue等OS提供的基礎設施。其以高效出名,它可以將IO事件,定時器,和信號統一起來,統一放在事件處理這一套框架下處理。基於Reactor模式,效率較高,並且代碼精簡(4.15版本8000多行),是學習事件驅動編程的很好的資源。
l
Memcached
Memcached 是一個高性能的分布式內存對象緩存系統,用於動態Web應用以減輕數據庫負載。它通過在內存中緩存數據和對象來減少讀取數據庫的次數,從而提供動態數據庫驅動網站的速度。Memcached 基於一個存儲鍵/值對的 hashmap。Memcached-1.4.7的代碼量還是可以接受的,只有10K行左右。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/300620.html