java多播
⑴ java程序做broadcast
说的是你定义的地址不是组播地址吧
//选用专门为多播指定的D类IP地址(224.0.0.1到239.255.255.255)任选一个即可,用来创建一个多播组
public static final String DefaultMulticastGroupIP="230.1.1.1";
//使用指定的端口(一般选1024以上的端口号)只要是空闲端口即可,用于建立多播套接字。
public static final int DefaultMulticastGroupPort=1314;
⑵ 基于java的p2p实现文件共享和传输
在JAVA中,发送和接收多播信息的方法:
发送多播信息需经历步骤
确定发送的具体信息内容
String msg = "Hello";
选用专门为多播指定的D类IP地址(224.0.0.1到239.255.255.255),创建一个多播组
InetAddress group = InetAddress.getByName("228.5.6.7");
使用指定的端口(一般选1024以上的端口号)建立多播套接字
MulticastSocket s = new MulticastSocket(6789);
加入多播组
s.joinGroup(group);
创建一个数据报封装多播信息
DatagramPacket hi = new DatagramPacket(msg.getBytes(), msg.length(),
group, 6789);
发送
s.send(hi);
接收多播信息的步骤
开辟接收缓冲区
byte[] buf = new byte[1000];
创建接收数据报
DatagramPacket recv = new DatagramPacket(buf, buf.length);
接收
s.receive(recv);
注意:以上发送和接收程序在同一个文件中实现,若在不同文件中实现则应分别定义多播套接字并加入多播组。
3.与已知IP和端口的端点通信
在互联网上主要采用TCP和UDP来实现两点之间的通信。采用TCP可可靠传送信息,但花费时间较多;采用UDP可快速传递信息,但不能保证可靠传递。JAVA实现TCP通信的方法 :
利用Socket(InetAddress addr, int port)和 Socket(String host, int port),创建客户端套接字,利用ServerSocket(int port)创建服务器端套接字,port端口就是服务器监听连接请求的端口,通过调用accept()返回一个最近创建的Socket对象,该Socket对象绑定了客户程序的IP地址或端口号。通过调用Socket的 getInputStream()方法获得输入流读传送来的信息,也可能通过调用Socket的 getOutputStream()方法获得输出流来发送消息。JAVA实现UDP通信的方法 :
使用DatagramPacket(byte [] buffer, int length, InetAddress addr, int port) 确定数据包数组、数组的长度、数据包的地址和端口信息。使用DatagramSocket()创建客户端套接字,而服务器端则采用DatagramSocket(int port),调用send(DatagramPacket dgp)和 receive(DatagramPacket dgp)来发送和接收数据包。本文设计的程序采用UDP。P2P(Peer-to-Peer 端到端)模型是与C/S(客户/服务器)模型相对应。基于C/S的用户间通信需要由服务器中转,在C/S中的服务器故障将导致整个网络通信的瘫痪。。而基于P2P的用户间通信则是直接通信,去掉了服务器这一层,带来的显着优点是通信时没有单一的失败点,一个用户的故障不会影响整个P2P网络。本文提供了一种用JAVA实现P2P网络通信的方法。
⑶ 40、在Java中,如何实现组播通信
编辑一个java组播应用程序的过程如下
1. 创建一个用于发送和接收的MulticastSocket组播套接字对象
2. 创建一个指定缓冲区大小及组播地址和端口的DatagramPacket组播数据包对象
3. 使用组播套接字joinGroup(),将其加入到一个组播
4. 使用组播套接字的send()方法,将组播数据包对象放入其中,发送组播数据包.
或者
使用组播套接字的receive()方法,将组播数据包对象放入其中,接收组播数据包
5. 解码组播数据包提取信息,并依据得到的信息作出响应String s = new String(dp.getData(), 0, dp.getLength());
6. 重复过程4和5,即在while循环中实现。
7. 使用组播套接字的leaveGroup()方法,离开组播组;关闭组播套接字
接收组播数据包程序:
Java代码
public class MulticastReceived {
public static void main(String[] args) throws Exception {
InetAddress group = InetAddress.getByName("224.0.0.4"); // 组播地址
int port = 4006; // 端口
MulticastSocket msr = null;
try {
msr = new MulticastSocket(port); // 1.创建一个用于发送和接收的MulticastSocket组播套接字对象
msr.joinGroup(group); // 3.使用组播套接字joinGroup(),将其加入到一个组播
byte[] buffer = new byte[8192];
System.out.println("接收数据包启动!(启动时间:)" + new java.util.Date() + ")");
while (true) {
DatagramPacket dp = new DatagramPacket(buffer, buffer.length); // 2.创建一个指定缓冲区大小及组播地址和端口的DatagramPacket组播数据包对象
msr.receive(dp); // 4.使用组播套接字的receive()方法,将组播数据包对象放入其中,接收组播数据包
String s = new String(dp.getData(), 0, dp.getLength()); // 5.解码组播数据包提取信息,并依据得到的信息作出响应
System.out.println(s);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (msr != null) {
try {
msr.leaveGroup(group); // 7.使用组播套接字的leaveGroup()方法,离开组播组
msr.close(); // 关闭组播套接字
} catch (IOException e) {
}
}
}
}
}
发送组播数据包程序:
Java代码
public class MulticastSender {
public static void main(String[] args) throws Exception {
InetAddress group = InetAddress.getByName("224.0.0.1"); // 组播地址
int port = 4000; // 端口
MulticastSocket mss = null;
try {
mss = new MulticastSocket(port); // 1.创建一个用于发送和接收的MulticastSocket组播套接字对象
mss.joinGroup(group); // 3.使用组播套接字joinGroup(),将其加入到一个组播
byte[] buffer = new byte[8192];
System.out.println("接收数据包启动!(启动时间:)" + new java.util.Date() + ")");
while (true) {
String message = "Hello" + new java.util.Date();
byte[] buffer2 = message.getBytes(); // 2.创建一个指定缓冲区大小及组播地址和端口的DatagramPacket组播数据包对象
DatagramPacket dp = new DatagramPacket(buffer, buffer.length, group, port);
// msr.receive(dp); //接收组播数据包
mss.send(dp); // 4.使用组播套接字的send()方法,将组播数据包对象放入其中,发送组播数据包
// String s = new String(dp.getData(), 0, dp.getLength()); //5.解码组播数据包提取信息,并依据得到的信息作出响应
System.out.println("发送数据包给" + group + ":" + port);
Thread.sleep(1000);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (mss != null) {
try {
mss.leaveGroup(group); // 7.使用组播套接字的leaveGroup()方法,离开组播组
mss.close(); // 关闭组播套接字
} catch (IOException e) {
}
}
}
}
}
⑷ JAVA编局域网聊天室
我是用多播实现的,MulticastSocket是DatagramSocket的子类,暂时还只能用于局域网,不过多播是可以在广域网上进行的
大概步骤如下:
1.加入多播组
2.发送/接收数据包
发送需要从文本输入
接收时使用了一个线程循环接收
3.发生异常离开多播组
我也见过用ServerSocket,Socket实现的,随便找本网络编程的书,上面都有类似的代码
编程环境:JDK1.7,eclipse3.5
⑸ 为什么java下写的udp发送多播能够成功,到android下面却发送不出去呢求大神帮个忙。。。
加网络权限了吗
⑹ java如何实现两段程序走不同的网卡
java可以调用硬件驱动,在使用网卡的时候,在java程序内部制定网卡的驱动名称就可以
⑺ java rtpstream怎么用
1.出现Local Data AddressDoes not belong to any of this hosts local interfaces错误:
主要问题是发送视频和音频的程序需要在服务器上运行,你可以选择Win2000 Server 或者Win2003 Server,问题就解决了。
2.传输声音和视频的方法如下:
a.传输声音或者视频文件
编译完AVTransmit2.java后,再命令提示符中输入命令:java AVTransmit2 file:test.wav 224.224.123.123 22222(注意文件的类型是.wav 或者.mov 、.mpg的文件,不可以是.mp3、.rmvb等其他不支持的文件。传输支持文件格式有限,我也没有办法,应该在添加相关的插件就行了,希望大家提供帮助),其中test.wav即传输的文件名,224.224.123.123为多播地址,22222为端口号.
接收方法:编译完AVReceive.java后,在命令提示符中输入命令:java AVReceive 224.224.123.123/22222即可接受到声音文件
b.传输麦克风的音频,在传输之前先检查电脑录音控制的选项是否为麦克风.(步骤:打开桌面任务栏上的音量控制,选择选项---->属性----->调节音量选择录音,之后在下面的音量控制属性中选中麦克风。单击确定。接着跳到录音控制,选择麦克风就行了)。使用的命令是:java AVTransmit2 dsound:// 224.224.123.123 22222,此时就开始传输声音了。
接收方法同上
c.传输摄相头视频,使用的命令为:java AVTransmit2 vfw://0 224.224.123.123 22222
接收方法同上
d.关于广播、组播和单播
广播:对于局域网广播你可以使用广播的地址,如你的子网掩码是255.255.225.0,即C类的默认子网掩码,你的广播地址可以是192.168.3.255。(注:我的局域网ip地址分配为192.168.3.X)。如子网掩码不同,你可以参照相关的网络常识自己推算。
接收时也使用多播地址来接受,假如发送方的机器地址为:192.168.3.46。发送时在发送放的机器上运行java AVTransmit2 file:test.wav 192.168.3.255 22222,接收时使用java AVReceive2 224.224.123.123 22222。才能完成接收.这和网上的说法不同,端口号不要填错,地址任意。按网上的说法,使用的接收地址应为为192.168.3.46,可是我没有成功,总是出现Local Data AddressDoes not belong to any of this hosts local interfaces的错误,而使用多播地址反而成功了。具体的参数我就不多介绍了,有问题可以给我留言。
组播:使用组播地址发送,组播地址接收即可
单播:假如你只想给某台机子发送,那么就在发送方输入命令,如:java AVTransmit2 file:test.wav 192.168.3.47 22222,这时你只会将声音流文件发送给47号计算机。而接受时还是使用多播地址,如java AVReceive2 224.224.123.123 22222。这是就听到声音了。
总之,使用RTP传输,在接受时都在使用多播地址,在发送时根据情况而定,至于ttl你可以不去管它。不只大家是怎么实现的,反正网上的资料让我变的很失望,真正的成功源于实践。下面摘取一段让大家欣赏(尽信书则不如无书)
网上摘取:
Transmitting Audio and Video over RTP
The AVTransmit2 class is very similar to the VideoTransmit, but uses RTP managers
to send the video and audio streams.
Since the media tracks are transmitted in multiple sessions, you'll need to
use one Player per track on the receive side. Using JMStudio, you can
start multiple Players from the "File" menu using the "New Window"
item. Then either:
use the "Open URL..." item to open one RTP session per track. The URL to use is:
rtp://<sourceIP>:<port>/media
Where <sourceIP> is the IP address of the RTP session and the port
number is the same one that is used on the transmitting side.
OR
Open RTP session and specify <sourcIP> and <port>
How to run this sample
1. Run AVTransmit2 with the required 3 command line parameters
For example, we can use any of the following:
- java AVTransmit2 file:clips/clip01mpg.mpg 224.112.112.112 22222
2. To receive the transmission on the client side use JMStudio:
- use open RTP session and specify group: 224.112.112.112 & port: 22222
AND use FILE -> New Window and open RTP sesssion with port 22224.
OR
- use open URL and specify: rtp://224.112.112.112:22222/video
AND use FILE -> New Window and open URL with 22224/audio
Notes:
You should run 1. then 2., otherwise AVTransmit2 will find the port number used.
You can also use the program to send only audio or video as follows:
- java AVTransmit2 javasound://0 224.112.112.112 22222 (audio only)
- java AVTransmit2 vfw://0 224.112.112.112 22222 (video only)
In such case create only one instance of JMStudio.
Use Unicast:
- java AVTransmit2 file:clip01.mpg 128.82.4.7 22222
Where 128.82.4.7 is the receicver address.
If the sender address is 128.82.4.9 it will use port 22222 as well
to send out data. In this case the receiver (e.g., JMStudio)
should specify the sender as: 128.82.4.9 22222.
Therefore to use unicast you should have two machines since
you can not use the same port for both sender and receiver.
Receiving Audio and Video using RTP
AVReceive2 uses the RTPManager API to receive RTP transmissions.
AVReceive2 performs the following tasks:
Open one RTP session per session address given.
Listen for the NewReceiveStreamEvent from the ReceiveStreamListener.
Create a JMF Player for each stream received for playback.
This sample program can be used in conjunction with JMStudio,
the AVTransmit2 sample or any other RTP compliant transmitter.
The IP address should be the address of the computer which transmits the data; or the multicast address if multicast is being used for the transmission.
The ports should be the same as what's being used by the transmitter.
How to run this sample
1. Run AVTransmit2 with the required 3 command line parameters
For example:
- java AVTransmit2 file:clips/clip01mpg.mpg 224.112.112.112 1234
2. Run AVReceive2 and specify the RTP session addresses to receive from.
For example:
- java AVReceive2 224.112.112.112/1234 224.112.112.112/1236
to simultaneously receive 2 different RTP sessions (video and audio).
Note: because of port reuse, it must run in this order, 1 then 2.
⑻ JAVA中什么叫“多播地址”
0.0.0.0就是多播地址
⑼ java的MulticastSocket 多播只能用于局域网吗
恩 组播应该是不行 而且组播需要路由协议的支持
qq用的是udp 他是利用中心服务器进行打洞后建立起的p2p的udp链接
我猜想应该是登陆的时候链接一下中心服务器 打洞成功后 以后你和好友间的聊天全是你们点对点的udp 就和服务器关系不大了
如果编聊天软件应该结合tcp和udp
⑽ JAVA 使用UDP协议发送组播报文,组播地址该如何设置
IP/port 要对应
~~~~~~~上源码,再回来试试