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. import java.io.BufferedReader;
  3. import java.io.IOException;
  4. import java.io.InputStreamReader;
  5. import java.net.Socket;
  6. import android.os.Bundle;
  7. import android.app.Activity;
  8. import android.view.Menu;
  9. import android.widget.EditText;
  10. public class SimpleClient extends Activity {
  11. EditText show;
  12. @Override
  13. public void onCreate(Bundle savedInstanceState)
  14. {
  15. super.onCreate(savedInstanceState);
  16. setContentView(R.layout.activity_main);
  17. show =(EditText)findViewById(R.id.show);
  18. //关闭输入流、socket
  19. try
  20. {
  21. Socket socket = new Socket("10.0.2.2" ,30001);
  22. //将Socket对应的输入流包装成BufferedReader
  23. //将服务器中传过来的数据 通过Inputstream读出来
  24. BufferedReader br = new BufferedReader(
  25. new InputStreamReader(socket.getInputStream()));
  26. //进行普通IO操作
  27. String line = br.readLine();
  28. show.setText("收到了服务器的数据,内容是:" + line);
  29. br.close();
  30. socket.close();
  31. }
  32. catch (IOException e)
  33. {
  34. e.printStackTrace();
  35. }
  36. }
  37. }

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. <EditText
  8. android:id="@+id/show"
  9. android:layout_width="fill_parent"
  10. android:layout_height="wrap_content"
  11. android:cursorVisible="false"
  12. android:editable="false" >
  13. </EditText>
  14. </LinearLayout>

实现的效果图:

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

时间: 2024-10-06 20:12:33

adb通信原理分析的相关文章

QQ 通信原理分析(转)

之前写过一个简单的IM,当时遇到过各种令人崩溃的问题:事后也没有做很好的总结,现在看到这篇文章,感慨良多,特此转摘过来,以做备忘. 出处:http://blog.csdn.net/lxnkobe/article/details/7521331 下面有4个基本的问答: 问题一:为什么只要可以连上互联网的计算机都可以用QQ相互建立通信,而不需要固定IP?也就是这个QQ用户端是怎样找到另一个QQ用户的,而用户在每次使用时他可能用的是不同的计算机,有着不同的IP地址.服务器端不会以qq用户端的ip作为唯

基于web的IM软件通信原理分析

关于IM(InstantMessaging)即时通信类软件(如微信,QQ),大多数都是桌面应用程序或者native应用较为流行,而网上关于原生IM或桌面IM软件类的通信原理介绍也较多,此处不再赘述.而web端的IM应用,由于浏览器的兼容性以及其固有的“客户端请求服务器处理并响应”的通信模型,造成了要在浏览器中实现一个兼容性较好的IM应用,其通信过程必然是诸多技术的组合,本文的目的就是要详细探讨这些技术并分析其原理和过程. 1.基于web的固有通信方式 浏览器本身作为一个瘦客户端,不具备直接通过系

Android Binder跨进程通信原理分析

出发前预备子弹 我们知道进程之间,虚拟地址不同,是不能直接通信的,这是一种保护机制.打开任务管理器,查看一下N多的进程,试想一下如果这些进程直接通信会带来什么后果? 而用户空间可以通过System calls(系统回调)与内核空间通信的,如果在内核空间中有一个模块,能够完成数据的转发,那么是不是两个进程就可以通信了呢?如下图: 上面提到一些用户空间.内核空间的概念,用户空间也能大概猜到是什么东西,而内核空间,就知道它是很底层的东西好了.而模块呢,可以简单的理解为实现一个功能的程序或一个硬件电路等

Android中线程间通信原理分析:Looper,MessageQueue,Handler

自问自答的两个问题 在我们去讨论Handler,Looper,MessageQueue的关系之前,我们需要先问两个问题: 1.这一套东西搞出来是为了解决什么问题呢? 2.如果让我们来解决这个问题该怎么做? 以上者两个问题,是我最近总结出来的,在我们学习了解一个新的技术之前,最好是先能回答这两个问题,这样你才能对你正在学习的东西有更深刻的认识. 第一个问题:google的程序员们搞出这一套东西是为了解决什么问题的?这个问题很显而易见,为了解决线程间通信的问题.我们都知道,Android的UI/Vi

android adb 流程原理代码分析(一)

由于要用到adb的知识,但是对adb啥也不了解,看了下android的代码,adb的源码在system/core/adb下面,然后网上搜下了资料,发现很多大神的源码分析,瞬间信心爆棚,把大神写的博客都浏览了一遍,然后手动运行了下adb命令,顺便跟踪了下过程,发现原来还是很好的理解,源码的各种线程创建,函数回调,对于我这种基础不咋好的,,还是看的晕晕呼呼,现在把我自己的理解给大家分享,有理解错误的还请多多指正. 一般直接上代码,可能看官都走了一大半,我们逆向的看,先看结果,再看过程,最后再看代码.

docker容器网络通信原理分析

概述 自从docker容器出现以来,容器的网络通信就一直是大家关注的焦点,也是生产环境的迫切需求.而容器的网络通信又可以分为两大方面:单主机容器上的相互通信和跨主机的容器相互通信.而本文将分别针对这两方面,对容器的通信原理进行简单的分析,帮助大家更好地使用docker. docker单主机容器通信 基于对net namespace的控制,docker可以为在容器创建隔离的网络环境,在隔离的网络环境下,容器具有完全独立的网络栈,与宿主机隔离,也可以使容器共享主机或者其他容器的网络命名空间,基本可以

Android视图SurfaceView的实现原理分析

附:Android控件TextView的实现原理分析 来源:http://blog.csdn.net/luoshengyang/article/details/8661317 在Android系统中,有一种特殊的视图,称为SurfaceView,它拥有独立的绘图表面,即它不与其宿主窗口共享同一个绘图表面.由于拥有独立的绘图表面,因此SurfaceView的UI就可以在一个独立的线程中进行绘制.又由于不会占用主线程资源,SurfaceView一方面可以实现复杂而高效的UI,另一方面又不会导致用户输

AbstractQueuedSynchronizer的介绍和原理分析(转)

简介 提供了一个基于FIFO队列,可以用于构建锁或者其他相关同步装置的基础框架.该同步器(以下简称同步器)利用了一个int来表示状态,期望它能够成为实现大部分同步需求的基础.使用的方法是继承,子类通过继承同步器并需要实现它的方法来管理其状态,管理的方式就是通过类似acquire和release的方式来操纵状态.然而多线程环境中对状态的操纵必须确保原子性,因此子类对于状态的把握,需要使用这个同步器提供的以下三个方法对状态进行操作: java.util.concurrent.locks.Abstra

spi协议及工作原理分析

转自----http://blog.csdn.net/skyflying2012/article/details/11710801 一.概述. SPI, Serial Perripheral Interface, 串行外围设备接口, 是 Motorola 公司推出的一种同步串行接口技术. SPI 总线在物理上是通过接在外围设备微控制器(PICmicro) 上面的微处理控制单元 (MCU) 上叫作同步串行端口(Synchronous Serial Port) 的模块(Module)来实现的, 它允