Android基础知识

Android Socket了解一下

2018-06-28  本文已影响0人  成旭辕

前段时间做了关于Socket的项目,总结一些在这个过程中学到的东西和需要注意的地方
socket 的使用在Android的开发中还是很常见的,也是非常重要的

先看下思维导图

socket.png

1.网络基础知识

首先回一下以前学过的OSI七层网络模型分别是:物理层,数据链路层,网络层,传输层,会话层,表示层,应用层。

物理层

数据链路层

网络层

传输层

会话层

表示层

应用层

接下来看对我们开发比较重要的对比模型


模型对比.png

TCP协议

定义: Transmission Control Protocol,即 传输控制协议

特点:

缺点:效率慢

TCP 三次握手和四次挥手

三次握手
四次挥手

UDP协议

特点:

优点:速度快
缺点:消息容易丢失

HTTP协议

特点:

以上是作为今天的主题,需要复习的一些简单知识点,当然以上知识点里面的细节远远不止这些,这边知识对知识的一个梳理,打通的过程,接下看说说Socket

什么是Socket?

看图理解


socket看图理解.png

原理

基于 TCP协议流套接字(streamsocket),采用 流的方式 提供可靠的字节流服务

基于 UDP协议数据报套接字(datagramsocket),采用 数据报文 提供数据打包发送的服务

怎么使用

一张图就能看懂


socket3.jpg

具体步骤

    /*
    * 步骤1:创建客户端 & 服务器的连接
    */ 

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

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

下面是一些简单的测试方法,当然在实际的应用中,这些测试方法不一定实用,(仅供参考),因为每个企业的业务是不一样的,比如说可能有的企业会对每个消息进行了组装,有包头,包体,报内容,包长度等,那么你读取、发送消息的时候都需要去解包、组包的。这一点需要注意


    private Socket socket;
    private OutputStream outputStream;
    private InputStream inputStream;
    private InputStreamReader inputStreamReader;
    private BufferedReader bufferedReader;
    private String response;// 接收服务器发送过来的消息

  /**
     * 建立服务端连接
     */
    public void connect() {
        new Thread() {

            @Override
            public void run() {

                try {
                    socket = new Socket("ip地址", 9000);
                    Log.d("socket", "建立连接:" + socket.isConnected());
                } catch (UnknownHostException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }.start();
    }
    
      /**
     * 发送消息
     */
    public void send() {
        new Thread() {
            @Override
            public void run() {

                try {
                    //从Socket 获得输出流对象OutputStream
                    outputStream = socket.getOutputStream();
                    DataOutputStream writer = new DataOutputStream(outputStream);
                    //写入需要发送的数据到输出流对象中
                    writer.writeUTF("你好,我是队长"); // 写一个UTF-8的信息
                    //发送数据到服务端
                    outputStream.flush();
                   Log.d("socket", "发送消息" );
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }.start();
    }
    
    
      /**
     * 读取数据
     */
    public void read() {
        new Thread() {
            @Override
            public void run() {
                try {
                    //创建输入流对象InputStream
                    inputStream = socket.getInputStream();

                    //实际的应用中也可以这样的 read()传入的三个参数根据你的项目具体情况去写
                    //byte[] buffer =new byte[1024*1024];
                    //inputStream.read(buffer,0,1024);

                    // 创建输入流读取器对象 并传入输入流对象
                    inputStreamReader = new InputStreamReader(inputStream);
                    //该对象作用:获取服务器返回的数据
                    bufferedReader = new BufferedReader(inputStreamReader);
                    //通过输入流读取器对象 接收服务器发送过来的数据
                    response = bufferedReader.readLine();
                    Log.d("socket", "接受到的消息: "+response );
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }.start();
    }
    
    
    
    /**
     * 断开连接
     */
    public void closeSocket() {
        try {
            if (bufferedReader != null) {
                bufferedReader.close();
            }
            if (inputStreamReader != null) {
                inputStreamReader.close();
            }
            if (inputStream != null) {
                inputStream.close();
            }
            if (outputStream != null) {
                outputStream.close();
            }
            if (socket != null) {
                socket.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    

总结

socket和http 对比
类别 在TCP/IP模型中哪一层 工作方式 解决的问题
socket 传输层和应用层之间 服务器主动发送数据的方式 数据如何在网络中传输的问题
http 应用层 请求-响应 如何包装数据的问题

注:因为ICP/IP属于传输层,socket也可以划分到传输层,其实socket和http的对比没有太大的实际意义,因为他们本身不是处于同一层级

一般在实际的应用中都会采用多线程去处理socket,一个线程负责读取,一个线程负责发送。注意多线程的使用

实际的应用中可能会遇到的坑

1, 客户端发送的一条消息到服务器,如何保证客户端发送成功了,要不然会出现客户端说我发给你了,服务器说我没收到,到时候锅帅给谁?

2,服务器向客户端发送一条消息,如何知道客户端接受成功了呢?

3,在网络不好的情况下,消息发出去了,但服务器还没有收到,这条消息就此丢掉,还是下次网络恢复的时候继续发送该消息

上一篇 下一篇

猜你喜欢

热点阅读