前言
Internet 協議集支持一個無連接的傳輸協議,該協議稱為用戶數據報協議(UDP,User Datagram Protocol)。UDP 為應用程序提供了一種無需建立連接就可以發送封裝的 IP 數據包的方法。
?
此代碼就是基于UDP協議編寫。
?
通常把一對多的通信稱為多播通信。采用多播通信技術,不僅可以實現一個發送者和多個接收者之間進行通信的功能,而且可以有效減輕網絡通信的負擔,避免資源的無謂浪費。
?
UDP組播地址:224.0.0.0 ~ 224.0.0.255
?
組播有一個特點,就是你發送地址可以使用一個端口,但是你接收地址也可以使用同樣的一個端口。
?
?
數據發送
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
import java.util.Scanner;
?
public class SendDataDemo {
? ? public static void main(String[] args) throws IOException {
?
? ? ? ? /* 組播 */
? ? ? ? Scanner in=new Scanner(System.in);
? ? ? ? MulticastSocket ms=new MulticastSocket();
?
? ? ? ? System.out.println("請輸入用戶名");
? ? ? ? String name=in.next()+":";
?
? ? ? ? new MyThread().start();
? ? ? ? while(true){
? ? ? ? ? ? String target=name+in.next();
? ? ? ? ? ? if("886".equals(target)) { break; }
?
? ? ? ? ? ? byte[] bytes = target.getBytes();
? ? ? ? ? ? InetAddress inetAddress = InetAddress.getByName("224.0.0.0");
? ? ? ? ? ? int port=11451;
? ? ? ? ? ? DatagramPacket dp=new DatagramPacket(bytes,bytes.length,inetAddress,port);
?
? ? ? ? ? ? ms.send(dp); // 發送
? ? ? ? }
? ? ? ? System.out.println("主線程退出");
? ? ? ? ms.close();
? ? }
}
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
?
數據接收線程
import java.io.IOException;
import java.net.*;
?
public class MyThread extends Thread{
? ? @Override
? ? public void run() {
? ? ? ? MulticastSocket ms= null; // 指定接收端口
? ? ? ? try {
? ? ? ? ? ? ms = new MulticastSocket(11451);
? ? ? ? ? ? InetAddress inetAddress = InetAddress.getByName("224.0.0.0"); // 指定組播地址
? ? ? ? ? ? ms.joinGroup(inetAddress); // 將當前接收端加入組播
? ? ? ? } catch (IOException e) {
? ? ? ? ? ? throw new RuntimeException(e);
? ? ? ? }
? ? ? ? byte[] bytes=new byte[1024];
? ? ? ? DatagramPacket dp=new DatagramPacket(bytes,bytes.length);
? ? ? ? while(true){
? ? ? ? ? ? try {
? ? ? ? ? ? ? ? ms.receive(dp); // 接收數據
? ? ? ? ? ? } catch (IOException e) {
? ? ? ? ? ? ? ? throw new RuntimeException(e);
? ? ? ? ? ? }
? ? ? ? ? ? int len = dp.getLength(); // 獲取接收數據的長度
? ? ? ? ? ? byte[] data = dp.getData(); // 獲取存儲接收數據的數組
? ? ? ? ? ? String res = new String(data, 0, len);
?
? ? ? ? ? ? if("886".equals(res)) { break; }
? ? ? ? ? ? System.out.println(res);
? ? ? ? }
? ? ? ? System.out.println("輸出線程退出");
? ? }
}
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
End
?
?