在 UDP 网络编程中,发送方与接收方没有建立联系,没有明显的服务器端和客户端的区别。

  • 类 DatagramSocket:

此类表示用来发送和接收数据报包的套接字。

主要的构造方法:

DatagramSocket():创建实例,绑定本机的默认IP地址,随机选择端口。通常用于客户端编程,没有特定监听的端口,仅仅使用一个临时的。 
DatagramSocket(int port):创建实例,指定端口号,即固定监听Port端口的报文。 
DatagramSocket(int port, InetAddress localAddr):制定IP地址和端口号。当一台机器拥有多于一个IP地址的时候,由它创建的实例仅仅接收来自LocalAddr的报文。

常用方法:

receive(DatagramPacket d):接收数据报文到d中。
send(DatagramPacket d):发送报文d到目的地。 
setSoTimeout(int timeout):设置超时时间,单位为毫秒。 
close():关闭DatagramSocket。在应用程序退出的时候,通常会主动释放资源,关闭Socket,但是由于异常地退出可能造成资源无法回收。所以,应该在程序完成时,主动使用此方法关闭Socket,或在捕获到异常抛出后关闭Sock

  • DatagramPacket:

用于处理报文,将byte数组、目标地址、目标端口等数据包装成报文或者将报文拆卸成byte数组。

主要构造方法:

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数组。

常用方法:

getData():它从实例中取得报文的byte数组编码。

  • UDP协议数据报的发送和接受

发送端:
1.建立udpsocket服务端点。该端点建立,系统会随机分配一个端口。如果不想随机配置,可以手动指定。 DatagramSocket ds = new DatagramSocket(9999);此处制定端口为 9999,这个端口号是发送端的端口号。

2. 将数据进行packet包的封装,必须要指定目的地址和端口。  byte[] buf = "hello,客户端".getBytes(); DatagramPacket dp =new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.1.1"),9999);

3. 通过socket服务的send方法将该包发出。 ds.send(dp);

4. 将socket服务关闭。主要是关闭资源。 ds.close();

接收端:
1. 建立udp的socket服务。要监听一个端口。 DatagramSocket ds = new DatagramSocket(9999);
2. 定义一个缓冲区,将该缓冲区封装到packet包中。 byte[] buf = new byte[1024]; DatagramPacket dp = new DatagramPacket(buf,buf.length);
3. 通过socket的receive方法将数据存入数据包中。 ds.receive(dp);receive方法产生一个“阻塞”。
4. 通过数据包dp的方法getData()、getAddress()、getPort()等方法获取包中的指定信息。
5. 关闭socket。 ds.close();

注意:1.在创建DatagramSocket类实例时,如果端口已经被使用,会产生一个SocketException的异常抛出,并导致程序非法终止,这个异常应该注意捕获。

2.“阻塞”是一个专业名词,它会产生一个内部循环,使程序暂停在这个地方,直到一个条件触发。

  • 系统实现:

  • 代码实现:

接收端:

public class Server {

    public static void main(String[] args) throws IOException {
//绑定本机IP,指定端口号为 9999.
DatagramSocket server = new DatagramSocket(9999);
//准备字节数组,大小可容纳1024个字节开始接收数据。
byte[] bytes = new byte[1024];
//将字节数组中的前1024个字节封装进 packet 中。
DatagramPacket packet = new DatagramPacket(bytes,1024);
//通过socket的 receive()方法将数据存入数据包中。
server.receive(packet);
//将服务器端接收到的数据打印出来,此时的数据已经解析成了原始的数据并且是实际接收到的长度
String Msg = new String(packet.getData(),0,packet.getLength());
System.out.println("服务器端接收到的消息" + Msg); } }

发送端:

public class Client {

    public static void main(String[] args) throws IOException {
//绑定本机端口号,随机选择一个端口号
@SuppressWarnings("resource")
DatagramSocket client = new DatagramSocket();
//向服务器端发送数据
String str = "Hello,I'm client";
//以字节形式发送
byte[] bytes = str.getBytes();
//将字节信息封装在 packet 中以待发送。注意此时要获得的参数有字节数组中从0 到结束的所有字节,接收端的IP地址和端口号。
DatagramPacket packet = new DatagramPacket(bytes,0,bytes.length,InetAddress.getByName("127.0.0.1"),9999);
//发送
client.send(packet);
} }

output:

注意,UDP通信过程中发段和收端不需要建立连接,主要通过 send()和receive()方法来发送和接受数据,并且发送和接收的数据均以 packet 为载体,发送的时候,packet 的参数应该有接收方的 IP地址(通过InetAddress.getByName()来获取)和端口号。

如有不对之处,还望指正,谢谢(●'◡'●)

