關於這個問題,自己研究了一下,沒有研究出來
在網絡上搜羅了一下,基本上關於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
- package com.example.simplecilent;
- import java.io.BufferedReader;
- import java.io.IOException;
- import java.io.InputStreamReader;
- import java.net.Socket;
- import android.os.Bundle;
- import android.app.Activity;
- import android.view.Menu;
- import android.widget.EditText;
- public class SimpleClient extends Activity {
- EditText show;
- @Override
- public void onCreate(Bundle savedInstanceState)
- {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- show =(EditText)findViewById(R.id.show);
- //關閉輸入流、socket
- try
- {
- Socket socket = new Socket("10.0.2.2" ,30001);
- //將Socket對應的輸入流包裝成BufferedReader
- //將服務器中傳過來的數據 通過Inputstream讀出來
- BufferedReader br = new BufferedReader(
- new InputStreamReader(socket.getInputStream()));
- //進行普通IO操作
- String line = br.readLine();
- show.setText("收到了服務器的數據,內容是:" + line);
- br.close();
- socket.close();
- }
- catch (IOException e)
- {
- e.printStackTrace();
- }
- }
- }
layout的xml文件
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:orientation="vertical" >
- <EditText
- android:id="@+id/show"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:cursorVisible="false"
- android:editable="false" >
- </EditText>
- </LinearLayout>
實現的效果圖:
多線程方面參考:http://blog.csdn.net/u012605629/article/details/40481307
