zoukankan      html  css  js  c++  java
  • adb通信原理分析

    关于这个问题,自己研究了一下,没有研究出来

    在网络上搜罗了一下,基本上关于ADB的原理用了两张图表示:

          

    我表示没有看懂这两个图,

    又开始查阅一些一些资料:

    首先知道adb的通信有Socket,那么socket是什么呢?

    套接字(socket)概念 
        套接字(socket)是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元。它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:连接使用的协议,本地主机的IP地址,本地进程的协议端口,远地主机的IP地址,远地进程的协议端口。 
        应用层通过传输层进行数据通信时,TCP会遇到同时为多个应用程序进程提供并发服务的问题。多个TCP连接或多个应用程序进程可能需要通过同一个 TCP协议端口传输数据。为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与TCP/IP协议交互提供了套接字(Socket)接口。应用层可以和传输层通过Socket接口,区分来自不同应用程序进程或网络连接的通信,实现数据传输的并发服务。
       套接字之间的连接过程分为三个步骤:服务器监听,客户端请求,连接确认。
    socket的位置在什么地方:
     
     实际上socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API),通过Socket,我们才能使用TCP/IP协议。 实际上,Socket跟TCP/IP协议没有必然的联系。Socket编程接口在设计的时候,就希望也能适应其他的网络协议
       综上所述,我的理解:(1)Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。(2)socket可以说是两个端口的称呼.adb连接时,一个serversocket,一个clientsocket,这就形成了两端端口,通过socket连接到TCP/IP协议,从而实现PC端和手机端的通信
    Java中实现:
    这里可以参考疯狂android讲义的第13章内容。

    实现一个简单的socket通信:

    java程序,运行java类即可。弄一个简单的服务器:

    import java.io.*;
    import java.net.*;
    
    public class SimpleServer {
    	public static void main(String[] args) throws IOException {
    		
    		// 创建一个ServerSocket,用于监听客户端socket的连接请求
    		ServerSocket server = new ServerSocket(30001);
    
    		// 采用循环方式不断接受来自客户端的请求
    		while (true) {
    			// 每当接受到客户端Socket的请求,服务器端也对应产生一个Socket
    			Socket s = server.accept();
    			//获取输出流
    			writer.flush();
    			writer.close();*/
    			
    			//通过输出流 向socket中写数据
    			OutputStream os=s.getOutputStream();
    			os.write("你好,我是服务器".getBytes("utf-8"));
    			os.close();
    			s.close();
    		}
    	}
    }
    再用建立一个android应用,使用socket与制定端口连接,获取数据等。

    simpleClient.java

    1. package com.example.simplecilent;  
    2.   
    3. import java.io.BufferedReader;  
    4. import java.io.IOException;  
    5. import java.io.InputStreamReader;  
    6. import java.net.Socket;  
    7.   
    8. import android.os.Bundle;  
    9. import android.app.Activity;  
    10. import android.view.Menu;  
    11. import android.widget.EditText;  
    12.   
    13. public class SimpleClient extends Activity {  
    14.       
    15.     EditText show;  
    16.     @Override  
    17.     public void onCreate(Bundle savedInstanceState)   
    18.     {  
    19.         super.onCreate(savedInstanceState);  
    20.         setContentView(R.layout.activity_main);  
    21.         show =(EditText)findViewById(R.id.show);  
    22.         //关闭输入流、socket  
    23.             try  
    24.             {  
    25.                 Socket socket = new Socket("10.0.2.2" ,30001);  
    26.                 //将Socket对应的输入流包装成BufferedReader  
    27.                 //将服务器中传过来的数据 通过Inputstream读出来  
    28.                 BufferedReader br = new BufferedReader(  
    29.                 new InputStreamReader(socket.getInputStream()));  
    30.                 //进行普通IO操作  
    31.                 String line = br.readLine();  
    32.                 show.setText("收到了服务器的数据,内容是:" + line);            
    33.                 br.close();  
    34.                 socket.close();   
    35.             }  
    36.             catch (IOException e)  
    37.             {  
    38.                 e.printStackTrace();  
    39.             }  
    40.         }  
    41. }  
    layout的xml文件
    1. <?xml version="1.0" encoding="utf-8"?>  
    2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    3.     xmlns:tools="http://schemas.android.com/tools"  
    4.     android:layout_width="fill_parent"  
    5.     android:layout_height="fill_parent"  
    6.     android:orientation="vertical" >  
    7.   
    8.     <EditText  
    9.         android:id="@+id/show"  
    10.         android:layout_width="fill_parent"  
    11.         android:layout_height="wrap_content"  
    12.         android:cursorVisible="false"  
    13.         android:editable="false" >  
    14.     </EditText>  
    15.   
    16. </LinearLayout> 

    实现的效果图:

    多线程方面参考:http://blog.csdn.net/u012605629/article/details/40481307

  • 相关阅读:
    js获取窗口大小
    ARCGIS接口详细说明
    输入框特效
    GeoServer源码解析和扩展 (二)注册服务
    GeoServer源码解析和扩展 (一)基础篇
    window.open参数大全
    Flex控件
    GeoServer源码解析和扩展 (三)结构篇
    js常用的几个正则表达式
    表单的diabled属性与readonly属性
  • 原文地址:https://www.cnblogs.com/szy123618/p/4064038.html
Copyright © 2011-2022 走看看