TCP 和 UDP 的概念
IP 和端口
IP:是每台主机所对应的唯一标识,通过 IP 来区分网络中的不同主机。
端口:同一台主机中,不同的应用程序的唯一标识,通过端口来区分同一台主机中的不同应用程序。
Socket
Socket 通常称为“套接字”,用于描述 IP 地址和端口的,是一个通信链的句柄,在 Internet 上的主机一般运行了多个服务软件,同时提供多种服务,每种服务都打开一个 Socket,并绑定到一个端口上,不同的端口对应于不同的服务软件。
应用程序通过“套接字”向网络发出请求或者响应请求。Socket 和 ServerSocket 类位于 java.net 包中,ServerSocket 用于服务端,Socket 是用于建立网络连接时使用的。连接成功时,应用程序两端都会产生一个 Socket 实例,通过操作这个实例从而完成会话。
TCP
TCP(Transmission Control Protocol,传输控制协议) 是面向连接的传输层协议,所谓的“连接”是指客户端与服务器端进行数据传输之前必须先建立连接,也就是我们经常听到的 TCP 协议中的“三次握手”的概念(相对应的有四次挥手的概念)。
可以这么理解“三次握手”:
- 第一次握手,客户端对服务器端说:”我要向你发送数据,可以吗?”;
- 第二次握手,服务器对客户端说:“可以,你什么时候给我发送数据?”;
-
第三次握手,客户端对服务器端说:“我现在就向你发送数据”;
数据发送中……
数据发送完成后就需要有一个断开连接的过程,这时就有一个“四次挥手”的概念。
- 第一次挥手,客户端对服务器端说:“数据发送完了,我要断开连接可以吗?”;
- 第二次挥手,服务器对客户端说:“数据我还没有接收完,你等我通知后再断开连接”;
- 第三次挥手,服务器对客户端说:”数据接收完了,你可以断开连接了“;
- 第四次挥手:客户端对服务器端说:“好的,我现在就断开连接”;
断开连接……
UDP
UDP (User Data Protocal,用户数据报协议)是面向非连接的传输层协议,也就是说基于 UDP 协议通信的过程中是不需要事先进行连接的,它会将通信的数据打包成若干个包,然后将这些包直接从客户端发送给服务端,由于不需要事先进行连接,所以传输数据的准确性、完整性等都不如 TCP 协议,但是其传输效率高,适合及时通讯,比如 QQ 就是采用的 UDP 协议。
TCP 与 UDP 协议通信时的具体编码
TCP
创建客户端连接代码如下:
class Client{
//定义客户端 socket
private Socket socket;
//创建构造方法初始化,socket 创建的同时就会建立连接,如果连接异常就会抛异常
public Client(){
try{
socket = new Socket("localhost",8088);
}catch(Exception e){
e.printStackTrace();
}
}
//客户端工作方法
public void start(){
try{
OutputStream out = socket.getOutputStream();
OutputStreamWriter osw =
new OutputStreamWriter(out,"utf-8");
PrintWriter pw = new PrintWriter(osw,true);
pw.println("你好!服务器");
}catch(Exception e){
e.printStackTrace();
}finally{
if(socket != null){
try{
socket.close();
}catch(Exception e){
e.printTrankTrace();
}
}
}
}
//客户端的 main 方法
public static void main(String[] args){
Client client = new Client();
client.start();
}
}
UDP
创建客户端代码如下:
public class Client{
try{
private void start(){
//创建客户端与服务端连接的桥梁 DatagramSocket
DatagramSocket client = new DatagramSocket();
String str = "hello! I'm Client";
byte[] sendBuff = str.getBytes();
//获取数据包对象的目标地址
InetAddress addr = InetAddress.getByName("127.0.0.1");
//端口号
int port = 8088;
//构建发送数据包对象
DatagramPacket sendPacket = new DatagramPacket(sendBuff,sendBuff.lenth,addr,port);
//发送数据包
clent.send(sendPacket);
//接收数据
Byte[] rece = new Byte[100];
//构建接收数据包对象,将数据包中 length 长度的数据装进 rece 数组
DatagramPacket recePacket =
new DataPacket(rece,rece.length);
//接收数据包中的数据到 recePacket 中, receive 会“阻塞”
client.receive(recePacket);
String recStr = new String(recePacket.getData(),0,recePacket.getLength());
System.out.prinln("服务端说:"+recStr);
client.close();
}
}catch(Exception e){
e.printStackTrace();
}
public static void main(String[] args){
Client client = new Client();
client.start();
}
}
TCP 和 UDP 的特点
- TCP 是面向连接的,UDP 是面向非连接的;
- TCP 传输数据的完整性、准确性较高,UDP 传输数据的速率、及时性较好;
- TCP 协议在具体的代码实现过程中是通过 Soket 对象来进行连接,然后从对象中读取输入流和输出流,在流中进行通信,而 UDP 是通过将数据封装成 DatagramPacket 包来进行通信,其中包中装有要发送到的地址;
- TCP、UDP 都是传输层协议;