java udp 多播 广播_Java UDP 广播与多播
1、廣播:
同一網(wǎng)段所有主機(jī)都能接收,前提是端口要監(jiān)聽(tīng)
客戶(hù)端發(fā)送廣播,開(kāi)啟端口監(jiān)聽(tīng)的服務(wù)端接收并打印消息
服務(wù)端程序:
import?java.io.IOException;
import?java.net.DatagramPacket;
import?java.net.DatagramSocket;
import?java.net.SocketException;
public?class?TestServer?{
public?static?void?main(String[]?args)?{
int?port?=?9999;//開(kāi)啟監(jiān)聽(tīng)的端口
DatagramSocket?ds?=?null;
DatagramPacket?dp?=?null;
byte[]?buf?=?new?byte[1024];//存儲(chǔ)發(fā)來(lái)的消息
StringBuffer?sbuf?=?new?StringBuffer();
try?{
//綁定端口的
ds?=?new?DatagramSocket(port);
dp?=?new?DatagramPacket(buf,?buf.length);
System.out.println("監(jiān)聽(tīng)廣播端口打開(kāi):");
ds.receive(dp);
ds.close();
int?i;
for(i=0;i<1024;i++){
if(buf[i]?==?0){
break;
}
sbuf.append((char)?buf[i]);
}
System.out.println("收到廣播消息:"?+?sbuf.toString());
}?catch?(SocketException?e)?{
e.printStackTrace();
}?catch?(IOException?e)?{
e.printStackTrace();
}
}
}
發(fā)送端程序:
import?java.io.IOException;
import?java.net.DatagramPacket;
import?java.net.DatagramSocket;
import?java.net.InetAddress;
import?java.net.SocketException;
import?java.net.UnknownHostException;
public?class?Test?{
public?static?void?main(String[]?args)?{
//?廣播的實(shí)現(xiàn)?:由客戶(hù)端發(fā)出廣播,服務(wù)器端接收
String?host?=?"255.255.255.255";//廣播地址
int?port?=?9999;//廣播的目的端口
String?message?=?"test";//用于發(fā)送的字符串
try?{
InetAddress?adds?=?InetAddress.getByName(host);
DatagramSocket?ds?=?new?DatagramSocket();
DatagramPacket?dp?=?new?DatagramPacket(message.getBytes(),
message.length(),?adds,?port);
ds.send(dp);
ds.close();
}?catch?(UnknownHostException?e)?{
e.printStackTrace();
}?catch?(SocketException?e)?{
e.printStackTrace();
}?catch?(IOException?e)?{
e.printStackTrace();
}
}
}
2、多播
多播數(shù)據(jù)報(bào)套接字類(lèi)用于發(fā)送和接收 IP 多播包。MulticastSocket 是一種 (UDP) DatagramSocket,它具有加入 Internet 上其他多播主機(jī)的“組”的附加功能。
多播組通過(guò) D 類(lèi) IP 地址和標(biāo)準(zhǔn) UDP 端口號(hào)指定。D 類(lèi) IP 地址在 224.0.0.0 和 239.255.255.255 的范圍內(nèi)(包括兩者)。地址 224.0.0.0 被保留,不應(yīng)使用。
可以通過(guò)首先使用所需端口創(chuàng)建 MulticastSocket,然后調(diào)用 joinGroup(InetAddress groupAddr) 方法來(lái)加入多播組:(以上是jdk-doc的說(shuō)明,補(bǔ)充如下:服務(wù)器和客戶(hù)端必須都要加入相同的組播地址才可以)
服務(wù)器端程序:
import?java.io.IOException;
import?java.net.DatagramPacket;
import?java.net.DatagramSocket;
import?java.net.InetAddress;
import?java.net.MulticastSocket;
import?java.net.SocketException;
public?class?TestServer?{
public?static?void?main(String[]?args){
//接受組播和發(fā)送組播的數(shù)據(jù)報(bào)服務(wù)都要把組播地址添加進(jìn)來(lái)
String?host?=?"225.0.0.1";//多播地址
int?port?=?9998;
int?length?=?1024;
byte[]?buf?=?new?byte[length];
MulticastSocket?ms?=?null;
DatagramPacket?dp?=?null;
StringBuffer?sbuf?=?new?StringBuffer();
try?{
ms?=?new?MulticastSocket(port);
dp?=?new?DatagramPacket(buf,?length);
//加入多播地址
InetAddress?group?=?InetAddress.getByName(host);
ms.joinGroup(group);
System.out.println("監(jiān)聽(tīng)多播端口打開(kāi):");
ms.receive(dp);
ms.close();
int?i;
for(i=0;i<1024;i++){
if(buf[i]?==?0){
break;
}
sbuf.append((char)?buf[i]);
}
System.out.println("收到多播消息:"?+?sbuf.toString());
}?catch?(IOException?e)?{
e.printStackTrace();
}
}
}
客戶(hù)端程序:
import?java.io.IOException;
import?java.net.DatagramPacket;
import?java.net.DatagramSocket;
import?java.net.InetAddress;
import?java.net.MulticastSocket;
import?java.net.SocketException;
import?java.net.UnknownHostException;
public?class?Test?{
public?static?void?main(String[]?args){
String?host?=?"225.0.0.1";//多播地址
int?port?=?9998;
String?message?=?"test-multicastSocket";
try?{
InetAddress?group?=?InetAddress.getByName(host);
MulticastSocket?s?=?new?MulticastSocket();
//加入多播組
s.joinGroup(group);
DatagramPacket?dp?=?new?DatagramPacket(message.getBytes(),message.length(),group,port);
s.send(dp);
s.close();
}?catch?(UnknownHostException?e)?{
e.printStackTrace();
}?catch?(IOException?e)?{
e.printStackTrace();
}
}
}
簡(jiǎn)單實(shí)現(xiàn)了一下基于UDP的廣播和多播的功能,主要是理解多播和廣播的概念。尤其是組播,以前停留在概念上,只知道是傳送給一組主機(jī)而不是所有主機(jī),今天才豁然了。
歡迎轉(zhuǎn)載,但請(qǐng)引用本文鏈接。
總結(jié)
以上是生活随笔為你收集整理的java udp 多播 广播_Java UDP 广播与多播的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 13款途观l.8T是正时皮带还是正时链条
- 下一篇: java八种语言_Java语言八种基本类