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