Java之------socket系列(二)UDP

☆ UDP:

将数据及源和目的封装成数据包中,不需要建立连接
每个数据报的大小在限制在64k内
因无连接,是不可靠协议
不需要建立连接,速度快

DatagramSocket和
DatagramPacket类

UDP传输:

DatagramSocket与DatagramPacket
建立发送端,接收端。
建立数据包。
调用Socket的发送接收方法。
关闭Socket。

发送端与接收端是两个独立的运行程序。

UDP传输编程:

☆发送端

在发送端,要在数据包对象中明确目的地IP及端口。

DatagramSocket ds = new DatagramSocket();
byte[] by = “hello,udp”.getBytes();
DatagramPacket dp = new DatagramPacket(by,0,by.length,
	InetAddress.getByName(“127.0.0.1”),10000);
ds.send(dp);
ds.close();
☆接收端

在接收端,要指定监听的端口。

DatagramSocket ds = new DatagramSocket(10000);
byte[] by = new byte[1024];
DatagramPacket dp = new DatagramPacket(by,by.length);
ds.receive(dp);
String str = new String(dp.getData(),0,dp.getLength());
System.out.println(str+"--"+dp.getAddress());
ds.close();
示例:

发送方:

package cn.hncu.url.udp;

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.InputStream;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;

public class SendDemo {

	public static void main(String[] args) {
		try {
//			send1();//这个方法演示的是发送小数据
			send2();//这个方法演示的是发送较大数据
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	private static void send2() throws Exception {
		//for sending larger packet
		DatagramSocket ds=new DatagramSocket(10000);//这里指定端口号10000,各程序上的端口号都是唯一的,一个程序中要新建多个DatagramSocket需要使用不同的端口号
		InputStream in=new FileInputStream("file.txt");
		BufferedInputStream bis=new BufferedInputStream(in);
		byte buf[]=new byte[1024];
		buf[0]=0;
		int len=0;
		while ((len=bis.read(buf, 1, buf.length-1))!=-1){//这里我把数组第一位留出来作为判断文件是否读取完毕的标记
			if (len<1023){
				buf[0]=1;//文件读取完毕后位置0设为1,这样做是为了接收方的关闭动作,若不这样做的话不管是否读取完接收                                //方会一直开着
			}
			DatagramPacket dp=new DatagramPacket(buf, buf.length, InetAddress.getByName("xxx.xxx.xxx.xxx"), 10001);
                        //上一行的ip地址我用xxx.xxx.xxx.xxx表示,运行程序时记得改成你自己的ip地址,下同
			ds.send(dp);
		}
		ds.close();
	}

	private static void send1() throws Exception {
		//for sending less packet
		DatagramSocket ds=new DatagramSocket(10000);
		String str="你知道吗,god is a girl";
		byte buf[]=str.getBytes("utf-8");
		//DatagramPacket类中,有ip地址的构造方法是用来创建发送数据包的
		DatagramPacket dp=new DatagramPacket(buf, buf.length, InetAddress.getByName("xxx.xxx.xxx.xxx"),10001);//注意,IP和端口都是接收方的
		ds.send(dp);
		ds.close();
	}
}
接收方:

package cn.hncu.url.udp;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;

public class ReceiveDemo {

	public static void main(String[] args) {
		try {
//			receive1();//接收小数据
			receive2();//接收较大数据
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	private static void receive2() throws Exception {
		//for receiving larger packet
		DatagramSocket ds=new DatagramSocket(10001);
		byte buf[]=new byte[1024];
		DatagramPacket dp=new DatagramPacket(buf, buf.length);
		while (true){
			ds.receive(dp);
			
			//从dp中解析出我们想要的信息
			//获取ip
			byte data[]=dp.getData();
			String info=new String(data,1,data.length-1);
			System.out.println(info);
			if (data[0]==1){
				ds.close();
			}
		}
		
	}
	
	private static void receive1() throws Exception {
		//for receiving less packet
		DatagramSocket ds=new DatagramSocket(10001);
		byte buf[]=new byte[1024];
		//DatagramPacket类中,没有ip地址的构造方法是用来创建接收数据包的
		DatagramPacket dp=new DatagramPacket(buf, buf.length);
		ds.receive(dp);
		
		//从dp中解析出我们想要的信息
		//获取ip
		String ip=dp.getAddress().getHostAddress();
		int port=dp.getPort();
		byte data[]=dp.getData();
		String info=new String(data);
		System.out.println(ip+":"+port+"----"+info);
	}
}


你可能感兴趣的:(java,socket,UDP)