JavaSE——UDP协议网络编程(二)的更多相关文章

  1. JavaSE——UDP协议网络编程(一)

    UDP协议基础: UDP协议是英文UserDatagramProtocol的缩写,即用户数据报协议,主要用来支持那些需要在计算机之间传输数据的网络应用.包括网络视频会议系统在内的众多的客户/服务器模式 ...

  2. JavaSE——TCP协议网络编程(二)

    1.Java网络编程与多线程的综合应用: 类Socket提供了方法getInputStream ()和getOutStream()来得到对应的输入/输出流以进行读/写操作,这两个方法分别返回Input ...

  3. JavaSE——TCP协议网络编程(一)

    实现客户端与服务端的连接: 创建TCP服务端的 ServerSocket ServerSocket :此类实现服务器套接字.服务器套接字请求通过网络传入,基于该请求执行某些操作,然后可能向请求者返回结 ...

  4. TCP/IP协议网络编程以及UDP和TCP之传输协议

    1.什么是TCP/IP协议? 网络编程协议有很多,目前应用最广泛的是TCP/IP协议(Transmission Control Protocal/Internet Protoal 传输控制协议/英特网 ...

  5. Java网络编程二:Socket详解

    Socket又称套接字,是连接运行在网络上两个程序间的双向通讯的端点. 一.使用Socket进行网络通信的过程 服务端:服务器程序将一个套接字绑定到一个特定的端口,并通过此套接字等待和监听客户端的连接 ...

  6. Linux网络编程(二)

    Linux网络编程(二) 使用多进程实现服务器并发访问. 采用多进程的方式实现服务器的并发访问的经典范例. 程序实现功能: 1.客户端从标准输入读入一行文字,发送到服务器. 2.服务器接收到客户端发来 ...

  7. (1)基于tcp协议的编程模型 (2)tcp协议和udp协议的比较 (3)基于udp协议的编程模型 (4)反射机制

    1.基于tcp协议的编程模型(重中之重)1.1 编程模型服务器: (1)创建ServerSocket类型的对象,并提供端口号: (2)等待客户端的连接请求,调用accept()方法: (3)使用输入输 ...

  8. UDP协议网络Socket编程(java实现C/S通信案例)

    我的博客园:https://www.cnblogs.com/chenzhenhong/p/13825286.html 我的CSDN博客:https://blog.csdn.net/Charzous/a ...

  9. (1)网络编程的常识 (2)基于tcp协议的编程模型 (3)tcp协议和udp协议的比较 (4)基于udp协议的编程模型

    1.网络编程的常识 目前主流的网络通讯软件有:微信.QQ.YY.陌陌.探探.飞信.阿里旺旺.... 在吗? 1.1 七层网络模型(熟悉) 为了保证数据传递的可靠安全等等,ISO(国际标准委员会组织)将 ...

随机推荐

  1. 第二十八节:Java基础-进阶继承,抽象类,接口

    前言 Java基础-进阶继承,抽象类,接口 进阶继承 class Stu { int age = 1; } class Stuo extends Stu { int agee = 2; } class ...

  2. MSTP-多生成树协议

    多生成树协议MSTP(Multiple Spanning Tree Protocol)是IEEE 802.1s中定义的一种新型生成树协议.简单说来,STP/RSTP是基于端口的,PVST+是基于VLA ...

  3. Appium同时连接多台手机进行测试(多线程)

    作为测试小白,当时遇到了N多问题: 开启多线程后,发现app启动后,用例就停止了:且启动app对应的手机不能正确对应,用例中是A手机跑A用例,结果启动了B手机跑A用例报错. 主要原因:Appium S ...

  4. mysql之select语法

    一:连接查询(外链接outer和内链接inner) 连接查询是另一种类型的多表查询.连接查询对多个表进行JOIN运算,简单地说,就是先确定一个主表作为结果集,然后,把其他表的行有选择性地“连接”在主表 ...

  5. enumerate使用

    # enumerate读取文件import enumfor index, line in enumerate(open('C:\\Users\\CTO\\Desktop\\spider\\douban ...

  6. 2-4 完整Todolist案例

    在2-3 的基础上继续,综合前面的Todolist编写一个完整的案例,实现基本的输入内容,添加内容,点击删除内容 稍微讲解54行代码 splice()的用法

  7. 使用Masonry对UIScrollView自动布局

    之前使用Masonry对UIScrollView进行过约束,当时是遇到了问题的,怎么约束都不对,因为赶进度直接改用frame了也没有对问题深究.就这样过了很久.........,直到前一段换工作的时候 ...

  8. .Net开源myrtille远程连接服务(支持SSH)

    今天在博客园首页,无意中看到一篇文章(https://github.com/Microsoft/dotnet/blob/master/dotnet-developer-projects.md),于是对 ...

  9. 与LINQ有关的语言特性

    在说LINQ之前必须先说说几个重要的C#语言特性 一:与LINQ有关的语言特性 1.隐式类型 (1)源起 在隐式类型出现之前, 我们在声明一个变量的时候, 总是要为一个变量指定他的类型 甚至在fore ...

  10. C++模板的应用

    需求:类比数组类,只不过数组类型不再是整型.浮点型等,也可以是类. 1.创建模板类 头文件 #ifndef MYVECTOR_H #define MYVECTOR_H #include <ios ...