UDP传输协议
1、特点:
将数据及源和目的封装成数据包中,不需要建立连接,速度快,每个数据包的大小限制在64k内,不可靠的协议
2、需求:定义一个应用程序,用于接受udp协议传输的数据并处理。
思路:
(1)定义udpsocket服务.通常会监听一个端口。其实就是给这个接收网络应用程序定义数字标示。
方便于明确哪些数据过来该应用程序可以处理。
(2)定义一个数据包,因为要存储接收到的字节数据。
因为数据包对象中有更多功能可以提取字节数据中的不同数据信息。
(3)通过socket服务的recive方法将收到的数据存入已定义好的数据包中
(4)通过数据包对象的特有功能,将这些不同的数据取出。打印在控制台上
(5)关闭资源
代码实现:
class UdpRece
{
public static void main(String[] args) throws Exception
{
//1,创建udp socket,建立端点
DatagramSocket ds=new DatagramSocket(10002);
//2,定义数据包,用于存储数据
byte[] buf=new byte[1024];
DatagramPacket dp=new DatagramPacket(buf,buf.length);
//3,通过服务的receive方法将收到的数据存入数据包中
ds.receive(dp);
//4,通过数据包的方式获取其中的数据。
String ip=dp.getAddress().getHostAddress();
String data=new String(dp.getData(),0,dp.getLength());
int port=dp.getPort();
System.out.println(ip+"::"+data+"::"+port);
//5,关闭资源
//ds.close();
}
}
3、需求:通过udp传输方式,将一段文字数据发送出去;
思路:
(1)建立udpsocket服务
(2)提供数据,并将数据封装到数据包中
(3)通过socket服务的发送功能,将数据包发出去
(4)关闭资源
代码实现:
class UdpSend {
public static void main(String[] args) throws Exception
{
//1,创建udp服务,通过DAtagramSocket对象
DatagramSocket ds=new DatagramSocket();
//2,确定数据,并封装成数据包,DatagramPacket(byte[] buf, int length, InetAddress address, int port)
byte[] buf="udp ge men lai la".getBytes();
DatagramPacket dp=new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.1.104"),10002);
//3,通过socket服务,将已有的数据包发送出去,通过send方法
ds.send(dp);
//4,关闭资源
ds.close();
}
}
4、应用udp协议,编写一个聊天程序
思路:
(1)有收数据的部分,和发数据的部分,这二部分需要同时执行, 那就需要用到多线程技术。
(2)一个线程控制收,一个线程控制发。因为收和发动作是不一致的,所以要定义二个run方法
而且这二个方法要封装到不同的类中
(3)聊天需要从控制台输入数据,所以用到IO流中的读操作BufferedReader
代码实现:
class Send implements Runnable//发送端,发送数据
{
private DatagramSocket ds;
public Send(DatagramSocket ds) //Send构造方法
{
this.ds=ds;
}
public void run() { //启动线程,发送数据
try{
//创建带缓冲区输入流对象
BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));
String line=null;
while((line=bufr.readLine())!=null)//从控制台循环读取数据
{ if("886".equals(line)) break;
byte[] buf=line.getBytes();
//创建DatagramPacket对象dp,确定数据,并封装成包
DatagramPacket dp=new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.1.255"),10002);
ds.send(dp);//通过socket服务,将已有的数据包发送出去,通过send方法
}
}
catch(Exception e)//抛出异常
{
throw new RuntimeException("发送端失败");
}
}
}
class Rece implements Runnable //接收端,接收数据
{ private DatagramSocket ds;
public Rece(DatagramSocket ds)
{
this.ds=ds;
}
public void run() {
try {
while(true)
{ byte[] buf=new byte[1024]; //创建字节数组对象
DatagramPacket dp=new DatagramPacket(buf,buf.length);//定义数据包用于存储数据
ds.receive(dp);//通过服务的receive方法将收到的数据存入数据包中
String ip=dp.getAddress().getHostAddress();//获取ip地址
String data=new String(dp.getData(),0,dp.getLength());
System.out.println(ip+":"+data);
}
}
catch(Exception e)
{
throw new RuntimeException("接收端失败");
}
}
}
public class chatDemo
{public static void main(String[] args) throws Exception
{//构造数据报套接字并将其绑定到本地主机上任何可用的端口。
DatagramSocket sendSocket =new DatagramSocket();
// 创建数据报套接字并将其绑定到本地主机上的指定端口。
DatagramSocket receSocket =new DatagramSocket(10002);
//创建一个发送线程,并启动
new Thread(new Send(sendSocket)).start();
//创建一个接收线程,并启动
new Thread(new Rece(receSocket)).start();
}
}
5、总结
通过udp传输协议学习,首先明白了udp传输协议的特点:将数据及源和目的封装成数据包中,不需要建立连接,速度快,每个数据包的大小限制在64k内,不可靠的协议。通过代码练习,学会建立udpsocket服务,并能发送和接收数据。同时,复习了IO流中读取流对象BufferedReader的使用和线程的创建。