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可执行文件,要连数据库一起打包