网络协议 TCP 和 UDP

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qhj1610/article/details/70170368

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 都是传输层协议;
展开阅读全文

没有更多推荐了,返回首页