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

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。