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+"
发送的信息是:"+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();
  }
 }

}
 
  • 我们先运行这个服务器端
  • 128.1
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();
  }
 }

}
 
  • 接下里运行客户端程序
  • 128.2

三、源码:

  • 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
  • CSDN:https://blog.csdn.net/weixin_44630050
  • 博客园:https://www.cnblogs.com/ruigege0000/
  • 欢迎关注微信公众号:傅里叶变换,个人账号,仅用于技术交流,后台回复“礼包”获取Java大数据学习视频礼包
  • 127.59
原文地址:https://www.cnblogs.com/ruigege0000/p/13270181.html