Android常用的两种通信方式Socket/Http

作者: xihacode | 来源:发表于2016-10-10 23:01 被阅读202次

    Socket和Http是Android常用的两种通信方式,但是两者又是有所不同的,使用场景有所不同,这篇文章就来总结总结这两种方式。

    首先,Socket是什么呢?其实Socket就是一组接口而已,其实计算机网络中通常会把通讯网络分为5层模型:


    五层模型

    Socket就是运输层和应用层中间的抽象层,隐藏了TCP/IP协议簇(位于运输层)的具体实现,所以位于应用层的应用想要和底层的运输层通信,直接调用Socket就行了。Socket的类型其实有两种,一种是TCP应用服务,一种是UDP应用服务,有啥区别呢?

    | TCP | UDP
    ----|-------|------
    是否连接| 面向连接| 面向非连接
    传输可靠性|可靠的| 不可靠的
    应用场合|传输大量的数据|少量数据
    速度|慢|快
    其实在Android中除了视频音频等对丢包率要求不高的情况,其它时候还是建议用TCP的。Socket不仅可以用于网络通信,还可以用于应用的跨进程通信。Socket的使用方式也很简单。

    public void startTcpSocketConnect(){
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        mSocket = new Socket(serverIp, serverPort);
                        in = new BufferedReader(new InputStreamReader(mSocket.getInputStream()));
                        out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(
                                mSocket.getOutputStream())), true);
                        while (true) {
                            if (mSocket.isConnected()) {
                                if (!mSocket.isInputShutdown()) {
                                    if ((content = in.readLine()) != null) {
                                        content += "\n";
                                        if (mTcpSocketListener != null)
                                            mTcpSocketListener.callBackContent(content);
                                    }
                                }
                            }
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }).start();
        }
    

    都是几乎固定的写法,没什么稀奇的,网上一搜一堆代码。
    当然UDP的话就是

    socket = new DatagramSocket(1985);    
    ....
    DatagramPacket packet = new DatagramPacket(data, data.length ,serverAddress ,10025);    
    socket.send(packet);//把数据发送到服务端。
    socket.receive(packet);  //接收数据
    

    再说Http,Http是建立在请求/响应模型上的应用层协议,客户端首先建立一条与服务器的TCP连接并发送一个请求,然后服务器作出相应的响应。其中HTTP/1.0用的是短链接,没发送一次请求就会新建立一个连接,而每一个连接都要3次握手,这是很耗费资源的,于是HTTP/1.1做出来改进,使用了长连接,只建立一个TCP连接重复使用其传输一些列的请求/响应。这样就节省了这种开销了。

    题外话,如果有一种协议即能像UDP那样高效又能像TCP那样的可靠就好了,哈哈,不过听说有人已经在研究UDP和TCP混合的HTTP了,不知道是不是真的。

    既然Http是基于TCP之上的,那么可不可以用Socket来实现下Http呢?答案当然是可以的。

     static void get(String url) throws IOException {
    
            String host = new URL("http://" + url).getHost();
    
            String path = url.substring(host.length());
    
            InetSocketAddress address = new InetSocketAddress(host, 80);
            Socket socket = new Socket();
            socket.connect(address);
            OutputStreamWriter streamWriter = new OutputStreamWriter(socket.getOutputStream());
            BufferedWriter bufferedWriter = new BufferedWriter(streamWriter);
            bufferedWriter.write("GET " + path + " HTTP/1.1\r\n");
            bufferedWriter.write("Host: " + host + "\r\n");
            bufferedWriter.write("Content-Type: application/x-www-form-urlencoded\r\n");
            bufferedWriter.write("\r\n");
            bufferedWriter.flush();
    
            BufferedInputStream inputStream = new BufferedInputStream(socket.getInputStream());
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, "utf-8"));
            String line;
            while ((line = bufferedReader.readLine()) != null) {
                Log.d("1234", line);
            }
            bufferedReader.close();
            bufferedWriter.close();
            socket.close();
    
        }```
    这里只是实现了get方法,其实post方法也是一样的原理的请求头最好加上“Content-Length”和“Content-Type”,另外需要注意的是传输的数据最好编码一下,以免出现乱码或编码错误。
    
    
    
    
    
    

    相关文章

      网友评论

      本文标题:Android常用的两种通信方式Socket/Http

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