TCP与UDP的区别和各自的使用场景
TCP: 传输控制协议
TCP是面向连接的,可靠的传输协议
面向连接:在传输数据之前,必须要先在两个程序之间建立连接
在数据传输的时候,必须要保证对方收到了数据,在已连接的前提下才能进行数据传输
数据传输结束之后,要断开连接
面向连接就类似于打电话
使用TCP进行数据传输:
新建服务端类:
public class Sever {
public static void main(String[] args) throws Exception {
//创建服务端套接字 10011为端口号,端口号可自定义,连接时客户端端口号必须与服务端一致
ServerSocket sever = new ServerSocket(10011);
System.out.println("服务端已启动");
//等待接收客户端
Socket socket = sever.accept();
System.out.println(socket + "已连接----------");
// 从客户端套接字获得输出流
OutputStream os=socket.getOutputStream();
// 将输出流包装成字符流
OutputStreamWriter osw=new OutputStreamWriter(os);
// 将字符流包装成缓冲流
BufferedWriter bw=new BufferedWriter(osw);
// 写入数据
bw.write("欢迎光临\n");
// 强制输出,避免数据阻塞
bw.flush();
}
}
新建客户端类
public class Chat {
public static void main(String[] args) throws Exception {
// 创建客户端套接字 Localhost为本机地址 由于是在同一台计算机进行传输所以使用 Localhost
// 如果是多台计算机进行传输则需要填写服务端IP地址 如:172.20.168.1
Socket socket = new Socket("Localhost", 10011);
// 从客户端套接字获得输入流
InputStream is=socket.getInputStream();
// 将输出流包装成字符流
InputStreamReader isr=new InputStreamReader(is);
// 将字符流包装成缓冲流
BufferedReader br=new BufferedReader(isr);
// 读取缓冲流数据
System.out.println("客户端收到:"+br.readLine());
}
}
运行测试:(需要先运行服务端)
服务端:
客户端:
优点:可靠,如果连接失败则无法进行传输,所以能保证对方一定可以收到数据
缺点:占用的资源多 相较于UDP需要先创建连接
*
UDP: 用户数据报协议
无连接的,不可靠的传输协议
无连接:传输数据的时候,不需要建立连接
不可靠:不保证对方一定会收到数据
类似于发短信
使用UDP进行数据传输:
新建服务端
public class MyServer {
public static void main(String[] args) throws Exception {
//创建服务端端口地址
InetSocketAddress server = new InetSocketAddress(10088);
//接受数据的socket
DatagramSocket socket = new DatagramSocket(server);
//准备一个接受数据的UDP数据报,默认是一个空的报文
byte[] data = new byte[1024];
DatagramPacket packet = new DatagramPacket(data,0,data.length);
while(true) {
//开始等待并接受数据
socket.receive(packet);
//处理数据
byte[] bs = packet.getData();
//接受到的字节长度
int len = packet.getLength();
//将数组转换成字符串
String msg = new String(bs, 0, len);
System.out.println(msg);
}
}
}
}
新建客户端
public class MyClient {
public static void main(String[] args) throws Exception{
//客户端地址
InetSocketAddress client = new InetSocketAddress(10086);
//服务端地址
InetSocketAddress server = new InetSocketAddress("localhost",10088);
//UDP套接字对象
DatagramSocket socket = new DatagramSocket(client);
Scanner sc = new Scanner(System.in);
while(true) {
//UDP数据报
String msg = sc.nextLine();
//将数据转换成字节数组
byte[] data = msg.getBytes();
//将数据封装成数据报
//参数1:数据
//参数2: 起始位置
//参数3:要发送的字节个数
//参数4:接收方地址
DatagramPacket packet = new DatagramPacket(data, 0, data.length, server);
//发送数据
socket.send(packet);
}
}
}
运行测试:
客户端:
服务端:
UDP的不可靠性测试:
服务端关闭状态:
客户端:
客户端依然向服务端发送数据,但服务端并未接收
优点:占用资源少,相对于TCP不需要建立连接
缺点:相对于TCP不可靠
使用场景
因此TCP传输适用于重要文件的传输,如视频文件,图片,音频等
UDP适用于快速,即时文件的传输,如在线讯息 QQ微信消息等