「java组成udp包」java实现

博主:adminadmin 2023-01-13 21:09:07 428

今天给各位分享java组成udp包的知识,其中也会对java实现进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

JAVA中如何完成UDP包的封装

给你一段代码,或许可以帮到你……

public class SendSideTest {

/*发送数据 */

public static void main(String[] args) throws IOException {

//1 DatagramSocket是用来接收发送数据的

DatagramSocket ds = new DatagramSocket();

//2 发送什么

byte[] s="helloabcdef".getBytes();

//3 发送到哪,发送到本机

InetAddress clientAddress=InetAddress.getLocalHost();

//4 搭建一个outDataPacket相当于一个邮包

//把发送的内容,发送的地址,发送的端口,写在邮包上

DatagramPacket op = null;

op=new DatagramPacket(s, s.length,clientAddress, 9999);

//5 通过一个DatagramPacket将数据发送到客户端,

//客户端的地址由DatagramPacket指定,即写在邮包上

ds.send(op);

System.out.println("数据已经成功发送");

}

}

public class ReceiveSideTest {

/* 接收方*/

public static void main(String[] args) throws IOException {

//1 DatagramSocket相当于建立一个服务器 在9999监听

DatagramSocket ds = new DatagramSocket(9999);

//2 DatagramPacket是用来接收发送的数据的 要有容器接收

byte[] msg = new byte[100];

DatagramPacket ip = new DatagramPacket(msg, msg.length);

//3调用receive方法接收数据到DatagramPacket 中

//数据又由DatagramPacket放入msg

ds.receive(ip);

String msgs = new String(msg);

System.out.println(msgs);

//4通过DatagramPacket得到地址和端口 把发送者打印出来

InetAddress clientAddress = ip.getAddress();

int clientPort = ip.getPort();

System.out.println("发送者:"+clientAddress);

System.out.println("发送端口:"+clientPort);

}

}

JAVA用udp从本地网络穿透到公网之后,从其他网络作为客户端发送udp包到服务器正常接收。

你说的还不清楚。Java网络编程使用Socket,同为一个网络下的主机时是肯定没问题的,不论同一局域网或广域网。如果内网跨越网关,我没做过试验,按我的理解,内网主机做客户端,独立主机做服务器应该可行,反之不行。

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 组播,你能找到不少实例性的代码,也有聊天室的代码

Java写的一个udp的demo用来计算探针传送过来的数据,怎么实现一个接口来调用这个数据

Java UDP通信简单实现

1、Java实现方式

1)server端

/**

 * UDPserver端

 * */

public class UdpServer {

    // 定义一些常量

    private final intMAX_LENGTH = 1024; // 最大接收字节长度

    private final intPORT_NUM   = 5066;   // port号

    // 用以存放接收数据的字节数组

    private byte[] receMsgs = new byte[MAX_LENGTH];

    // 数据报套接字

    private DatagramSocket datagramSocket;

    // 用以接收数据报

    private DatagramPacket datagramPacket;

   

    public UdpServer(){

        try {

            /******* 接收数据流程**/

            // 创建一个数据报套接字,并将其绑定到指定port上

            datagramSocket = new DatagramSocket(PORT_NUM);

            // DatagramPacket(byte buf[], int length),建立一个字节数组来接收UDP包

            datagramPacket = new DatagramPacket(receMsgs, receMsgs.length);

            // receive()来等待接收UDP数据报

            datagramSocket.receive(datagramPacket);

           

            /****** 解析数据报****/

            String receStr = new String(datagramPacket.getData(), 0 , datagramPacket.getLength());

            System.out.println("Server Rece:" + receStr);

            System.out.println("Server Port:" + datagramPacket.getPort());

           

            /***** 返回ACK消息数据报*/

            // 组装数据报

            byte[] buf = "I receive the message".getBytes();

            DatagramPacket sendPacket = new DatagramPacket(buf, buf.length, datagramPacket.getAddress(), datagramPacket.getPort());

            // 发送消息

            datagramSocket.send(sendPacket);

        } catch (SocketException e) {

            e.printStackTrace();

        } catch (IOException e) {

            e.printStackTrace();

        } finally {

            // 关闭socket

            if (datagramSocket != null) {

                datagramSocket.close();

            }

        }

    }

}

