• 网络请求(四)—Socket


    C/S结构:即客户端/服务器结构,是软件系统体系结构;充分利用两端硬件环境的优势,将任务合理分配到ClientServer端来实现,降低了系统的通信开销。

    Socket套接字,是一个对TCP/IP协议进行封装的编程调用接口,属于传输层,即通过Socket,才可以在Android平台上进行TCP/IP协议开发,为通信双方的数据传输提供通道。

    Socket

    Socket的使用可以基于TCP或者UDP协议。

    TCP协议(Transmission Control Protocol),即传输控制协议,是一种传输层通信协议。基于TCP的应用层协议由FTPTelnetSMTPHTTPPOP3DNS 特点是:

    • 面向连接:指的是要使用TCP传输数据,必须先建立TCP连接,传输完成后释放连接;
    • 全双工通信:即一旦建立了TCP连接,通信双方可以在任何时候发送数据;
    • 可靠:指的是通过TCP连接传输的数据,无差错、不丢失、无重复,并且按序到达;
    • 面向字节流:流指的是在进程中流入流出的字符序列。简单来说,虽然有的时候传输的数据流太大,TCP报文有长度限制,不能一次性传输完,需要把它分成好几个数据块,但又要保证可靠性,接收方可以按顺序接收数据块然后重组成之前的数据流;

    UDP协议(User Datagram Protocol),即用户数据报协议,是一种传输层通信协议。基于UDP的应用层协议有TFTPSNMPDNS 特点是:

    • 无连接:UDP传输数据不需要建立连接;
    • 不可靠:因为UDP数据包发出去就不管了,不管它会不会到达,可能会出现丢包的现象;
    • 面向报文:数据报文,相当于一个数据包。不管应用层交给UDP多大的数据包,UDP都照样发送,不会像TCP那样拆分;
    • 没有阻塞控制:阻塞是指通信子网中某一部分的分组数量过多,使得该部分晚了来不及处理,以至隐去这部分乃至于整个网络性能下降的情况。TCP建立连接后如果遇到类似的情况,导致发送的数据无法到达目的地,它会不断的重复,就会使得网络越来越阻塞,所以需要一个复杂的原理来控制阻塞。而UDP没有个这个问题;

    UDP的应用场景:很多的实时应用,如IP电话、实时视频会议等要求源主机以很快的速率发送数据,并且允许在网络阻塞时可以丢失一些数据,但是要求不能有太大的延迟,这个时候就可以考虑UDP

    Android中客户端与服务端的通信方式有两种:HTTPSocket

    • Http属于应用层,采用请求-响应的方式发送数据,即建立网络连接后,在客户端向服务端发送请求后,服务端才向客户端发送数据;
    • Socket属于传输层,采用主动发送数据的方式,即建立网络连接后,服务端可以主动发送消息给客户端,而不需要客户端向服务端发送请求;

    Socket的使用类型主要有两种:

    • 流套接字(streamsocket):基于TCP协议,采用流的方式提供可靠的字节流服务;
    • 数据报套接字(datagramsocket):基于UDP协议,采用数据报文提供数据打包发送的服务;

    基于TCP协议的Socket:客户端创建一个Socket对象,指定服务器端的IP地址和端口号,通过InputStream读取服务端发送的数据:

    try {
        Socket socket = new Socket("172.16.10.108", 8080);
        InputStream inputStream = new FileInputStream("e://a.txt");
        OutputStream outputStream = socket.getOutputStream();
        byte buffer[] = new byte[4 * 1024];
        int temp = 0;
        while ((temp = inputStream.read(buffer)) != -1) {
          outputStream.write(buffer, 0, temp);
        }
        outputStream.flush();
    } catch (IOException e) {
      	e.printStackTrace();
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    基于UDP协议的Socket:客户端创建一个DatagramSocket对象,并且指定监听的接口:

    // 客户端发送数据
    try {
        DatagramSocket socket = new DatagramSocket(1985);
        InetAddress inetAddress = InetAddress.getByName("192.168.1.32");
        String string = "哈哈哈哈哈哈";
        byte[] data = string.getBytes();
        DatagramPacket packet = new DatagramPacket(data, data.length, inetAddress, 10025);
        socket.send(packet);
    } catch (IOException e) {
      	e.printStackTrace();
    }
    
    // 客户端接收数据
    try {
        DatagramSocket socket = new DatagramSocket(1985);
        byte[] data = new byte[4 * 1024];
        DatagramPacket packet = new DatagramPacket(data, data.length);
        socket.receive(packet);
        String result = new String(packet.getData(), packet.getOffset(), packet.getLength());
        socket.close();
    } catch (IOException e) {
      	e.printStackTrace();
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    参考

    @Android:这是一份很详细的Socket使用攻略
    基于android的Socket通信
    Android必备: Socket编程的了解与学习整理

  • 相关阅读:
    接口返回字段加密
    Chrome浏览器免费广告拦截器插件 —— Adblock
    电脑按哪几个键可以录制屏幕?录屏软件与快捷键全攻略
    STM32——HAL库中寄存器地址名称映射分析
    怎么设置日历隔一天提醒
    R语言forcats包处理因子
    docker 跨平台构建镜像
    12月份PMP考试首次采用新考纲,该怎么学?
    移动应用开发之路 01 Android Studio 项目文件介绍、创建虚拟机、完成第一个程序Hello World
    Request
  • 原文地址:https://blog.csdn.net/xingyu19911016/article/details/124536636