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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM