Java笔记(14) UDP通讯程序Demo

打印 上一主题 下一主题

主题 1694|帖子 1694|积分 5082

实现一个简单的UDP通信程序,仅作为笔记使用
网络编程中有三要素:IP、端口号和通信协议,分别用来确定对方在互联网上的地址、指定接受数据的软件和确定数据在网络中传输的规则。
IP地址

IP地址分为IPv4地址和IPv6地址,这里不做讨论。
IPv4地址中分为公网地址(万维网使用)和私有地址(局域网使用)。192.168.开头的就是私有地址,范围是192.168.0.0--192.168.255.255。另外还有一个特殊地址:127.0.0.1,也可以是localhost,称为回送地址,也称本机IP。与在局域网中被分配的IPv4地址来说,该地址永远指向自身,而分配的IP地址,有可能随着连接时间和地点的变换而变换。
端口号

端口号是应用程序在设备中唯一的标识,有两个字节标识的整数组成,因此取值范围为065535。其中01023之间的端口固定用于一些知名的网络服务或者应用。一个端口号只能被一个应用占用。
协议

互联网通信协议分为OSI参考模型和TCP/IP参考模型,这里不做讨论。
两种运行在传输层的协议:

  • UDP协议:用户数据包协议(User Datagram Protocol)。UDP是面向无连接的通信协议。速度较快,但有大小限制,一次最多发送64k,是数据不安全的,易丢失数据。
  • TCP协议:传输控制协议(Transmission Control Protocol)。TCP协议是面向连接的通信协议。速度相较于UDP较慢,但没有大小限制,是数据安全的。
UDP通信程序流程

发送数据


  • 创建发送端的 DatagramSocket对象
  • 数据打包 DatagramPacket
  • 发送数据
  • 释放资源
接收数据


  • 创建接收端的 DatagramSocket
  • 接收打包好的数据
  • 解析数据包
  • 释放资源
UDP-Sender实现
  1. public class SendMessageDemo {
  2.     public static void main(String[] args) throws IOException {
  3.         //1. 创建发送端的 DatagramSocket,空参表示不指定端口,随机使用可用端口
  4.         DatagramSocket socket = new DatagramSocket();
  5.         //2. 将数据封装进 DatagramPacket 对象中,作为发送者,需要指定接收方的IP和接受端口号
  6.         String str = "Hello";
  7.         byte[] bytes = str.getBytes();
  8.         InetAddress address = InetAddress.getByName("127.0.0.1");//get target IP address
  9.         DatagramPacket packet = new DatagramPacket(bytes, bytes.length, address, 10086);
  10.         //3. 发送打包的数据包
  11.         socket.send(packet);
  12.         //4. 端口号资源是有限的,发送完成后释放端口号
  13.         socket.close();
  14.     }
  15. }
复制代码
UDP-Receiver实现
  1. public class ReceiveMessageDemo {
  2.     public static void main(String[] args) throws IOException {
  3.         //1. 创建接收端的 DatagramSocket,作为接收方,需要指定使用哪个接口进行接受
  4.         DatagramSocket socket = new DatagramSocket(10086);
  5.         //2.接收打包好的数据,由于数据通过DatagramPacket对象发送,接收端也需要创建一个DatagramPacket对象来接收
  6.         byte[] bytes = new byte[1024];
  7.         DatagramPacket packet = new DatagramPacket(bytes, bytes.length);
  8.         //这个方法是阻塞的,程序会一致在这里等待
  9.         socket.receive(packet);
  10.         //3. 解析数据,接收方可以得到以下信息:发送的数据包、数据长度、发送发地址、发送方使用的端口号
  11.         byte[] data = packet.getData();
  12.         int len = packet.getLength();
  13.         InetAddress address = packet.getAddress();
  14.         int port = packet.getPort();
  15.         System.out.println("Received data: " + new String(data, 0, len));
  16.         System.out.println("This data was send from " + port + "port of the " + address + " computer");
  17.         //4. 释放资源
  18.         socket.close();
  19.     }
  20. }
复制代码
需要先运行接收端程序,接收程序阻塞等待接受数据。然后运行发送端程序,发送数据。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
继续阅读请点击广告

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

民工心事

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表