zoukankan      html  css  js  c++  java
  • Socet

    一、什么是Socket

      Socket就是为了网络服务提供的一种机制;

      通讯的两端都有Socket;

      网络通讯其实就是Socket间的通讯;

      数据在两个Socket间通过10传输

    二、TCP与UDP造概念上的区别

      1、UDP:

        (1)是面向无连接,将数据及源的封装成数据包中,不需要建立连接

        (2)每个数据报的大小在限制64k内

        (3)因无连接,是不可靠协议

        (4)不需要建立连接,速度快

      2、TCP:

        (1)建议连接,形成传输数据的通道

        (2)在连接中进行大数据量传输,以字节流方式

        (3)通过三次握手完成连接,是可靠协议

        (4)必须建议连接m效率会稍低

    三、UDP协议

      1、UDP协议服务端代码

    复制代码
    package com.socket.UDP;
    
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    
    /**
     * UDP协议的服务端
     */
    public class UDPServer {
        public static void main(String[] args) throws Exception {
            System.out.println("UDP服务端启动==========================");
            //创建一个连接,没有传入IP地址就是本机 127.0.0.1
            DatagramSocket socket=new DatagramSocket(8080);
    
            //接收客户端传递的数据
            byte[] bytes=new byte[1024];
            DatagramPacket packet=new DatagramPacket(bytes,bytes.length);
    
            //等待客户端发送数据包,如果客户端没有建立的情况下,那么会堵塞
            socket.receive(packet);
    
            //获取来源的IP和端口
            System.out.println("IP地址:"+packet.getAddress()+"	端口:"+packet.getPort());
            //接受数据
            String str=new String(packet.getData(),0,packet.getLength());
            System.out.println("客户端发送过来的数据:"+str);
        }
    }
    复制代码

      2、UDP协议客户端代码

    复制代码
    package com.socket.UDP;
    
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;
    import java.util.Scanner;
    
    /**
     * UDP协议的客户端
     */
    public class UDPClient {
        public static void main(String[] args) throws Exception {
            System.out.println("UDP客户端启动成功~");
            //创建Scoket对象
            DatagramSocket socket=new DatagramSocket();
            Scanner scanner=new Scanner(System.in);
            System.out.println("请输入传输内容:");
            String str=scanner.next();
    
            //创建数据包
            DatagramPacket packet=new DatagramPacket(str.getBytes(),str.getBytes().length,InetAddress.getByName("192.168.60.29"),8080);
    
            //发送数据包
            socket.send(packet);
    
            //关闭
            socket.close();
        }
    }
    复制代码

      3、效果如下

        (1)首先启动服务端

          

         (2)启动客户端并发送请求

          

         (3)服务端接收客户端请求

          

     四、TCP协议

      1、TCP握手协议

        在TCP/IP协议中,TCP协议采用三次握手建立一个连接。

        第一次握手:建立连接时,客户端发送SYM包(SYM=J)到服务器,并进入  SYM_SEND状态,等待服务器确认

        第二次握手:服务器收到SYM包,必须确认客户的SYM(ACK=J+1),同时自己也发送一个SYM包(SYM=K),即SYM+ACK包,此时服务器V状态

        第三次握手:客户端收到服务器的SYM+ACK包,向服务器发送确认包ACK(ACK=K+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。

        完成三次握手,客户端与服务器开始传送数据

        

       2、四次分手

        由于TCP连接是全双工的,因此每个方向必须单独进行关闭,这个原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍然能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭

        客户端A发送一个FIN,用它来关闭客户A到服务B的数据传输;

        服务器B收到这个FIN,他发回一个ACK,确认序号为收到的序号加1,和SYM一样,一个FIN将占用一个序号。

        服务器B关闭与客户端A的连接,发送一个FIN给客户端A。

        客户端A发回ACK报文确认,并将确认序号设置为收到序号加1。

        

       3、TCP协议服务端代码

    复制代码
    package com.socket.TCP;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    public class TCPServer {
        public static void main(String[] args) throws IOException {
            System.out.println("tcp服务端启动成功==============================");
    
            //创建连接
            ServerSocket socket=new ServerSocket(8080);
    
            //获取客户端请求,如果客户端没有请求则堵塞
            Socket accept=socket.accept();
    
            //获取客户端传输数据
            InputStream inputStream=accept.getInputStream();
    
            byte[] bytes=new byte[1024];
            int length = inputStream.read(bytes);
    
            System.out.println(new String(bytes,0,length));
        }
    }
    复制代码

      4、TCP协议客户端代码

    复制代码
    package com.socket.TCP;
    
    import java.io.IOException;
    import java.io.OutputStream;
    import java.net.Socket;
    
    public class TCPClient {
        public static void main(String[] args) throws IOException {
            //创建一个连接
            Socket socket=new Socket("127.0.0.1",8080);
    
            OutputStream outputStream=socket.getOutputStream();
    
            outputStream.write("我不配".getBytes());
        }
    }
    复制代码

      5、效果如下

        (1)服务端

          

         (2)客户端

          

         (3)服务端接收客户端请求

          

  • 相关阅读:
    idea快捷键
    cas的缺点
    mybatis plus 实现逻辑删除
    mybatis plus的条件查询
    POI写非常大的数据量时
    POI中HSSF和XSSF
    JMM是什么
    Android面试收集录10 LruCache原理解析
    Android面试收集录9 IntentService详解
    Android面试收集录8 HandlerThread详解
  • 原文地址:https://www.cnblogs.com/mayuan01/p/12382449.html
Copyright © 2011-2022 走看看