一、UDP

  UDP的全称是User Datagram Protocol(用户数据报协议),是一种无连接的不安全的传输协议,

  传输数据时发送方和接收方无需建立连接,所以是不安全的。

  发送时不建立连接直接发送,发送后不关注接受方能否接到。UDP只负责发出去,后续的事情与之无关。

  1)、使用UDP发送和接受数据的过程:

  1接收数据:

    1.1创建数据包实例,用于接收数据。(指定接收方IP,端口)

    1.2创建接收容器

    1.3将接收容器封装成包

    1.4接收包

    1.5处理包(可以看做拆包,将包中数据拿出来)

    1.6释放资源

  2.发送数据

    2.1创建数据报实例,用于发送数据。(指定发送IP,端口)

    2.2创建发送资源

    2.3将发送资源封装成包(包加上发送目的地,端口)

    2.4发送包

    2.5释放资源

  2)、DatagramSocket & DatagramPacket

    java中将UDP封装成DatagramSocket类,用于发送和接收数据报。

    2.1构造方法:

    DatagramSocket(int port)//创建数据报,并绑定到本地主机的指定端口

    DatagramSocket(int port, InetAddress laddr)//创建数据报,绑定到指定地址的指定端口

    2.2主要方法

    void send(DatagramPacket p)//发送数据包
    void receive(DatagramPacket p)//接收数据包

  

    数据需要打包后才能发送,而接收数据也是以包的形式接收,java中使用DatagramPacket将数据打包。

    构造方法:

    DatagramPacket(byte[] buf, int length)//构造接收数据包及其长度,(设置接收数据包)

    DatagramPacket(byte[] buf, int length, InetAddress address, int port)//构造一个数据包,指定发送主机及端口信息(设置发送数据包)

    主要方法:

    int getLength()//返回要发送的或者要接受的数据长度

    byte[] getData()//获取发生或接受的数据,相当于拆包,获取包内数据。

Server:(接收数据) 

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException; public class Server {
public static void main(String[] args) throws IOException {
DatagramSocket server = new DatagramSocket(8888,InetAddress.getByName("localhost"));
byte[] r = new byte[1024];//接收容器
DatagramPacket packet = new DatagramPacket(r,r.length);//打包
server.receive(packet);//接收包
System.out.println(new String(packet.getData(),0,packet.getLength()));//拆包并解析包
server.close();
}
}

Client:(发送数据)   

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException; public class Client { public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
DatagramSocket client = new DatagramSocket(8887,InetAddress.getByName("localhost"));
String msg = "hello udp";
byte[] b_msg = msg.getBytes();//数据-->字节
     //打包,并加上目的地信息
DatagramPacket packet = new DatagramPacket(b_msg,b_msg.length,InetAddress.getByName("localhost"),8888);
client.send(packet);//发送包
client.close();//释放资源
}
}
运行结果:
hello udp

先运行Server,Server会等待数据,之后运行Client发送数据,Server接收到数据后就会解析。

想象成寄快递1.东西准备好(准备数据),

      2.转换为固定格式(数据转换为字节)

      3.然后打包,包上贴快递单(邮寄的目的地(IP)和接收人(端口))

      4.然后发送,

      5.接收方接收

      6.然后拆快递(拆包)

      7.然后拿到东西。(字节转换数据)

  

  

上面的数据是字符串可以直接转换为字节,但如果有时候传输的数据不能直接转换为字节这时该怎么办呢?

这就要用到IO流的知识,主要使用ByteArrayStream(toByteArray()方法)、DataStream(WriteXxxx()方法)。

数据-->字节:

先将数据及其格式通过DataOutputStream写入ByteArrayOutputStream中,再通过ByteArrayOutputStream中的toByteArray()方法将的字节拿出。

字节-->数据:

将字节数组放入ByteArrayInputStream中,然后通过DataInputStream中的readXxx读取ByteArrayInputStream中字节数组,将其转换为对应数据类型。

Server:

import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress; public class Server {
public static void main(String[] args) throws IOException {
DatagramSocket server = new DatagramSocket(8888,InetAddress.getByName("localhost"));
byte[] r = new byte[1024];
DatagramPacket packet = new DatagramPacket(r,r.length);
server.receive(packet);
System.out.println(byteToDouble(packet.getData()));//字节转换为数组
server.close();
} public static double byteToDouble(byte[] b) throws IOException{
ByteArrayInputStream bis = new ByteArrayInputStream(b);//将字节放入ByteArratInputStream中
DataInputStream dis = new DataInputStream(bis);//通过dis读取bis中字节
double data = dis.readDouble();//通过dis.readXxxx读取bis中的字节数组。
return data;
}
}

Client:

import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress; public class Client { public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
DatagramSocket client = new DatagramSocket(8887,InetAddress.getByName("localhost"));
// String msg = "hello udp";
Double data = 9.1;
byte[] b_data = doubleToByte(data);//数据转换为字节
DatagramPacket packet = new DatagramPacket(b_data,b_data.length,InetAddress.getByName("localhost"),8888);
client.send(packet);
client.close();
} public static byte[] doubleToByte(double dou) throws IOException{
ByteArrayOutputStream bos = new ByteArrayOutputStream();//创建字节数组输入流
DataOutputStream dos = new DataOutputStream(bos);//通过dos想bos中写入
dos.writeDouble(dou);//通过dos中的write.Xxxx将dou写入bos中
dos.flush();
dos.close();
byte[] data = bos.toByteArray();//将bos中字节取出。
return data;
}
}
运行结果:
9.1

