网络编程中udp传输协议

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的使用和线程的创建。

猜你喜欢

转载自blog.csdn.net/u011638706/article/details/40399433
今日推荐