UDP--发送、接收

UDP发送:

    需求:通过udp传输方式,将一段文字数据发送出去。

    思路:

        1、建立udpsocket服务

        2、提供数据,并将数据封装到数据包中

        3、通过socket服务的发送功能,将数据包发送出去。

        4、关闭资源。

    DatagramSocket:此类表示用来发送和接收数据报包的套接字。在 DatagramSocket 上总是启用 UDP 广播发送。

    DatagramPacket:此类表示数据报包。数据报包用来实现无连接包投递服务。每条报文仅根据该包中包含的信息从一台机器路由到另一台机器。从一台机器发送到另一台机器的多个包可能选择不同的路由,也可能按不同的顺序到达。不对包投递做出保证。


    udp发送端代码:

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;

public class UDPSend {

	public static void main(String[] args) throws IOException {
		//1、创建udp服务,通过DategramSocket对象;
		DatagramSocket ds=new DatagramSocket();
		
		//2、确定数据,并封装数据到数据包.DatagramPacket(byte[] buf, int length, InetAddress address, int port) DatagramPacket(byte[] buf, int length, InetAddress address, int port) 
		String string="udp data comes";
		byte[] buf=string.getBytes();//getBytes(): 使用平台的默认字符集将字符串编码为 byte 序列,并将结果存储到一个新的 byte 数组中。
		DatagramPacket dp=new DatagramPacket(buf, buf.length, InetAddress.getByName("10.1.9.34"),10000);
	
		//3、通过socket服务,将已有的数据报发送出去,通过send方法。
		ds.send(dp);
		
		//4、关闭资源
		ds.close();
	}
}


udp接收端

    需求:定义一个应用程序,用于接收数据并处理

    思路:

        1、定义udpsocket服务,通常会监听一个端口,其实就是给这个接收网络应用程序定义一个数字标识,方便于明确哪些数据过来该应用程序可以处理;

        2、定义一个数据包,因为要存储接收到的字节数据,因为数据包对象中有更多功能可以提前字节数据中的不同数据信息。

        3、通过socket服务的recieve方法将收到的数据存入一定义好的数据包中;

        4、通过数据包对象的特有功能,将这些不同的数据取出,打印在控制台上;

        5、关闭资源。


 udp发送端代码:

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

public class UdpRecive {

	public static void main(String[] args) throws IOException {
		//1、创建udpsocket服务,建立端点
		DatagramSocket ds=new DatagramSocket(10000);
		
		//2、定义一个数据包,用于存储数据。DatagramPacket(byte[] buf, int length) 
		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();
	}
}

        运行结果:

UDP--发送、接收_第1张图片

    数据是从56375端口发送出去的,发送到10000这个接口,因为发送端端口自己没有指定,是系统随机分配的


UDP键盘录入数据

    发送端:   

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;

public class UDPSend2 {

	public static void main(String[] args) throws UnknownHostException, IOException {
		DatagramSocket ds=new DatagramSocket();
		
		BufferedReader buff=new BufferedReader(new InputStreamReader(System.in));
		
		String line=null;
		while((line=buff.readLine())!=null){
			if("886".equals(line)){
				break;
			}
			byte[] buf=line.getBytes();
			
			DatagramPacket dp=new DatagramPacket(buf, buf.length,InetAddress.getByName("10.1.9.34"),10000);
			ds.send(dp);
		}
		ds.close();
 	}
}

     接收端:

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

public class UDPRecive2 {

	public static void main(String[] args) throws IOException {
		DatagramSocket ds=new DatagramSocket(10000);
		
		while(true){
			byte[] buf=new byte[1024];
			DatagramPacket dp=new DatagramPacket(buf, buf.length);
			
			ds.receive(dp);
			
			String ip=dp.getAddress().getHostAddress();
			String data=new String(dp.getData(),0,dp.getLength());
			
			System.out.println(ip+"::"+data);
		}
	}
}

先运行接收端,在运行发送端:

    结果如下:

UDP--发送、接收_第2张图片UDP--发送、接收_第3张图片

这种通信是点对点的通信,如果需要同一网段的所有人都收到,可通过发送广播地址。比如把上述地址改为:10.1.9.255


你可能感兴趣的:(java基础,网络编程)