Android上的socket 编程

作者: CharlesYale | 来源:发表于2018-07-13 17:01 被阅读7次

一.Socket定义

套接字,是应用层 与 TCP/IP 协议族通信的中间软件抽象层,表现为一个封装了 TCP / IP协议族 的编程接口(API)

  • Socket不是一种协议,而是一个编程调用接口(API),属于传输层(主要解决数据如何在网络中传输),在Android上,我们通过Socket来进行基于TCP或UDP协议的网络通信开发
  • 成对出现,一对套接字:
    Socket ={(IP地址1:PORT端口号),(IP地址2:PORT端口号)}
  • 一个 Socket 实例 唯一代表一个主机上的一个应用程序的通信链路

示意图:


示意图

通信原理图:


通信原理图

二.建立连接过程

客户端

  1. 创建一个Socket实例,构造方法传入ipport
  2. 在创建Socket实例的构造函数返回前,会调用connect(SocketAddress endpoint)去建立连接,TCP的话会三次握手
  3. 连接建立以后通过socket.getInputStream()socket.getOutputStream()来与服务端进行通信

服务端

  1. 创建一个ServerSocket实例,传入监听的port
  2. 调用accept()方法,将进入阻塞状态,等待客户端的请求
  3. 当一个新请求到来时,将accept方法将创建一个新的Socket套接字返回
  4. 连接建立以后通过socket.getInputStream()socket.getOutputStream()来与服务端进行通信

三.使用步骤

  • 这里仅就TCP而言举例
    // 步骤1:创建客户端 & 服务器的连接

    // 创建Socket对象 & 指定服务端的IP及端口号 
    Socket socket = new Socket("192.168.1.32", 1989);  

    // 判断客户端和服务器是否连接成功  
    socket.isConnected());

                     
    // 步骤2:客户端 & 服务器 通信
    // 通信包括:客户端 接收服务器的数据 & 发送数据 到 服务器

    <-- 操作1:接收服务器的数据 -->
        
            // 步骤1:创建输入流对象InputStream
            InputStream is = socket.getInputStream() 

            // 步骤2:创建输入流读取器对象 并传入输入流对象
            // 该对象作用:获取服务器返回的数据
            InputStreamReader isr = new InputStreamReader(is);
            BufferedReader br = new BufferedReader(isr);

            // 步骤3:通过输入流读取器对象 接收服务器发送过来的数据
            br.readLine();


    <-- 操作2:发送数据 到 服务器 -->                  

            // 步骤1:从Socket 获得输出流对象OutputStream
            // 该对象作用:发送数据
            OutputStream outputStream = socket.getOutputStream(); 

            // 步骤2:写入需要发送的数据到输出流对象中
            outputStream.write(("Carson_Ho"+"\n").getBytes("utf-8"));
            // 特别注意:数据的结尾加上换行符才可让服务器端的readline()停止阻塞

            // 步骤3:发送数据到服务端 
            outputStream.flush();  


    // 步骤3:断开客户端 & 服务器 连接

            socket.close();

四.参考

https://www.jianshu.com/p/089fb79e308b

相关文章

网友评论

    本文标题:Android上的socket 编程

    本文链接:https://www.haomeiwen.com/subject/rtkspftx.html