java怎么实现JSON打包UDP

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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>
#include<QtNetwork>


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"
#include<QJsonObject>
#include<QJsonDocument>
#include<QDebug>

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_num>0)

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

输出结果为:

参考技术A 一,json_encode作用:
json_encode — 对变量进行 JSON 编码。
说明:string json_encode ($value ),返回 value 值的 JSON 形式。
参数:待编码的 value ,除了resource 类型之外,可以为任何数据类型
该函数只能接受 UTF-8 编码的数据(译注:指字符/字符串类型的数据)
返回值:编码成功则返回一个以 JSON 形式表示的 string 。
二,客户端用java语言解码:
方法一:
public String unescapeUnicode(String str)
StringBuffer b=new StringBuffer();
Matcher m = Pattern.compile("\\\\u([0-9a-fA-F]4)").matcher(str);
while(m.find())
b.append((char)Integer.parseInt(m.group(1),16));
return b.toString();


方法二:
直接使用unescapeUnicode()方法解码就可以了。
使用 json_simple.jar 包解析
下载地址:http://code.google.com/p/json-simple/downloads/list
JSON.simple是一个简单的Java类库,用于解析和生成JSON文本。不依赖于其它类库,性能高。
Object obj=JSONValue.parse(jsonStr);
return obj.toString();
参考技术B JSON 打包UDP? 很费解 。。。。。。。UDP 一种通讯方式。。。JSON是一些字符串

以上是关于java怎么实现JSON打包UDP的主要内容,如果未能解决你的问题,请参考以下文章

谁知道怎么把java web项目打包成exe可执行文件,要连数据库一起打包

java web 将文件打包成 .zip后 怎么自动弹出下载框提示并下载?

java基础——UDP实现dos聊天室案例

hbuilder中manifest.json怎么云端打包

vue项目打包成apk

请问Delphi 7.0开发的程序如何打包?