TCP和UDP的区别:
TCP:有连接,可靠传输,面向字节流,全双工;
UDP:无连接,不可靠传输,面向数据报,全双工;
有连接/无连接:
此处的连接是"抽象"的连接:
通信双方如果保存了通信对端的信息,就相当于是"有连接";
如果不保存对端的信息,就是"无连接";
可靠传输/不可靠传输:
此处谈到的可靠,不是100%到达对方,而是"尽可能";
网络环境非常复杂,存在很多不确定因素.
TCP内置了一些机制能保证可靠传输:
(1)感知对方是不是收到了数据;
(2)重传机制,在对方没收到的时候进行重试;
UDP则没有可靠性机制,完全不管发出去的数据是否能顺利到达对方;
面向字节流/面向数据报:
TCP是面向字节流的,TCP的传输过程就和文件流/水流是一样的特点;
UDP传输数据的基本单位不是字节,而是"UDP数据报",一次发送/接受,必须发送/接受完整的数据报.
全双工/半双工:
全双工:一个通信链路,可以发送数据,也可以接受数据(双向通信);
半双工:一个通信链路,只能发送/只能接受(单向通信);
TCP/UDP api的使用
UDP
DatagramSocket
代表一个socket对象(操作系统中的概念);
socket可以认为是操作系统中广义的文件下里面的一种文件类型;
这样的文件,就是网卡这种硬件设备,抽象的表示方式;
(使程序员不必去关注硬件的差异和细节,直接操作socket对象,就能间接操作网卡)
构造方法:
DatagramSocekt方法:
DatagramPacket
代表一个UDP数据报(UDP传入传出数据的基本单位).
构造方法:
DatagramPacket方法:
写一个最简单的客户端服务器程序,不涉及到业务流程,只是对api的用法做演示.
"回显服务器"(echo server):客户端发啥样的请求,服务器就返回怎么样的响应.
没有任何业务逻辑,没有任何计算和处理.
InetSocketAddress
构造UDP发送的数据报时,需要传⼊ SocketAddress ,该对象可以使⽤ InetSocketAddress
来创建.
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class UDPEchoServer {
private DatagramSocket socket = null;
public UDPEchoServer(int port) throws SocketException {
//服务器必须指定端口号,这样客户端才能找到服务器
socket = new DatagramSocket(port);
//在调用这个构造方法的过程中,jvm就会调用系统的socket api完成"端口号-进程"之间的关联动作.
//"绑定端口号"bind.
//对应一个系统来说,同一时刻,一个端口号只能被一个进程绑定,但是一个进程可以绑定多个端口号.
//端口号就是为了区分进程,收到数据之后,明确说这个数据要给谁.
//如果有多个进程尝试绑定同一个端口号,后来的进程就会绑定失败.
//对于服务器一端来说,需要在socket对象创建的时候,就指定一个端口号,作为构造方法的参数.
//后续服务器开始运行之后,操作系统,就会把端口号和该进程关联起来.
}
//通过start启动