2)client

/***

 * UDPclientClient端

 ***/

public class UdpClient {

   

    private String sendStr = "SendString";

    private String netAddress = "127.0.0.1";

    private final intPORT_NUM = 5066;

   

    private DatagramSocket datagramSocket;

    private DatagramPacket datagramPacket;

   

    public UdpClient(){

        try {

           

            /*** 发送数据***/

            // 初始化datagramSocket,注意与前面Server端实现的差别

            datagramSocket = new DatagramSocket();

            // 使用DatagramPacket(byte buf[], int length, InetAddress address, int port)函数组装发送UDP数据报

            byte[] buf = sendStr.getBytes();

            InetAddress address = InetAddress.getByName(netAddress);

            datagramPacket = new DatagramPacket(buf, buf.length, address, PORT_NUM);

            // 发送数据

            datagramSocket.send(datagramPacket);

           

            /*** 接收数据***/

            byte[] receBuf = new byte[1024];

            DatagramPacket recePacket = new DatagramPacket(receBuf, receBuf.length);

            datagramSocket.receive(recePacket);

           

            String receStr = new String(recePacket.getData(), 0 , recePacket.getLength());

            System.out.println("Client Rece Ack:" + receStr);

            System.out.println(recePacket.getPort());

           

           

        } catch (SocketException e) {

            e.printStackTrace();

        } catch (UnknownHostException e) {

            e.printStackTrace();

        } catch (IOException e) {

            e.printStackTrace();

        } finally {

            // 关闭socket

            if(datagramSocket != null){

                datagramSocket.close();

            }

        }

    }  

}

java 中怎么使用UDP?

发送步骤:

使用 DatagramSocket(int port) 建立socket(套间字)服务。

将数据打包到DatagramPacket中去

通过socket服务发送 (send()方法)

关闭资源

import java.io.IOException;  

import java.net.*;  

  

public class Send {  

  

    public static void main(String[] args)  {  

          

        DatagramSocket ds = null;  //建立套间字udpsocket服务  

          

        try {  

          ds = new DatagramSocket(8999);  //实例化套间字,指定自己的port  

        } catch (SocketException e) {  

            System.out.println("Cannot open port!");  

            System.exit(1);   

        }  

          

        byte[] buf= "Hello, I am sender!".getBytes();  //数据  

        InetAddress destination = null ;  

        try {  

            destination = InetAddress.getByName("192.168.1.5");  //需要发送的地址  

        } catch (UnknownHostException e) {  

            System.out.println("Cannot open findhost!");  

            System.exit(1);   

        }  

        DatagramPacket dp =   

                new DatagramPacket(buf, buf.length, destination , 10000);    

        //打包到DatagramPacket类型中(DatagramSocket的send()方法接受此类,注意10000是接受地址的端口,不同于自己的端口!)  

          

        try {  

            ds.send(dp);  //发送数据  

        } catch (IOException e) {  

        }  

        ds.close();  

    }  

}

接收步骤:

使用 DatagramSocket(int port) 建立socket(套间字)服务。(我们注意到此服务即可以接收,又可以发送),port指定监视接受端口。

定义一个数据包(DatagramPacket),储存接收到的数据,使用其中的方法提取传送的内容

通过DatagramSocket 的receive方法将接受到的数据存入上面定义的包中

使用DatagramPacket的方法,提取数据。

关闭资源。

import java.net.*;  

  

public class Rec {  

  

    public static void main(String[] args) throws Exception {  

          

        DatagramSocket ds = new DatagramSocket(10000);  //定义服务,监视端口上面的发送端口,注意不是send本身端口  

          

        byte[] buf = new byte[1024];//接受内容的大小,注意不要溢出  

          

        DatagramPacket dp = new DatagramPacket(buf,0,buf.length);//定义一个接收的包  

          

        ds.receive(dp);//将接受内容封装到包中  

          

        String data = new String(dp.getData(), 0, dp.getLength());//利用getData()方法取出内容  

          

        System.out.println(data);//打印内容  

          

        ds.close();//关闭资源     

    }  

}

java组成udp包的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java实现、java组成udp包的信息别忘了在本站进行查找喔。