网络协议 TCP 和 UDP 快来打我* 2022-06-17 02:47 238阅读 0赞 ## TCP 和 UDP 的概念 ## **IP 和端口** **IP**:是每台主机所对应的唯一标识,通过 IP 来区分网络中的不同主机。 **端口**:同一台主机中,不同的应用程序的唯一标识,通过端口来区分同一台主机中的不同应用程序。 **Socket** 1. Socket 通常称为“套接字”,用于描述 IP 地址和端口的,是一个通信链的句柄,在 Internet 上的主机一般运行了多个服务软件,同时提供多种服务,每种服务都打开一个 Socket,并绑定到一个端口上,不同的端口对应于不同的服务软件。 2. 应用程序通过“套接字”向网络发出请求或者响应请求。Socket 和 ServerSocket 类位于 java.net 包中,ServerSocket 用于服务端,Socket 是用于建立网络连接时使用的。连接成功时,应用程序两端都会产生一个 Socket 实例,通过操作这个实例从而完成会话。 **TCP** TCP(Transmission Control Protocol,传输控制协议) 是**面向连接**的传输层协议,所谓的“连接”是指客户端与服务器端进行数据传输之前必须先建立连接,也就是我们经常听到的 TCP 协议中的“三次握手”的概念(相对应的有四次挥手的概念)。 可以这么理解“**三次握手**”: 1. 第一次握手,客户端对服务器端说:”我要向你发送数据,可以吗?”; 2. 第二次握手,服务器对客户端说:“可以,你什么时候给我发送数据?”; 3. 第三次握手,客户端对服务器端说:“我现在就向你发送数据”; 数据发送中…… 数据发送完成后就需要有一个断开连接的过程,这时就有一个“**四次挥手**”的概念。 1. 第一次挥手,客户端对服务器端说:“数据发送完了,我要断开连接可以吗?”; 2. 第二次挥手,服务器对客户端说:“数据我还没有接收完,你等我通知后再断开连接”; 3. 第三次挥手,服务器对客户端说:”数据接收完了,你可以断开连接了“; 4. 第四次挥手:客户端对服务器端说:“好的,我现在就断开连接”; 断开连接…… **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 的特点 ## 1. TCP 是面向连接的,UDP 是面向非连接的; 2. TCP 传输数据的完整性、准确性较高,UDP 传输数据的速率、及时性较好; 3. TCP 协议在具体的代码实现过程中是通过 Soket 对象来进行连接,然后从对象中读取输入流和输出流,在流中进行通信,而 UDP 是通过将数据封装成 DatagramPacket 包来进行通信,其中包中装有要发送到的地址; 4. TCP、UDP 都是传输层协议;
还没有评论,来说两句吧...