成都创新互联网站制作重庆分公司

udp分包的代码java udp包分析

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连接的源程序

import java.io.*;

import java.lang.*;

import java点虐 .*;

public class uclient

{

private DatagramSocket cli;

private DatagramPacket pac;

private byte sb[];

private String sen;

public uclient()

{

Init();

}

public void Init()

{

try

{

//指定端口号,避免与其他应用程序发生冲突

cli=new DatagramSocket(10002);

sb=new byte[1024];

sen="UDP方式发送数据";

sb=sen.getBytes();

pac=new DatagramPacket(sb,sb.length,InetAddress.getByName("localhost"),10005);

cli.send(pac);

}

catch(SocketException se)

{

se.printStackTrace();

}

catch(IOException ie)

{

ie.printStackTrace();

}

}

public static void main(String args[])

{

new uclient();

}

}

接收端数据:

//加以改进代码,可以改变接收方式

import java.io.*;

import java.lang.*;

import java点虐 .*;

public class userve

{

private DatagramSocket ser;

private DatagramPacket pac;

private byte rb[];

private String rev;

public userve()

{

Init();

}

public void Init()

{

try

{

ser=new DatagramSocket(10005);

rb=new byte[1024];

pac=new DatagramPacket(rb,rb.length);

rev="";

int i=0;

while(i==0)//无数据,则循环

{

ser.receive(pac);

i=pac.getLength();

//接收数据

if(i0)

{

//指定接收到数据的长度,可使接收数据正常显示,开始时很容易忽略这一点

rev=new String(rb,0,pac.getLength());

System.out.println(rev);

i=0;//循环接收

}

}

}

catch(Exception e)

{

e.printStackTrace();

}

}

public static void main(String args[])

{

new userve();

}

}

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多线程通信 用split方法分不开两段啊 以下程序有错的地方希望纠错 谢谢!!

a=new byte[8192];

a="没有该用户".getBytes();

首先这句的写法就有大问题了……

你把a先指向了一个8192长度的byte数组 然后马上又把a指向xxxx.getBytes(),也就是说第一句没有任何用处

然后你具体的代码 我已经不知道你想做什么了~~~如果你只是想用DatagrameSocket来实现数据传输其实很简单的……可以参见orelly的《java网络编程》里面的例子 我就不贴了

然后把例子改成多线程的就行了……


当前名称:udp分包的代码java udp包分析
网页URL:http://cxhlcq.com/article/ddgdpgi.html

其他资讯

在线咨询

微信咨询

电话咨询

028-86922220(工作日)

18980820575(7×24)

提交需求

返回顶部