UDP

我的另一篇文章TCP方式的传输

部分内容需要查文档学习,我们需要了解下面的两个类:java.net.DatagramSocket和java.net.DatagramPacket

java.net.DatagramSocket:

  • 此类表示用来发送和接收数据报包的套接字。它就像数据传输过程中的司机或者接站员一样,它指引着数据发送的方向和传输到达的地方
构造方法:
  • DatagramSocket() 构造数据报套接字并将其绑定到本地主机上任何可用的端口。
  • DatagramSocket(int port, InetAddress laddr) 创建数据报套接字,将其绑定到指定的本地地址。
常用的方法:
  • send(DatagramPacket p) 从此套接字发送数据报包。
  • receive(DatagramPacket p)从此套接字接收数据报包。
  • close() 关闭此数据报套接字。

java.net.DatagramPacket:

  • 此类表示数据报包。它就像数据传输中的交通工具,就是它承载着数据在主机之间传输,这个对象将数据打了个包,里面不光封装了数据内容,还有数据的来源,发送数据的主机IP端口等等都一并被封装到了里面。
构造方法:
  • DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port)

    构造数据报包,用来将长度为 length 偏移量为 offset 的包发送到指定主机上的指定端口号。
  • DatagramPacket(byte[] buf, int length, InetAddress address, int port)

    构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。
  • DatagramPacket(byte[] buf, int length)

    构造 DatagramPacket,用来接收长度为 length 的数据包。

UDP接收端

先写一个UDP的接收端,大概思路就是,先通过

DatagramSocket ds = new DatagramSocket(10003);

new一个对象,这个对象用来发送和接收数据包的套接字。然后通过

DatagramPacket dp = new DatagramPacket(buf, buf.length);

定义数据包,最后调用recieve函数来接收数据,并将数据封装在数据包中。

值得注意的是发送端的发送至的IP地址及其端口必须和接收端的主机IP以及端口相对应

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket; public class UdpRecieve {
public static void main(String[] args) throws IOException, IOException { System.out.println("udp 接收端......run");
/**
* 定义一个udp的接收端,接收发送过来的数据。并显示在屏幕上
*
* 思路:
* 1、先有udp socket服务,就是先有插座。 而且记住:接收端一定要明确端口,否则,收不到数据
* 2、接受数据。之前应该先将数据存储到数据包中。因为数据还有解析
* 3、先定义数据包
* 4、通过数据包对象获取数据包的内容,发送端的ip、发送端的端口、发送过来的数据
* 5、关闭资源
* */
//1、先有udp socket服务,就是先有插座。而且记住:接收端一定要明确端口,否则,收不到数据
DatagramSocket ds = new DatagramSocket(10000); //2、接受数据。之前应该先将数据存储到数据包中。因为数据还有解析
//3、先定义数据包
byte[] buf = new byte[1024]; //缓冲区,保存数据
DatagramPacket dp = new DatagramPacket(buf, buf.length);
ds.receive(dp); //阻塞,在接受到数据之前一直处于阻塞状态,类似于输入操作 //4、通过数据包对象获取数据包的内容,发送端的ip、发送端的端口、发送过来的数据
String ip = dp.getAddress().getHostAddress();
int port = dp.getPort();
String text = new String(dp.getData(),0,dp.getLength()); System.out.println(ip+"---:---"+port+"---:---"+text);
//5、关闭资源
ds.close();
}
}

将其装在一个while(true)循环里,可以持续接收数据

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket; public class UdpRecieve2 {
public static void main(String[] args) throws IOException, IOException {
System.out.println("udp 接收端 run");
/**
* 定义一个udp的接收端,接收发送过来的数据。并显示在屏幕上
*
* 思路:
* 1、先有udp socket服务,就是先有插座。 而且记住:接收端一定要明确端口,否则,收不到数据
* 2、接受数据。之前应该先将数据存储到数据包中。因为数据还有解析
* 3、先定义数据包
* 4、通过数据包对象获取数据包的内容,发送端的ip、发送端的端口、发送过来的数据
* 5、关闭资源
* */ //1、先有udp socket服务,就是先有插座嘛。而且记住:接收端一定要明确端口,否则,收不到数据
DatagramSocket ds = new DatagramSocket(10000); while(true)
{
//2、接受数据。之前应该先将数据存储到数据包中。因为数据还有解析
//3、先定义数据包
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf, buf.length);
ds.receive(dp); //阻塞 //4、通过数据包对象获取数据包的内容,发送端的ip、发送端的端口、发送过来的数据
String ip = dp.getAddress().getHostAddress();
int port = dp.getPort();
String text = new String(dp.getData(),0,dp.getLength()); System.out.println(ip+":"+port+": "+text);
}
}
}

