UDP协议的简介
UDP协议是一种面向无连接不可靠的协议,也就是在进行数据通讯之前发送端和接收端无需进行连接,发送端要发送数据,
只需构造数据报,并将接收端的地址放入数据报中,然后将其发送出去就可以了.
该协议是一种不可靠的协议,因为收发放没有连接过程, 发送出去的数据有可能中途丢失,并且发送端还得不到反馈.
所以在实现UDP协议的程序中,最关键是如何实现UDP的数据报.
JAVA中提供了实现UDP协议的两个关键类
数据报类:DatagramPacket:构建一个数据报,里面可以放入要发送的数据以及接收端的地址.
UDP端类:DatagramSocket:构建实行UDP功能的发送端与接收端,实现发送与接收数据报
DatagramPacket:
DatagramSocket:
UDP协议网络编程方法
接收端程序编写:
①调用DatagramSocket(int port)创建一个数据报套接字,并绑定到指定端口上;
②调用DatagramPacket(byte[] buf, int length),建立一个字节数组以接收UDP包 。
③调用DatagramSocket类的receive(),接收UDP包。
④最后关闭数据报套接字。
发送端程序编写:
①调用DatagramSocket()创建一个数据报套接字;
②调用DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port),建立要发送的UDP包。
③调用DatagramSocket类的send(),发送UDP包。
④最后关闭数据报套接字。
一方发,一方收:
发送方:
public class DataPacketSend
{
public static void main(String[] args) throws Exception
{
// DatagramPacket dp1=null;
// DatagramSocket ds=null;
String str=null;
BufferedReader keyin=new BufferedReader(new InputStreamReader(System.in));
str=keyin.readLine();
DatagramPacket dp1=new DatagramPacket(str.getBytes(),0,str.getBytes().length,
InetAddress.getByName("127.0.0.1"),6000);
DatagramSocket ds=new DatagramSocket();
ds.send(dp1);
ds.close();
}
}
接收方:
public class DataPacketReceive
{
public static void main(String[] args) throws Exception
{
DatagramPacket dp1=null;
DatagramSocket ds=null;
byte[] buf=new byte[1024];
int len=0;
dp1=new DatagramPacket(buf,0,buf.length);
ds=new DatagramSocket(6000);
ds.receive(dp1);
len=dp1.getLength();
System.out.println(new String(buf,0,len));
ds.close();
}
}
发送并接收:
public class DataPacketSend2 {
public static void main(String[] args)throws Exception{
DatagramSocket ds=new DatagramSocket();
byte[] sbuf=new byte[1024];
byte[] rbuf=new byte[1024];
DatagramPacket sdp=new DatagramPacket(sbuf,sbuf.length);
DatagramPacket rdp=new DatagramPacket(rbuf,rbuf.length);
BufferedReader keyin=new BufferedReader(new InputStreamReader(System.in));
String str=null;
InetAddress IP=InetAddress.getByName("127.0.0.1");
while(true){
System.out.print("请输入要发送的消息:");
str=keyin.readLine();
sbuf=str.getBytes();
sdp.setAddress(IP);
sdp.setPort(12345);
sdp.setData(sbuf,0,str.length());
ds.send(sdp);
if(str.trim().equals("bye"))
break;
System.out.println("等待对方回复.....");
ds.receive(rdp);
rbuf=rdp.getData();
str=new String(rbuf,0,rdp.getLength());
System.out.println("对方回复: "+str);
if(str.trim().equals("bye"))
break;
}
ds.close();
keyin.close();
}
}
public class DataPacketReceive2 {
public static void main(String[] args)throws Exception{
DatagramSocket ds=new DatagramSocket(12345);
byte[] sbuf=new byte[1024];
byte[] rbuf=new byte[1024];
DatagramPacket sdp=new DatagramPacket(sbuf,sbuf.length);
DatagramPacket rdp=new DatagramPacket(rbuf,rbuf.length);
BufferedReader keyin=new BufferedReader(new InputStreamReader(System.in));
String str=null;
while(true){
System.out.println("等待对方消息.....");
ds.receive(rdp);
rbuf=rdp.getData();
str=new String(rbuf,0,rdp.getLength());
System.out.println(str);
if(str.trim().equals("bye"))
break;
System.out.print("请输入消息: ");
str=keyin.readLine();
sbuf=str.getBytes();
sdp.setAddress(rdp.getAddress());
sdp.setPort(rdp.getPort());
sdp.setData(sbuf);
sdp.setLength(str.length());
ds.send(sdp);
if(str.trim().equals("bye"))
break;
}
ds.close();
keyin.close();
}
}
UDP广播:
MulticastSocket类
多播数据报套接字类用于发送和接收 IP 多播包。MulticastSocket 是一种 (UDP) DatagramSocket,它具有加入
Internet上其他多播主机的“组”的附加功能。
多播组通过 D 类 IP 地址和标准 UDP 端口号指定。D 类 IP 地址在 224.0.0.0 和 239.255.255.255 的范围内(包括两
者)。地址 224.0.0.0 被保留,不应使用。
组播和广播的区别?
如同上个例子,当有多台主机想要接收相同的报文,广播采用的方式是把报文传送到局域网内每个主机上,不管这个主机是否对报文感兴趣。这样做就会造成了带宽的浪费和主机的资源浪费。而组播有一套对组员和组之间关系维护的机制,可以明确的知道在某个子网中,是否有主机对这类组播报文感兴趣,如果没有就不会把报文进行转发,并会通知上游路由器不要再转发这类报文到下游路由器上。
发送接收数据报的方法与DatagramSocket完全一样.MulticastSocket比DatagramSocket多了一个setTimeToLive(int ttl)方法:该ttl参数用于设置数据报最多可以跨过多少个网络:
ttl = 0:数据报停留在本地主机
ttl = 1:数据报发送到本地局域网(默认)
ttl = 32:只能发送到本站点的网络上
ttl = 64:数据报应保留在本地区
ttl = 128:数据报应保留在本大洲
ttl = 255:数据报可以发送到所有地方
示例基于UDP的MulticastSocket编程(发送):
public class muitSend {
public static void main(String[] args)throws Exception{
MulticastSocket ms=new MulticastSocket();
InetAddress mulIp=InetAddress.getByName("224.0.0.1");
int port=6000;
ms.joinGroup(mulIp);
byte[] sbuf=new byte[1024];
while(true){
int len=System.in.read(sbuf,0,sbuf.length);
if(len>0){
DatagramPacket sdp=new DatagramPacket(sbuf,len,mulIp,port);
ms.send(sdp);
}
else
break;
}
}
}
示例基于UDP的MulticastSocket编程(接收):
public class muitReceive {
public static void main(String[] args)throws Exception{
MulticastSocket ms=new MulticastSocket(6000);
InetAddress mulIp=InetAddress.getByName("224.0.0.1");
ms.joinGroup(mulIp);
byte[] rbuf=new byte[1024];
while(true){
DatagramPacket rdp=new DatagramPacket(rbuf,rbuf.length);
ms.receive(rdp);
if(rdp.getLength()>0)
System.out.write(rbuf,0,rdp.getLength());
else
break;
}
}
}
分享到:
相关推荐
完整版的,经过调试的一个java环境下的基于UDP协议的聊天程序,udp协议聊天程序、java开发、计算机网络课程设计
使用Java语言编写程序,设计UDP服务器。考虑到实时性,采用UDP协议。 1.设计一个简单的界面,使得程序能够流畅的完成视频文件的传输。
JAVA 面向对象程序设计教程 第13章 Java网络编程 第13章-Java网络编程-Java面向对象程序设计教程-微课视频版-程杰-清华大学出版社全文共17页,当前为第1页。 第13章 Java网络编程 第13章-Java网络编程-Java面向对象...
java基于UDP协议的可靠通讯系统的设计与实现程序源码.rar
使用 UDP协议的 Socket 网络程序设计 java编程
java版基于UDP协议网上聊天程序课程设计报告.doc
java版基于UDP协议网上聊天程序课程设计报告书.doc
计算机网络课程设计——端口扫描器的实现 1.利用Socket通信机制实现一个多线程的端口扫描器。 2.设计要求: 2.1用户界面:用户可以输入IP地址或IP地址段;...2.3 采用Java网络编程包java.io中提供的编程接口实现。
设计要求: 1)按照UDP协议数据包发送方式实现用户端之间的通信。 2)统计包的发送和接收数,计算数据包的丢失数。 3)设计美观易用的图形界面。
主要为大家详细介绍了Java基于UDP协议实现简单的聊天室程序的相关资料,感兴趣的小伙伴们可以参考一下
用java编写的基于UDP和TCP两种协议编写的Socket(网络编程)案列
使用UDP协议 C/S的编程模式 简单的聊天程序
java语言与面向对象程序设计形考4-0001 java语言与面向对象程序设计形考4-0001全文共12页,当前为第1页。java语言与面向对象程序设计形考4-0001全文共12页,当前为第1页。java语言与面向对象程序设计形考4-0001 java...
一个多用户聊天软件 采用java实现 socket编程 实现了服务器端和客户端
MakeJPEG.java 4.5. 课程设计作业 第5章 标准化考试系统 (单机版) 5.1. 设计内容 5.2. 设计要求 5.3. 总体设计 5.4. 具体设计 5.4.1. 运行效果与程序发布 5.4.2. 主类EnglishTest 5.4.3....
java课程设计,基于UDP协议的局域网聊天程序,可以实现多人聊天,一对一私聊等功能,有重复用户名检测功能。有用户列表,上下线提醒,在线人数显示等。