网络编程_基于UDP的Socket编程_基本操作

Socket是传输层给应用层打开的一个小口,我们把它称之为插座,也叫套接字。
传输层有两个协议TCP、UDP。

基于UDP协议的编程的特点是非面向连接,不安全,数据可能存在丢包,同时这个数据的大小是有限制的,一般来说这个大小不超过60k。很早之前的发短信如果比较长,收到的信息会分成好几条,可能后面的先到,前面的还没来。所以UDP协议我们操作的时候不能太大,如果太大那就分开来发。虽然有这些特点,但它比较高效,因为它不用面向连接,只管往外发,对方只管收就是了。
UDP有一个非常重要的事项就是一切以包裹为中心,比如说现实中快递员将包裹送到我们手上,但是快递员自己是不记地址的,他只看包裹,包裹上的地址写的是哪,他就送过去哪,如果地址写错了或者这个人不存在,那这个包裹就不能正确的到达我们手上,那这个叫丢包了。那我们这里也是一样,在我们发送或者接收的时候一切以包裹为中心,这个我们叫数据包,发送的时候将数据封装成包裹,包裹上写好目的地的地址,接收方准备好包裹接收数据就好了。底层所有的操作都是字节,因此多个数据要用字节数组,我们数据包操作的是字节数组。
既然有了数据包了,我们就不需要用IO流来实现数据的传输了。这里说的是传输不再用IO流。
网络编程_基于UDP的Socket编程_基本操作
网络编程_基于UDP的Socket编程_基本操作
网络编程_基于UDP的Socket编程_基本操作
网络编程_基于UDP的Socket编程_基本操作
网络编程_基于UDP的Socket编程_基本操作
网络编程_基于UDP的Socket编程_基本操作

package com.sxt.udp;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;

/**
 * 基本流程: 发送端
 * 1、使用DatagramSocket  指定端口 创建发送端
 * 2、准备数据 一定转成字节数组
 * 3、 封装成DatagramPacket 包裹,需要指定目的地(地址+端口)
 * 4、发送包裹send​(DatagramPacket p) * 
 * 5、释放资源
 * @author 
 *
 */
public class UdpClient {

	public static void main(String[] args) throws Exception {
		System.out.println("发送方启动中.....");
		 // 1、使用DatagramSocket  指定端口 创建发送端
		DatagramSocket client =new DatagramSocket(8888);
		 //2、准备数据 一定转成字节数组
		String data = "上海尚学堂";
		byte[] datas = data.getBytes();
		 //3、 封装成DatagramPacket 包裹,需要指定目的地
		DatagramPacket packet =new DatagramPacket(datas,0,datas.length,
				new InetSocketAddress("localhost",6666));
		//4、发送包裹send​(DatagramPacket p) * 
		client.send(packet);
		// 5、释放资源
		client.close();
	}
}



package com.sxt.udp;

import java.net.DatagramPacket;
import java.net.DatagramSocket;

/**
 * 基本流程: 接收端
 * Address already in use: Cannot bind  同一个协议下端口不允许冲突
 * 1、使用DatagramSocket  指定端口 创建接收端
 * 2、准备容器 封装成DatagramPacket 包裹
 * 3、阻塞式接收包裹receive​(DatagramPacket p)
 * 4、分析数据
 *    byte[]  getData​()
 *                getLength​()
 * 5、释放资源
 * @author 
 *
 */
public class UdpServer {

	public static void main(String[] args) throws Exception {
		System.out.println("接收方启动中.....");
		// 1、使用DatagramSocket  指定端口 创建接收端
		DatagramSocket server =new DatagramSocket(6666);
		// 2、准备容器 封装成DatagramPacket 包裹
		byte[] container =new byte[1024*60];
		DatagramPacket packet = new DatagramPacket(container,0,container.length);
		// 3、阻塞式接收包裹receive​(DatagramPacket p)
		server.receive(packet); //阻塞式
		// 4、分析数据
		//    byte[]  getData​()
		//                getLength​()
		 byte[]  datas =packet.getData();
		 int len = packet.getLength();
		 System.out.println(new String(datas,0,len));
		 
		// 5、释放资源
		 server.close();
	}
}