1. 程式人生 > >簡單的UDP編程1

簡單的UDP編程1

byte 單向 結果 bubuko ima sys 數據封裝 編程 stat

服務端:

技術分享圖片
 1 package udp;
 2 
 3 import java.io.IOException;
 4 import java.net.DatagramPacket;
 5 import java.net.DatagramSocket;
 6 import java.net.SocketException;
 7 
 8 //服務器
 9 public class AskServer {
10     public static void main(String[] args) throws IOException {
11         //1.創建一個DatagramSocket   用來發送或者接收數據的
12 DatagramSocket socket = new DatagramSocket(8888);//端口用來接收數據 13 14 //2.使用DatagramSocket接收數據 15 //接收數據 要使用 DatagramPacket 16 byte [] buf = new byte [1024];//接收數據不需要知道對方IP 17 DatagramPacket packet = new DatagramPacket(buf, buf.length); 18 socket.receive(packet);
19 //System.out.println(packet.getLength());//數據包的長度 20 //System.out.println(packet.getData());//對方發送的數據 21 //System.out.println(new String(packet.getData(),0,packet.getLength())); 22 System.out.println("來自客戶端的消息:"+new String(buf,0,packet.getLength())); 23 /* System.out.println(packet.getAddress());//對方的ip?
24 System.out.println(packet.getPort());//對方的端口號*/ 25 26 //3.向客戶端發送數據 27 String reply ="親,在的"; 28 byte [] buf2 = reply.getBytes(); 29 //對方的IP可能隨時變化 通過接收的數據包能夠獲取對方的ip和端口 30 DatagramPacket packet2 = new DatagramPacket(buf2, buf2.length, packet.getAddress(), packet.getPort()); 31 socket.send(packet2); 32 33 //4.關閉 34 socket.close(); 35 } 36 }
AskServer.java

客戶端:

技術分享圖片
 1 package udp;
 2 
 3 import java.io.IOException;
 4 import java.net.DatagramPacket;
 5 import java.net.DatagramSocket;
 6 import java.net.InetAddress;
 7 import java.net.SocketException;
 8 import java.net.UnknownHostException;
 9 
10 /**
11  * @author superdrew
12  *        功能:客戶和咨詢師在線交流
13  *        使用udp完成
14  *        註意:
15  *        1.udp沒有嚴格意義區分服務端和客戶端,雙方都是平等的(主動發送請求是客戶端,被動接收請求的是服務端)
16  *        2.udp編程和IO流沒有關系
17  *        3.udp兩個核心類
18  *            DatagramSocket:用來接收或者發送數據包
19  *            DatagramPacket:數據包
20  *        4.客戶端不寫 port 端口 會 自動生成一個端口
21  *
22  *        分解1:先完成一次單向通信
23  *           2:一次雙向通信
24  *           3:多次雙向通信
25  *
26  *        總結:1。DatagramSocket 
27  *                用來接收和發送數據的
28  *                socket.send(packet)
29  *                socket.receive(packet2)
30  *            2。DatagramPacket
31  *                封裝了數據,對方的IP,對方的接收端口
32  *                getLength()   獲取對方發送數據的長度
33  *                getData()     獲取對方發送的數據 (字節數組)
34  *                getAddress()  獲取對方的ip
35  *                getPort()     獲取對方的發送數據的端口
36  *            
37  */
38 
39 public class AskClient {
40     public static void main(String[] args) throws IOException {
41         //1.創建DatagramSocket 用來發送數據
42         DatagramSocket socket = new DatagramSocket(9999);//發送端的端口
43         
44         //2.使用DatagramSocket發送數據
45         //發送數據只前 要 創建  DatagramPacket 數據包
46         String info = "親,在嗎?";
47         byte [] buf = info.getBytes();
48         DatagramPacket packet = new DatagramPacket(buf, buf.length, InetAddress.getLocalHost(),8888);
49         socket.send(packet);
50         
51         byte [] buf2 = new byte [1024];
52         DatagramPacket packet2 = new DatagramPacket(buf2,buf2.length);
53         socket.receive(packet2);//接收的數據都放到packet2裏面了  對方發送的數據封裝到了buf2 用 packet2.getData 效果是一樣的s
54         String result = new String(buf2,0,buf2.length);
55         System.out.println("來自服務器的消息:"+result);
56         
57         //3.關閉資源
58         socket.close();
59     }
60 
61 }
AskClient.java

操作步驟:

① 運行服務端;② 運行客戶端;

結果展示:

技術分享圖片

技術分享圖片

簡單的UDP編程1