网络编程——UDP协议
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------UDP传输:
发送端和接收端是两个独立运行的程序,
两者谁先启动,有没有启动都无所谓,
因为不需要建立连接,在我看来就像一厢情愿似的。
既然这样也就可以用在多线程里面,而且不用同步。
Socket:
Socket就是为网络服务提供的一种机制。
通信的两端都有Socket
网络通信其实就是Socket间的通信
数据在两个Socket间通过IO传输
DatagramSocket类:数据包套接字类
既能发送数据包又能接收数据包
构造方法:
DatagramSocket();//创建数据包套接字对象并随机绑定到本机上一个可用端口上,建议发送端使用
DatagramSocket(int port);//创建数据包套接字对象并绑定到本机指定端口上,建议接收端使用
常用方法:
close();//关闭socket服务
send(DatagramPacket dp);//发送数据包对象
receive(DatagramPacket dp);//用数据包对象接收数据,阻塞式方法
DatagramPacket类:数据包类
构造方法:
DatagramPacket(byte[] buf,int length);//用于接收的数据包对象
DatagramPacket(byte[] buf,intlength,InetAddress address,int port);//用于发送的数据包对象
常用方法:
StringgetData();//获取具体数据内容
InetAddress getAddress();//获取发送方的IP地址对象
intgetPort();//获取发送方的端口号
UDP发送端的建立步骤:
1、创建UDP的socket服务,使用到DatagramSocket类的构造方法
2、创建数据包对象,将数据的内容、接收方的IP地址对象和端口号封装进去,
使用DatagramPacket类的构造方法
3、通过socket服务将数据包发送出去
4、关闭socket服务
下面代码是给本机发送数据,
因为IP地址对象里面封装的IP地址是本机的IP地址192.168.0.100,
若是改成192.168.0.255就变成广播了,
就是给所有192.168.0.1~192.168.0.254的IP地址发送数据。
192.168.0.0是不能使用为IP地址的,它表示的是192.168.0.xxx这个IP地址号段。
示例:
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class UDPSendDemo_1 {
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
System.out.println("发送端开启");
//1、创建UDP的socket服务,使用到DatagramSocket类的构造方法
DatagramSocket ds=new DatagramSocket();
/*
* 2、创建数据包对象,将数据内容、接收方的IP地址对象和端口号封装进去,
* 使用DatagramPacket类的构造方法
*/
String s="UDP发送端来了。。。。。";
byte[] buf=s.getBytes();
DatagramPacket dp=
new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.0.100"),10000);
//3、通过socket服务将数据包发送出去
ds.send(dp);
//4、关闭socket服务
ds.close();
}
}
UDP接收端的建立步骤:
1、创建UDP的socket服务,使用DatagramSocket类的构造方法,注意要指定好端口号
2、创建数据包对象,将字节数组封装进去,用于接收传来的数据,使用DatagramPacket类的构造方法
3、通过socket服务将数据接收到数据包对象里
4、数据包对象对数据进行解析,获取包括具体数据内容,发送方的IP地址对象和端口号等信息
5、关闭socket服务
示例:
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class UDPReceDemo_1 {
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
System.out.println("接收端开启");
//1、创建UDP的socket服务,使用DatagramSocket类的构造方法,注意要指定好端口号
DatagramSocket ds=new DatagramSocket(10000);
//2、创建数据包对象,将字节数组封装进去,用于接收传来的数据,使用DatagramPacket类的构造方法
byte[] buf=new byte[1024];
DatagramPacket dp=new DatagramPacket(buf,buf.length);
//3、使用socket服务将数据接收到数据包对象里
ds.receive(dp);//阻塞式方法,如果没有内容发来则一直等待。
//4、数据包对象对数据进行解析,获取包括具体数据内容,发送方的IP地址对象和端口号等信息
//获取具体数据内容
byte[] strBuf=dp.getData();
String s=new String(strBuf,0,dp.getLength());
//获取ip地址对象,然后调用getHostAddress方法获取ip地址
String ip=dp.getAddress().getHostAddress();
//获取发送方的端口号
int port=dp.getPort();
System.out.println(ip+":"+port+":"+s);
//5、关闭socket服务
ds.close();
}
}
先开启接收端,在开启发送端,两个代码运行结果如下图
发送端方面:
接收端方面: