今天给各位分享javaudp组包的知识,其中也会对Javaudp进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:
1、UDP数据包是什么?2、java怎么实现JSON打包UDP3、一个简单java实现udp通信
UDP数据包是什么?
UDP协议的全称是用户数据报,在网络中它与TCP协议一样用于处理数据包。在OSI模型中,在第四层——传输层,处于IP协议的上一层。UDP有不提供数据报分组、组装和不能对数据包的排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。
为什么要使用UDP
在选择使用协议的时候,选择UDP必须要谨慎。在网络质量令人不十分满意的环境下,UDP协议数据包丢失会比较严重。但是由于UDP的特性:它不属于连接型协议,因而具有资源消耗小,处理速度快的优点,所以通常音频、视频和普通数据在传送时使用UDP较多,因为它们即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响。比如我们聊天用的ICQ和OICQ就是使用的UDP协议。
在Java中操纵UDP
使用位于JDK中Java.net包下的DatagramSocket和DatagramPacket类,可以非常方便地控制用户数据报文。
在描述它们之前,必须了解位于同一个位置的InetAddress类。InetAddress实现了Java.io. Serializable接口,不允许继承。它用于描述和包装一个Internet IP地址,通过三个方法返回InetAddress实例:
getLocalhost():返回封装本地地址的实例。
getAllByName(String host):返回封装Host地址的InetAddress实例数组。
getByName(String host):返回一个封装Host地址的实例。其中,Host可以是域名或者是一个合法的IP地址。
DatagramSocket类用于创建接收和发送UDP的Socket实例。和Socket类依赖SocketImpl类一样,DatagramSocket类的实现也依靠专门为它设计的DatagramScoketImplFactory类。DatagramSocket类有3个构建器:
DatagramSocket():创建实例。这是个比较特殊的用法,通常用于客户端编程,它并没有特定监听的端口,仅仅使用一个临时的。
DatagramSocket(int port):创建实例,并固定监听Port端口的报文。
DatagramSocket(int port, InetAddress localAddr):这是个非常有用的构建器,当一台机器拥有多于一个IP地址的时候,由它创建的实例仅仅接收来自LocalAddr的报文。
值得注意的是,在创建DatagramSocket类实例时,如果端口已经被使用,会产生一个SocketException的异常抛出,并导致程序非法终止,这个异常应该注意捕获。DatagramSocket类最主要的方法有4个:
Receive(DatagramPacket d):接收数据报文到d中。receive方法产生一个“阻塞”。
Send(DatagramPacket d):发送报文d到目的地。
SetSoTimeout(int timeout):设置超时时间,单位为毫秒。
Close():关闭DatagramSocket。在应用程序退出的时候,通常会主动释放资源,关闭Socket,但是由于异常地退出可能造成资源无法回收。所以,应该在程序完成时,主动使用此方法关闭Socket,或在捕获到异常抛出后关闭Socket。
“阻塞”是一个专业名词,它会产生一个内部循环,使程序暂停在这个地方,直到一个条件触发。
DatagramPacket类用于处理报文,它将Byte数组、目标地址、目标端口等数据包装成报文或者将报文拆卸成Byte数组。应用程序在产生数据包是应该注意,TCP/IP规定数据报文大小最多包含65507个,通常主机接收548个字节,但大多数平台能够支持8192字节大小的报文。DatagramPacket类的构建器共有4个:
DatagramPacket(byte[] buf, int length, InetAddress addr, int port):从Buf数组中,取出Length长的数据创建数据包对象,目标是Addr地址,Port端口。
DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port):从Buf数组中,取出Offset开始的、Length长的数据创建数据包对象,目标是Addr地址,Port端口。
DatagramPacket(byte[] buf, int offset, int length):将数据包中从Offset开始、Length长的数据装进Buf数组。
DatagramPacket(byte[] buf, int length):将数据包中Length长的数据装进Buf数组。
DatagramPacket类最重要的方法就是getData()了,它从实例中取得报文的Byte数组编码。
★简单的实例说明
{接收数据的服务器}
byte[] buf = new byte[1000];
DatagramSocket ds = new DatagramSocket(12345);
//开始监视12345端口
DatagramPacket ip = new DatagramPacket(buf, buf.length);
//创建接收数据报的实例
while (true)
{
ds.receive(ip);
//阻塞,直到收到数据报后将数据装入IP中
System.out.println(new String(buf));
}
{发送数据的客户端}
InetAddress target = InetAddress.getByName(“”);
//得到目标机器的地址实例
DatagramSocket ds = new DatagramSocket(9999);
//从9999端口发送数据报
String hello = “Hello, I am come in!”;
//要发送的数据
byte[] buf = hello.getBytes();
//将数据转换成Byte类型
op = new DatagramPacket(buf, buf.length, target, 12345);
//将BUF缓冲区中的数据打包
ds.send(op);
//发送数据
ds.close();
//关闭连接
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
输出结果为:
一个简单java实现udp通信
UDP也可以和TCP那样遍历list然后发送啊
客户端向外面开一个UDP端口接受数据报
然后服务器这边要是有消息要发送就直接发送数据报包就可以了嘛
UDP都不用保持着连接的,比TCP还简单些
另外也可以用组播来实现,搜索下java UDP 组播,你能找到不少实例性的代码,也有聊天室的代码
关于javaudp组包和Javaudp的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。