UDP发送端

用下面这句先创建一个socket来指引数据的去向,这个里面的参数“8888”表示的不是发送目的地主机的端口,而是发送起点的端口,表示从这个主机的8888端口发出去的。

DatagramSocket ds = new DatagramSocket(8888);

然后再用下面这句将数据内容,发送的目的地都封装到这么一个数据包里面,里面的参数buf表示字节数组,必须是字节数组,不能是字符串数组,buf.length无疑是传输的长度, InetAddress.getByName("127.255.25.1")是目的地的主机地址,这句的含义是通过ip地址获取主机地址,10000表示目的地接收这个数据的端口,这个端口要保证没有被其他应用占用。

 DatagramPacket dp = new DatagramPacket(buf, buf.length, InetAddress.getByName("127.255.25.1"), 10000);

最后调用send函数即可完成发送

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress; public class UdpSend {
public static void main(String[] args) throws IOException, IOException { System.out.println("udp 发送端 run"); /**
* 通过查阅文档,了解到用于UDP传输协议的对象是DatagramSocket
*
* 通过UDP协议发送一段文本数据
* 思路:
* 1、需要先建立UDP的socket。它具备发送和接收功能
* 2、将数据封装到数据包中。数据包对象是DatagramPacket
* 3、使用socket对象的send方法将数据包发送出去
* 4、关闭资源
* */ //1、需要先建立UDP的socket。它具备发送和接收功能
DatagramSocket ds = new DatagramSocket(8888); //2、将数据封装到数据包中。数据包对象是DatagramPacket
String text = "hello udp来了!";
byte[] buf = text.getBytes(); //将数据转成字节数组
//将字节数组封装到数据包中
DatagramPacket dp = new DatagramPacket(buf, buf.length, InetAddress.getByName("127.255.25.1"), 10000); //3、使用socket对象的send方法将数据包发送出去
ds.send(dp); //4、关闭资源
ds.close();
}
}

发送键盘输入的数据,这里其实就是加了键盘录入,IO流的操作

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress; public class UdpSend2 {
public static void main(String[] args) throws IOException, IOException { System.out.println("udp 发送端 run"); /**
* 通过查阅文档,了解到用于UDP传输协议的对象是DatagramSocket
*
* 通过UDP协议发送一段文本数据 思路:
* 1、需要先建立UDP的socket。它具备发送和接收功能
* 2、将数据封装到数据包中。数据包对象是DatagramPacket
* 3、使用socket对象的send方法将数据包发送出去
* 4、关闭资源
*/ // 1、需要先建立UDP的socket。它具备发送和接收功能
DatagramSocket ds = new DatagramSocket(9999); // 2、将数据封装到数据包中。数据包对象是DatagramPacket。数据来自于键盘录入
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
String line = null;
while ((line = bufr.readLine()) != null)
{
if("over".equals(line))
break;
byte[] buf = line.getBytes(); // 将数据转成字节数组
// 将字节数组封装到数据包中
DatagramPacket dp = new DatagramPacket(buf, buf.length, InetAddress.getByName("127.255.25.1"), 10000);
ds.send(dp);
} // 4、关闭资源
ds.close();
}
}

成功示例:

发送前



从键盘录入发送内容



接收端

