java 局域网广播_java UDP实现局域网广播 | 学步园
使用UDP協議進行信息的傳輸之前不需要建議連接。換句話說就是客戶端向服務器發送信息,客戶端只需要給出服務器的ip地址和端口號,然后將信息封裝到一個待發送的報文中并且發送出去。至于服務器端是否存在,或者能否收到該報文,客戶端根本不用管。
通常我們討論的udp的程序都是一對一的單播程序。本章將討論一對多的服務:廣播(broadcast)、多播(multicast)。對于廣播,網絡中的所有主機都會接收一份數據副本。對于多播,消息只是發送到一個多播地址,網絡知識將數據分發給哪些表示想要接收發送到該多播地址的數據的主機??偟脕碚f,只有UDP套接字允許廣播或多播。
UDP廣播
廣播UDP與單播UDP的區別就是IP地址不同,廣播使用廣播地址255.255.255.255,將消息發送到在同一廣播網絡上的每個主機。值得強調的是:本地廣播信息是不會被路由器轉發。當然這是十分容易理解的,因為如果路由器轉發了廣播信息,那么勢必會引起網絡癱瘓。這也是為什么IP協議的設計者故意沒有定義互聯網范圍的廣播機制。
廣播地址通常用于在網絡游戲中處于同一本地網絡的玩家之間交流狀態信息等。廣播就不在寫演示程序了,讀者可以將ECHO程序的ip地址改為廣播地址即可。
其實廣播顧名思義,就是想局域網內所有的人說話,但是廣播還是要指明接收者的端口號的,因為不可能接受者的所有端口都來收聽廣播。
UDP多播
同樣的UDP多播也要指明接受者的端口號,而且與廣播相似的是多播與單播之間的區別還在于地址。ipv4中的多播地址范圍是:224.0.0.0到239.255.255.255。在JAVA中,多播一樣十分好實現,要實現多播,就要用到MulticastSocket類,其實該類就是DatagramSocket的子類,在使用時除了多播自己的一些特性外,把它當做DatagramSocket類使用就可以了。
使用java 的UDP進行廣播,要分兩步走,首先要加入到廣播組地址,其次要建立套接字傳輸信息
關于廣播,涉及到MulticastSocket,他用于接收廣播的信息,前提是要將它加入到廣播組,組播的地址是保留的D類地址從224.0.0.0—239.255.255.255,而且一些地址有特定的用處如,224.0.0.0—244.0.0.255只能用于局域網中路由器是不會轉發的,并且224.0.0.1是所有主機的地址,224.0.0.2所有路由器的地址,224.0.0.5所有ospf路由器的地址,224.0.13事PIMv2路由器的地址;239.0.0.0—239.255.255.255是私有地址(如192.168.x..x);224.0.1.0—238.255.255.255可以用與Internet上的。這里我們就選取230.0.0.1作為我們的廣播地址。
此軟件類似于飛鴿,用于局域網通信,每個客戶端上線都要尋找局域網其他主機并把自己的信息和所有主機交換,以此模式更新。。。
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.MulticastSocket;
/**
*
項目名稱:UDPMulticastDemo
*
類名稱:lanDemo
*
類描述:
*
創建人:wuzq,zhongqianhit@163.com
*
創建時間:2012-6-7 上午10:21:06
*
修改人:wuzq,zhongqianhit@163.com
*
修改時間:2012-6-7 上午10:21:06
*
修改備注:
* @version
**/
class lanSend {
// 廣播地址
private static final String BROADCAST_IP = "230.0.0.1";// 廣播IP
private static final int BROADCAST_INT_PORT = 40005; // 不同的port對應不同的socket發送端和接收端
MulticastSocket broadSocket;// 用于接收廣播信息
DatagramSocket sender;// 數據流套接字 相當于碼頭,用于發送信息
InetAddress broadAddress;// 廣播地址
public lanSend() {
try {
// 初始化
broadSocket = new MulticastSocket(BROADCAST_INT_PORT);
broadAddress = InetAddress.getByName(BROADCAST_IP);
sender = new DatagramSocket();
} catch (Exception e) {
// TODO: handle exception
System.out.println("*****lanSend初始化失敗*****" + e.toString());
}
}
void join() {
try {
broadSocket.joinGroup(broadAddress); // 加入到組播地址,這樣就能接收到組播信息
new Thread(new GetPacket()).start(); // 新建一個線程,用于循環偵聽端口信息
} catch (Exception e) {
// TODO: handle exception
System.out.println("*****加入組播失敗*****");
}
}
// 廣播發送查找在線用戶
void sendGetUserMsg() {
byte[] b = new byte[1024];
DatagramPacket packet; // 數據包,相當于集裝箱,封裝信息
try {
b = ("find@" + lanDemo.msg).getBytes();
packet = new DatagramPacket(b, b.length, broadAddress,
BROADCAST_INT_PORT); // 廣播信息到指定端口
sender.send(packet);
System.out.println("*****已發送請求*****");
} catch (Exception e) {
System.out.println("*****查找出錯*****");
}
}
// 當局域網內的在線機子收到廣播信息時響應并向發送廣播的ip地址主機發送返還信息,達到交換信息的目的
void returnUserMsg(String ip) {
byte[] b = new byte[1024];
DatagramPacket packet;
try {
b = ("retn@" + lanDemo.msg).getBytes();
packet = new DatagramPacket(b, b.length, InetAddress.getByName(ip),
BROADCAST_INT_PORT);
sender.send(packet);
System.out.print("發送信息成功!");
} catch (Exception e) {
// TODO: handle exception
System.out.println("*****發送返還信息失敗*****");
}
}
// 當局域網某機子下線是需要廣播發送下線通知
void offLine() {
byte[] b = new byte[1024];
DatagramPacket packet;
try {
b = ("offl@" + lanDemo.msg).getBytes();
packet = new DatagramPacket(b, b.length, broadAddress,
BROADCAST_INT_PORT);
sender.send(packet);
System.out.println("*****已離線*****");
} catch (Exception e) {
// TODO: handle exception
System.out.println("*****離線異常*****");
}
}
class GetPacket implements Runnable { // 新建的線程,用于偵聽
public void run() {
DatagramPacket inPacket;
String[] message;
while (true) {
try {
inPacket = new DatagramPacket(new byte[1024], 1024);
broadSocket.receive(inPacket); // 接收廣播信息并將信息封裝到inPacket中
message = new String(inPacket.getData(), 0,
inPacket.getLength()).split("@"); // 獲取信息,并切割頭部,判斷是何種信息(find--上線,retn--回答,offl--下線)
if (message[1].equals(lanDemo.ip))
continue; // 忽略自身
if (message[0].equals("find")) { // 如果是請求信息
System.out.println("新上線主機:" + " ip:" + message[1]
+ " 主機:" + message[2]);
returnUserMsg(message[1]);
} else if (message[0].equals("retn")) { // 如果是返回信息
System.out.println("找到新主機:" + " ip:" + message[1]
+ " 主機:" + message[2]);
} else if (message[0].equals("offl")) { // 如果是離線信息
System.out.println("主機下線:" + " ip:" + message[1]
+ " 主機:" + message[2]);
}
} catch (Exception e) {
// TODO: handle exception
System.out.println("線程出錯 " + e);
}
}
}
}
}
public class lanDemo {
// 全局變量
public static String msg;
public static String ip;
public static String hostName;
public static void main(String[] args) { // 程序入口點
lanSend lSend;
try {
InetAddress addr = InetAddress.getLocalHost();
ip = addr.getHostAddress().toString();
hostName = addr.getHostName().toString();
msg = ip + "@" + hostName;
lSend = new lanSend();
lSend.join(); // 加入組播,并創建線程偵聽
lSend.sendGetUserMsg(); // 廣播信息,尋找上線主機交換信息
Thread.sleep(10000); // 程序睡眠5秒
lSend.offLine(); // 廣播下線通知
} catch (Exception e) {
System.out.println("*****獲取本地用戶信息出錯*****");
}
}
}
總結
以上是生活随笔為你收集整理的java 局域网广播_java UDP实现局域网广播 | 学步园的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [vue] 你有使用过动态组件吗?说说你
- 下一篇: [vue] vue中什么是递归组件?举个