JAVA网络编程之UDP协议接收发送数据
网络编程:通俗的来说就是通过我们编写的程序或者软件可以让两个设备之间进行交互,进行数据间的传输。我们所说的网络编程也可以说是Socket编程,也叫套接字编程.
套接字(socket)是一个抽象层,应用程序可以通过它发送或接收数据,可对其进行像对文件一样的打开、读写和关闭等操作。套接字允许应用程序将I/O插入到网络中,并与网络中的其他应用程序进行通信。网络套接字是IP地址与端口的组合。
- Socket就是为网络编程提供的一种机制;
- 通信的两端都有Socket;
- 网络通信其实就是Socket之间的通信;
- 数据在两个Socket之间通过IO传输
网络通信的三要素:
(1)IP地址:InetAddress
- 网络中设备的标识,可以用主机名
(2)端口号
- 用于标识进程的逻辑地址,不同进程的标识
(3)传输协议
- 通信的规则。常见的协议有:TCP协议、UDP协议
TCP协议
——建立连接,形成传输数据的通道;在连接中进行大量数据的传输,通过三次握手完成连接,效率会稍低
UDP协议
——将数据源和目的封装成数据包,不需要建立连接;每个数据报的大小限制在64K;因无连接,是不可靠协议;不需要建立连接,速度快
接下来,我们通过代码来实现UDP的接受数据
我们先来看看如何获取IP地址和主机名
InetAddress:此类表示互联网协议(IP)地址
import java.net.InetAddress;
import java.net.UnknownHostException;
public class UDPDemo {
public static void main(String[] args) throws UnknownHostException {
InetAddress address=InetAddress.getByName("LAPTOP-G05RBKU7"); //这个是我们电脑的主机名
System.out.println(address);
}
}
//输出结果为LAPTOP-G05RBKU7/192.168.157.1
当然我们也可以通过IP地址来查找
InetAddress address=InetAddress.getByName("192.168.157.1");
System.out.println(address);
//输出结果为/192.168.157.1
我们如果想要IP地址来同时获取主机名和IP地址可以使用getHostAddress()和getHostName()方法
import java.net.InetAddress;
import java.net.UnknownHostException;
public class UDPDemo {
public static void main(String[] args) throws UnknownHostException {
InetAddress address=InetAddress.getByName("192.168.157.1"); //IP地址是唯一的
String hostAddress=address.getHostAddress(); //获取IP地址
String hostName=address.getHostName(); //获取主机名
System.out.println(hostAddress); //192.168.157.1 返回IP地址
System.out.println(hostName); //LAPTOP-G05RBKU7 返回主机名
}
}
下来我们来看如何使用UDP协议来发送数据
* 创建发送端Socket对象
* 创建数据并打包
* 发送数据
* 释放资源
/*
* DatagramSocket: 此类用来接收和发送数据,基于UDP协议的
* DatagramSocket() 创建Socket对象并随机分配端口号
* DatagramSocket(int port) 创建Socket对象并指定端口号
*/
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
/*
* DatagramSocket: 此类用来接收和发送数据,基于UDP协议的
* DatagramSocket() 创建Socket对象并随机分配端口号
* DatagramSocket(int port) 创建Socket对象并指定端口号
*/
public class SendDemo {
public static void main(String[] args) throws IOException {
//创建发送端Socket对象
DatagramSocket ds=new DatagramSocket();
//创建数据并打包
/*
* DatagramPacket" 此类表示数据报包
* 数据byte[]
* 设备的地址ip
* 进程的地址端口号
* DatagramPacket(byte[] buf,int length,InetAddress address,int port)
*/
String s="Hello!udp,I am coming!";
byte[] bys=s.getBytes();
int length=bys.length;
InetAddress address=InetAddress.getByName("LAPTOP-G05RBKU7");
int port=9999;
DatagramPacket dp=new DatagramPacket(bys, length, address, port);
// 发送数据
ds.send(dp);
// 释放资源
ds.close();
}
}
使用UDP协议来发送数据
* 创建Socket接收对象
* 接收数据
* 解析数据
* 输出数据
* 释放资源
public class RecievedataDemo {
public static void main(String[] args) throws IOException {
//创建Socket接收对象
DatagramSocket ds=new DatagramSocket(9876);
//创建包对象
byte[] bys=new byte[1024];
DatagramPacket dp=new DatagramPacket(bys, bys.length);
//接收数据
ds.receive(dp);
//解析数据
//获取发送端IP对象
InetAddress address1=dp.getAddress();
//获取数据
byte[] data=dp.getData();
//获取数据的长度
int length=dp.getLength();
//输出数据
System.out.println("sender------->"+address1.getHostName());
System.out.println(new String(data,0,length));
ds.close();
}
}
/*输出结果为
sender------->LAPTOP-G05RBKU7
Helloo!udp,I am coming!
*/
在使用UDP协议发送数据的时候有以**意事项
(1)有时候我们会出现java.net.BindException: Address already in use这个错误,表示当前端口号已经被绑定了,很有可能是你之前运行了一般次程序没有关闭,这个时候在控制台有一个类似电脑标识的一个图标,下拉可以看到你正在运行的程序的控制台,关掉不必要的就可以了。
(2)端口号错误,数据可以正常发出,不会出现异常,但是接收端无法收到数据。
上一篇: Maven –显示项目依赖性