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();
      }     
   }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章