JAVA网络编程值之UDP传输

一、UDP传输

1.发送Send

步骤:

  • 创建DatagramSocket,随机端口号

  • 创建DatagramPacket,指定数据,长度,地址,端口

  • 使用DatagramSocket发送DatagramPacket

  • 关闭DatagramSocket

DatagramSocket()
          构造数据报套接字并将其绑定到本地主机上任何可用的端口。
DatagramSocket(int port, InetAddress laddr)
          创建数据报套接字,将其绑定到指定的本地地址。
DatagramPacket(byte[] buf, int length, InetAddress address, int port)
          构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。
 void send(DatagramPacket p)
          从此套接字发送数据报包。
public static void main(String[] args) throws Exception {
   String str = "what are you 弄啥呢?";
   DatagramSocket socket = new DatagramSocket();           //创建Socket相当于创建码头
   DatagramPacket packet =                            //创建Packet相当于集装箱
         new DatagramPacket(str.getBytes(), str.getBytes().length, InetAddress.getByName("127.0.0.1"), 6666);
   socket.send(packet);                              //发货,将数据发出去
   socket.close();                                     //关闭码头
}

2.接受Receive

步骤:

  • 创建DatagramSocket,指定端口号
  • 创建DatagramPacket,指定数组, 长度
  • 使用DatagramSocket接收DatagramPacket
  • 关闭DatagramSocket
  • 从DatagramPacket中获取数据
DatagramSocket(int port)
          创建数据报套接字并将其绑定到本地主机上的指定端口。
DatagramPacket(byte[] buf, int length)
          构造 DatagramPacket,用来接收长度为 length 的数据包。
 void receive(DatagramPacket p)
          从此套接字接收数据报包。
 byte[] getData()
          返回数据缓冲区。
 int getLength()
          返回将要发送或接收到的数据的长度。
public static void main(String[] args) throws Exception {
   DatagramSocket socket = new DatagramSocket(6666);     //创建Socket相当于创建码头
   DatagramPacket packet = new DatagramPacket(new byte[1024], 1024);//创建Packet相当于创建集装箱
   socket.receive(packet);                            //接货,接收数据
   
   byte[] arr = packet.getData();                   //获取数据
   int len = packet.getLength();                    //获取有效的字节个数
   System.out.println(new String(arr,0,len));
   socket.close();
}

3.接收方获取ip和端口号

 InetAddress getAddress()
          返回某台机器的 IP 地址,此数据报将要发往该机器或者是从该机器接收到的。
 int getPort()
          返回某台远程主机的端口号,此数据报将要发往该主机或者是从该主机接收到的。

二、UDP传输优化

1.发送端Send

public static void main(String[] args) throws Exception {
   Scanner sc = new Scanner(System.in);                  //创建键盘录入对象
   DatagramSocket socket = new DatagramSocket();           //创建Socket相当于创建码头
   
   while(true) {
      String line = sc.nextLine();                     //获取键盘录入的字符串
      if("quit".equals(line)) {
         break;
      }
      DatagramPacket packet =                         //创建Packet相当于集装箱
            new DatagramPacket(line.getBytes(), line.getBytes().length, InetAddress.getByName("127.0.0.1"), 6666);
      socket.send(packet);                           //发货,将数据发出去
   }
   socket.close();                                     //关闭码头
}

2.接收端Receive

public static void main(String[] args) throws Exception {
   DatagramSocket socket = new DatagramSocket(6666);     //创建Socket相当于创建码头
   DatagramPacket packet = new DatagramPacket(new byte[1024], 1024);//创建Packet相当于创建集装箱
   
   while(true) {
      socket.receive(packet);                            //接货,接收数据
      
      byte[] arr = packet.getData();                   //获取数据
      int len = packet.getLength();                    //获取有效的字节个数
      String ip = packet.getAddress().getHostAddress();     //获取ip地址
      int port = packet.getPort();                     //获取端口号
      System.out.println(ip + ":" + port + ":" + new String(arr,0,len));
   }
}

三、UDP传输多线程

public class Demo3_MoreThread {
   public static void main(String[] args) {
      new Receive().start();
      
      new Send().start();
   }

}

class Receive extends Thread {
   public void run() {
      try {
         DatagramSocket socket = new DatagramSocket(6666);     //创建Socket相当于创建码头
         DatagramPacket packet = new DatagramPacket(new byte[1024], 1024);//创建Packet相当于创建集装箱
         
         while(true) {
            socket.receive(packet);                            //接货,接收数据
            
            byte[] arr = packet.getData();                   //获取数据
            int len = packet.getLength();                    //获取有效的字节个数
            String ip = packet.getAddress().getHostAddress();     //获取ip地址
            int port = packet.getPort();                     //获取端口号
            System.out.println(ip + ":" + port + ":" + new String(arr,0,len));
         }
      } catch (IOException e) {
         
         e.printStackTrace();
      }
   }
}

class Send extends Thread {
   public void run() {
      try {
         Scanner sc = new Scanner(System.in);                  //创建键盘录入对象
         DatagramSocket socket = new DatagramSocket();           //创建Socket相当于创建码头
         
         while(true) {
            String line = sc.nextLine();                     //获取键盘录入的字符串
            if("quit".equals(line)) {
               break;
            }
            DatagramPacket packet =                         //创建Packet相当于集装箱
                  new DatagramPacket(line.getBytes(), line.getBytes().length, InetAddress.getByName("127.0.0.1"), 6666);
            socket.send(packet);                           //发货,将数据发出去
         }
         socket.close();
      }  catch (IOException e) {
         
         e.printStackTrace();
      }     
   }
}

猜你喜欢

转载自blog.csdn.net/qq_40298054/article/details/88144309