Java連載128-UDP通訊編程

1、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()
返回將要接收或者發送的數據的長度。java

2、DatagramSocket

  • DatagramPacket就是數據包,DatagramSocket能夠認爲是運送數據包的「碼頭」

1.構造方法詳解

(1)DatagramSocket()
該構造方法用於建立發送端的DatagramSocket對象,沒有指定端口,系統會自動分配一個。
(2)DatagramSocket(int port)
既能夠用於發送端又能夠用於接收端。在用於接收端的時候必須指定端口號,這樣才能監聽端口。
(3)DatagramSocket(int port,InetAddress addr)
該對象適用於計算機上有多塊網卡的情形,使用時能夠明確規定數據經過哪塊網卡向外發送和接收 哪塊網卡的數據。因爲計算機中針對不一樣的網卡分配不一樣的IP地址,所以在建立對象的時候須要指定IP地址。node

2.經常使用的成員方法

(1)void receive(DatagramPacket p)
將接受到的數據填充到DatagramPacket數據包中,在接收到數據以前會一直處於阻塞狀態,只有當接收到數據包的時,該方法纔會返回。
(2)void send(DatagramPacket p)
放送DatagramPacket數據包,發送的數據包中包含將要發送的數據,數據的長度,遠程主機的IP地址和端口號。
(3)void close
關閉當前的Socket,通知驅動程序釋放爲這個Socket保留的資源。git

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+"\n發送的信息是:"+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

3、源碼:

  • 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
相關文章
相關標籤/搜索