UDP方式的传输的更多相关文章

  1. Socket 通信原理(Android客户端和服务器以TCP&&UDP方式互通)

    转载地址:http://blog.csdn.net/mad1989/article/details/9147661 ZERO.前言 有关通信原理内容是在网上或百科整理得到,代码部分为本人所写,如果不当 ...

  2. 如何用 UDP 实现可靠传输?

    作者:小林coding 计算机八股文刷题网站:https://xiaolincoding.com 大家好,我是小林. 我记得之前在群里看到,有位读者字节一面的时候被问到:「如何基于 UDP 协议实现可 ...

  3. TCP/UDP是如何传输的?

    一.网络模型: OSI参考模型 TCP/IP参考模型 二.网络通讯要素 IP地址: 网络中设备的标识 不易记忆,可用主机名 本机回环地址:127.0.0.1 主机名: localhost 端口号: 用 ...

  4. 局域网内通过UDP协议进行传输接受数据——AsyncUdpSocket

    在相同的局域网内,可以通过Udp协议进行数据的传输和接收,Udp协议与Http协议不同,Udp更加方便快捷,省去了很多步骤,但是也有很多传输问题,在局域网内小范围传输数据时Udp还是非常能够胜任的. ...

  5. python网络编程之UDP方式传输数据

    UDP --- 用户数据报协议(User Datagram Protocol),是一个无连接的简单的面向数据报的运输层协议. UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能 ...

  6. UDP方式实现广域网的P2P通信

    最近在研究P2P通信,希望能够穿透路由器. 当前的做法只是使用TCP协议进行客户端与服务器端通信,使用UDP协议进行客户端之间的打洞操作,UDP的方式的源码在下方. 一直没有实现TCP的打洞,如果有实 ...

  7. python网络编程:UDP方式传输数据

    UDP --- 用户数据报协议(User Datagram Protocol),是一个无连接的简单的面向数据报的运输层协议. UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能 ...

  8. Python 之网络编程之socket(1)TCP 方式与UDP方式

    一:socket介绍 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket. 建立网络通信连接至少要一对端口号(socket).socket本质是编程接口(API) ...

  9. P2P通信中使用ENet提供UDP的可靠传输

    ENet官网:http://enet.bespin.org/ 按照他的说法: ENet's purpose is to provide a relatively thin, simple and ro ...

随机推荐

  1. java中父类子类静态代码块、构造代码块执行顺序

    父类静态(代码块,变量赋值二者按顺序执行) 子类静态 父类构造代码块 父类构造方法 子类构造代码块 子类构造方法 普通方法在实列调用的时候执行,肯定位于上面之后了 //父类A public class ...

  2. 如何设置FreePBX的数据库用户可以通过远程来连接Mysql数据库?

    要满足mysql允许通过除了本机外的主机进行使用客户端连接的方法: 要设置root用户允许通过外网用户进行连接访问的操作方法: 1.首先先改mysql的配置文件 将绑定的#bind-address = ...

  3. Linux基础_网站权限规划

    Linux系统默认的权限: 对于文件来说, 默认的权限: rw-r--r-- 644 对于目录来说:rwxr-xr-x  755 网站比较安全的权限: 网址程序存放在/app/blog 目录下面. 1 ...

  4. 阿里雷卷:Reactive 基金会的成立将对开发方式带来哪些影响?

    作者 | 赵钰莹 近日,Linux 基金会宣布成立 Reactive 基金会.对于 Reactive,各位开发者应该并不陌生,尤其是 Node.js 开发者,但真正了解并意识到这件事情对开发方式带来的 ...

  5. Spring Boot 多环境如何配置

    Spring Boot 开发环境.测试环境.预生产环境.生产环境多环境配置 通常一个公司的应程序可能在开发环境(dev).测试环境(test).生产环境(prod)中运行.那么是不是需要拷贝不同的安装 ...

  6. 解决安装flask库不成功

    Python中使用python -m pip install --upgrade pip升级pip时老是不成功   场景 在使用python -m pip install --upgrade pip进 ...

  7. C#中使用FilleStream实现视频文件的复制

    场景 C#中FileStream的对比以及使用方法: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/100396022 关注公众号 ...

  8. NOIP2009 1.多项式输出

    题目: 其中,aixi称为 i 次项,ai 称为 i 次项的系数.给出一个一元多项式各项的次数和系数,请按照如下规定的格式要求输出该多项式: 1. 多项式中自变量为 x,从左到右按照次数递减顺序给出多 ...

  9. localStorage详细总结

    一.localStorage简介: 在HTML5中,新加入了一个localStorage特性,这个特性主要是用来作为本地存储来使用的,解决了cookie存储空间不足的问题(cookie中每条cooki ...

  10. 字节输入流InputStream

    import java.io.File; import java.io.FileInputStream; import java.io.IOException; public class FileIn ...