-
Java连载128-UDP通信编程
一、UDP编程
1.DatagramPacket特性以及构造方法
- UDP是一个面向无连接的协议,因此,在通信时发送端和接收端不用建立连接。
- Datagram类就相当于一个集装箱用于封装UDP通信中发送或者接收的数据。
-
构造方法:
(1)DatagramPacket(byte[] buf,int length)
使用该构造方法在创建DatagramPacket对象的时候指定了封装对象的字节数组和数据大小,没有指定IP和端口号。这样的对象只能用于接收端而不能用于发送端。因为发送端一定要明确指出数据的目的地(IP地址和端口号),而接收端不需要明确数据的来源,只需要接收到数据即可。
(2)DatagramPacket(byte[] buf,int length,InetAddress addr,int port)
使用该构造方法在创建对象的时候指定了IP地址和端口号,通常用于发送端。
(3)DatagramPacket(byte[] buf,int offset,int length)
用于接收端,offset该参数用于指定接收到的数据放在buf缓冲数组时是从offset开始的。
(4)DatagramPacket(byte[] buf,int offset,int length,InetAddress addr,int port)
结合(2)(3)就能看懂了
2.DatagramPacket常用方法
(1)InetAddress getAddress()
返回发送端或者接收端的IP地址,得看在哪一端。
(2)int getPort()
返回发送端或者接收端的端口号。
(3)bytep[] getData()
返回将要接收或者发送的数据。
(4)int getLength()
返回将要接收或者发送的数据的长度。
二、DatagramSocket
- DatagramPacket就是数据包,DatagramSocket可以认为是运送数据包的“码头”
1.构造方法详解
(1)DatagramSocket()
该构造方法用于创建发送端的DatagramSocket对象,没有指定端口,系统会自动分配一个。
(2)DatagramSocket(int port)
既可以用于发送端又可以用于接收端。在用于接收端的时候必须指定端口号,这样才能监听端口。
(3)DatagramSocket(int port,InetAddress addr)
该对象适用于计算机上有多块网卡的情形,使用时可以明确规定数据通过哪块网卡向外发送和接收 哪块网卡的数据。由于计算机中针对不同的网卡分配不同的IP地址,因此在创建对象的时候需要指定IP地址。
2.常用的成员方法
(1)void receive(DatagramPacket p)
将接受到的数据填充到DatagramPacket数据包中,在接收到数据之前会一直处于阻塞状态,只有当接收到数据包的时,该方法才会返回。
(2)void send(DatagramPacket p)
放送DatagramPacket数据包,发送的数据包中包含将要发送的数据,数据的长度,远程主机的IP地址和端口号。
(3)void close
关闭当前的Socket,通知驱动程序释放为这个Socket保留的资源。
3.直接举例UDP编程实例
package com.bjpowernode.java_learning; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; public class D128_1_ServerTest { public static void main(String[] args) { DatagramSocket socket = null; DatagramPacket packet_send = null; DatagramPacket packet_receive = null; int port = 5151; //服务器监听端口号 try { socket = new DatagramSocket(port); //创建连接对象 System.out.println("服务器启动"); byte[] r = new byte[1024]; //创建缓存数组 packet_receive = new DatagramPacket(r,r.length);//创建数据包对象 socket.receive(packet_receive); //接收数据包 InetAddress client_ip = packet_receive.getAddress();//客户端地址 int client_port = packet_receive.getPort(); //客户端的端口号 byte[] data = packet_receive.getData(); //客户端字节数据 int len = packet_receive.getLength(); //数据有效长度 String str1 = new String(data,0,len); //将字节数据转换为字符串 System.out.println("客户机"+client_ip+":"+client_port+"\n发送的信息是:"+str1); String response = "Hello,I am Server B"; byte[] s = response.getBytes(); packet_send = new DatagramPacket(s,s.length,client_ip,client_port);//创建响应数据包对象 socket.send(packet_send); }catch(Exception e) { System.out.println(e); }finally { socket.close(); } } }
- 我们先运行这个服务器端
package com.bjpowernode.java_learning; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; public class D128_2_ClientTest { public static void main(String[] args) { DatagramSocket socket = null; DatagramPacket packet_send = null; DatagramPacket packet_receive = null; String server = "127.0.0.1"; //服务器IP地址 int port = 5151; //服务器端口号 String str = "Hello,I am Client A"; byte[] data = str.getBytes(); //将要发送的信息转换为字节数组 try { socket = new DatagramSocket(); //创建连接socket对象 InetAddress addr = InetAddress.getByName(server); //将服务器端的IP地址封装成InetAddress对象 packet_send = new DatagramPacket(data,data.length,addr,port);//创建数据包对象 socket.send(packet_send); //向服务器发送数据 byte[] r = new byte[1024]; //设置缓冲区 packet_receive = new DatagramPacket(data,data.length,addr,port);//创建数据包对象 socket.receive(packet_receive); //接收数据包 byte[] response = packet_receive.getData(); //读取数据包中的数据信息 int len = packet_receive.getLength(); //读取数据长度 String str1 = new String(response,0,len); //将字节数据转换成字符串 System.out.println("服务器响应的信息是:"+str1); }catch(Exception e) { System.out.println(e); }finally { socket.close(); } } }
- 接下里运行客户端程序
三、源码:
- D128_1_ServerTest.java
- D128_2_ClientTest.java
- https://github.com/ruigege66/Java/blob/master/D128_1_ServerTest.java
- https://github.com/ruigege66/Java/blob/master/D128_2_ClientTest.java
出 处:https://www.cnblogs.com/ruigege0000/p/13270181.html
最新更新
带有参数的装饰器
类装饰器
django中的auth模块与admin后台管理
python的日期处理
字符串常用方法
基本数据类型概述
python-map()函数基本用法
python带你实现任意下载AcFun视频数据~
bbs项目之注册功能
变量的定义和使用
三大常用数据库事务详解之三:事务运行
三大常用关系型数据库事务详解之二:基
三大关系型数据库事务详解之一:基本概
MongoDB常用命令(2)
MongoDB基本介绍与安装(1)
SQLServer触发器调用JavaWeb接口
SQL Server索引的原理深入解析
SqlServer2016模糊匹配的三种方式及效率问题
SQL中Truncate的用法
sqlserver 多表关联时在where语句中慎用tri
VB.NET中如何快速访问注册表
ASP.NET中图象处理过程详解
Vue(1)Vue安装与使用
JavaScript 语言入门
js将一段字符串的首字母转成大写
纯原生html编写的h5视频播放器
H5仿原生app短信验证码vue2.0组件附源码地
TypeScript(4)接口
TypeScript(3)基础类型
TypeScript(2)WebStorm自动编译TypeScript配置