7.3(java学习笔记)网络编程之UDP的更多相关文章

  1. java学习之网络编程之echo程序

    服务端的实现 package com.gh.echo; import java.io.*; import java.net.*; /** * echo服务器程序 * 实现 不断接收字符串 ,然后返回一 ...

  2. java 25 - 4 网络编程之 UDP协议传输的代码优化

    UDP协议的输出端: /* UDP发送数据: A:创建Socket发送端对象 B:创建数据报包(把数据打包) C:调用Socket对象发送数据报包 D:释放资源(底层是IO流) */ public c ...

  3. java 25 - 4 网络编程之 UDP协议传输思路

    UDP传输 两个类:DatagramSocket与DatagramPacket(具体看API) A:建立发送端,接收端. B:建立数据包. C:调用Socket的发送接收方法. D:关闭Socket. ...

  4. Java网络编程之UDP

    Java网络编程之UDP 一.C/S架构中UDP网络通信流程 ①创建DatagramSocket与DatagramPacket对象 ②建立发送端,接收端 ③建立数据包 ④调用Socket的发送.接收方 ...

  5. 网络编程之UDP编程

    网络编程之UDP编程 UDP协议是一种不可靠的网络协议,它在通信的2端各建立一个Socket,但是这个Socket之间并没有虚拟链路,这2个Socket只是发送和接受数据的对象,Java提供了Data ...

  6. Java学习笔记-网络编程

    Java提供了网络编程,并且在实际中有着大量运用 网络编程 网络编程概述 网络模型 OSI参考模型 TCP/IP参考模型 网络通讯要素 IP地址 端口号 传输协议 网络参考模型 网络通讯要素 IP地址 ...

  7. java网络编程之UDP通讯

    详细介绍了java中的网络通信机制,尤其是UDP协议,通过对UDP的基本使用进行举例说明如何使用UDP进行数据的发送接收,并举了两个小demo说明UDP的使用注意事项. UDP协议原理图解: UDP协 ...

  8. Java 学习笔记 网络编程 使用Socket传输文件 CS模式

    Socket的简单认识 Socket是一种面向连接的通信协议,Socket应用程序是一种C/S(Client端/Server端)结构的应用程序 Socket是两台机器间通信的端点. Socket是连接 ...

  9. java 26 - 9 网络编程之 TCP协议多用户上传文件

    TCP实现多用户上传文件: 需要同时给多用户上传文件,这样就得用多线程来实现. 实际上,这样的话,上传的先后顺序和速度就跟客户端的带宽有关:带宽够,就容易抢占到线程的执行权: 首先,创建个线程类:(这 ...

随机推荐

  1. ibeacon UUID

    import sys; import uuid; s=uuid.uuid4().hex #s="f6bc15e0939046679be1866ec8a199dc" sys.stdo ...

  2. namenode磁盘满引发recover edits文件报错

    前段时间公司hadoop集群宕机,发现是namenode磁盘满了, 清理出部分空间后,重启集群时,重启失败. 又发现集群Secondary namenode 服务也恰恰坏掉,导致所有的操作log持续写 ...

  3. HDU2553 N皇后问题---(dfs)

    http://acm.hdu.edu.cn/showproblem.php?pid=2553 在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在 ...

  4. 随机洗牌算法Knuth Shuffle和错排公式

    Knuth随机洗牌算法:譬如现在有54张牌,如何洗牌才能保证随机性.可以这么考虑,从最末尾一张牌开始洗,对于每一张牌,编号在该牌前面的牌中任意一张选一张和当前牌进行交换,直至洗到第一张牌为止.参考代码 ...

  5. Ueditor 1.4.3 插入表格后无边框无颜色,不能正常显示

    在使用Ueditor 插入表格的功能时,发现插入时正常. 但保存到后台后再取出来,表格不能正常显示.查看保存的html代码,发现保存时并未给table 添加border属性.以致于再次取出来时,不能正 ...

  6. 【BZOJ2253】纸箱堆叠 [CDQ分治]

    纸箱堆叠 Time Limit: 30 Sec  Memory Limit: 256 MB[Submit][Status][Discuss] Description P 工厂是一个生产纸箱的工厂. 纸 ...

  7. CVE-2017-5521: Bypassing Authentication on NETGEAR Routers(Netgear认证绕过漏洞)

    SpiderLabs昨天发布的漏洞, 用户访问路由器的web控制界面尝试身份验证,然后又取消身份验证,用户就会被重定向到一个页面暴露密码恢复的token.然后通过passwordrecovered.c ...

  8. UpdateData的用法(转)

    原文转自 https://blog.csdn.net/ddjj_1980/article/details/51452289 UpdateData(TRUE)——刷新控件的值到对应的变量.(外部输入值交 ...

  9. camera驱动框架分析(下)

    sensor的驱动 v4l2_i2c_new_subdev_board先用client = i2c_new_device(adapter, info);创建info对应的i2c_client对象(代表 ...

  10. HTML5-坦克大战一画出敌人坦克并让自己的坦克可以发子弹的功能(二)

    上一篇博客只画出了,一个坦克,并让其可以上下左右移动,这篇博客将画出敌人的坦克,并让自己的坦克可以发子弹,但是还不是尽善尽美,还有一些问题,将会在下篇博客说明: html代码: <!DOCTYP ...