javaudp组包(Javaudp)

今天给各位分享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();

//关闭连接

javaudp组包(Javaudp)

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的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

本文来自投稿,不代表【】观点,发布者:【

本文地址: ,如若转载,请注明出处!

举报投诉邮箱:253000106@qq.com

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2024年4月4日 06:56:41
下一篇 2024年4月4日 07:04:51

相关推荐

  • javaudp组播,javaudp组播发送

    组播协议是基于UDP协议传输,还是TCP协议 首先看TCP/UDP的英文缩写可以知道,他们都有一个P字母,也就是协议的英文,说明他们都是表示一种协议的规则。 传输层:主要使网络程序进行通信,在进行网络通信时,可以采用TCP协议,也可以采用UDP协议。应用层:主要负责应用程序的协议,例如HTTP协议、FTP协议等。 一般是TCP协议,可以确保传输的安全性,会帮…

    2024年5月20日
    4100
  • javaudp文件,java中udp

    java中UDP文件传输怎么实现? 1、使用UDP协议进行文件传输不能保证正确性,很容易发生丢包的情况。建议在进行较大文件传输的时候使用TCP的Socket和ServerSocket类进行传输。 2、UDP协议 用户数据报协议UDP(User Datagram Protocol)是无连接传输层协议,提供应用程序之间传送数据报的基本机制。UDP报文的格式 每个…

    2024年5月17日
    4100
  • javaudp心跳程序,java socket 心跳

    将client.java改写成基于UDP协议的通信程序 UDP,即User Datagram Protocol(用户数据报协议),传输层协议。 您将学习如何使用Java编程语言进行UDP协议的开发,包括UDP套接字编程、数据报的发送和接收、错误处理等。此外,书中还讲解了与UDP协议相关的一些高级主题,如多播通信和DatagramChannel等。 Udp是面…

    2024年5月9日
    4200
  • javaudp通信(java udp通信)

    本篇文章给大家谈谈javaudp通信,以及java udp通信对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。 本文目录一览: 1、java udp通信中文乱码2、javaudp一直传输怎么回事3、java和C#之间UDP通信问题4、java UDP通信中十六进制的接收与发送5、TCP和UDP通信有什么区别 如何分别用java实现? java udp通…

    2024年4月2日
    4800
  • javaudp防阻塞

    Java中基于UDP的非阻塞编程 configureBloging(false) 然后注册监视器,selector.open(); 得到句柄;selectionKey key=(SelectionKey)selector.selected(); java udp 请求会阻塞吗java中UDP通信,两边都接收不了,都是阻塞状态,要先运行UdpServer2,因…

    2024年3月28日
    3700
  • javaudp多路分解

    TCP的多路复用和分解 1、首部包括源端口号和目的端口号,它用于多路复用/多路分解来自或送至上层应用的数据。另外,TCP首部也包括校验和字段。报文段首部还包含下列字段: 32比特的序号字段和32比特的确认号字段。这些字段被TCP发送方和接收方用来实现可靠数据传输服务。 2、全双工操作: TCP 进程能够同时发送和接收包。TCP 中的多路技术:大量同时发生的上…

    2024年3月20日
    4400
  • javaudp中文

    Java语言应用中实现UDP协议编程的方法? 1、使用DatagramPacket的方法,提取数据。关闭资源。 2、在java中想要实现上述两种协议通信,可采用socket建立连接,socket可以理解为码头,其实是套接字,这里简单说下,就好比两个城市运输货物,通过码头走货一样。 3、数据报套接字:使用传输层UDP协议 UDP,即User Datagram …

    2024年3月19日
    4200
  • javaudp外网通信 – java udp tcp

    java中UDP文件传输怎么实现? 使用UDP协议进行文件传输不能保证正确性,很容易发生丢包的情况。建议在进行较大文件传输的时候使用TCP的Socket和ServerSocket类进行传输。 我记忆中可靠的传输应该类似TCP的三次握手:发送方向接收方发送一个随机数。接收方收到随机数后将其+1,再回传给发送方。 UDP协议 用户数据报协议UDP(User Da…

    2024年3月18日
    4200
  • javaudp发送文件-java post发送文件

    如何用java实现UDP的可靠传输 发送方向接收方发送一个随机数。接收方收到随机数后将其+1,再回传给发送方。发送方收到随机数判断其是否被+1,如果是代表双方的传递线路是通畅的,可以正式开始传送数据。 \x0d\x0a在java中想要实现上述两种协议通信,可采用socket建立连接,socket可以理解为码头,其实是套接字,这里简单说下,就好比两个城市运输货…

    2024年3月17日
    3700
  • javaudp服务器设计-java服务器搭建

    java中UDP文件传输怎么实现? 发送方向接收方发送一个随机数。接收方收到随机数后将其+1,再回传给发送方。发送方收到随机数判断其是否被+1,如果是代表双方的传递线路是通畅的,可以正式开始传送数据。 } 将这个函数的返回值用一个静态变量保存起,以备我们在日后UDPchat.java上使用,同时我们将其放入到用户登录时的USer表中port列下。 \x0d\…

    2024年3月16日
    4800

发表回复

登录后才能评论



关注微信