android socket各類通訊

我已經試驗成功:java

 ps:模擬器作服務器,PC機作客戶端。若是經過wifi鏈接的話直接訪問IP就行,不用重定向。android

      PC訪問模擬器用localhost即127.0.0.1, 模擬器 訪問 模擬器用10.0.2.2windows

      本人已成功運行,看你的RP了- -服務器

server:網絡

 

Java代碼  收藏代碼app

  1. /** dom

  2.  * Server.java socket

  3.  * @author wuzq tcp

  4.  * @create 2012-2-21 ide

  5.  */  

  6. package com.warner.client;  

  7.   

  8. import java.io.BufferedReader;  

  9. import java.io.BufferedWriter;  

  10. import java.io.Console;  

  11. import java.io.IOException;  

  12. import java.io.InputStreamReader;  

  13. import java.io.OutputStreamWriter;  

  14. import java.io.PrintWriter;  

  15. import java.net.Socket;  

  16.   

  17. public class G3ExpPCclient {  

  18.     public static final String adb_path= "E:\\android-sdk-windows\\tools\\adb ";//adb所在路徑  

  19.     private static final String HOST = "localhost";  

  20.     private static final int PORT = 8080;  

  21.     private Socket socket = null;  

  22.     private BufferedReader in = null;  

  23.     private PrintWriter out = null;  

  24.   

  25.     public G3ExpPCclient() {  

  26.         try {  

  27.             socket = new Socket(HOST, PORT);  

  28.             in = new BufferedReader(new InputStreamReader(socket.getInputStream()));  

  29.             out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);  

  30.         } catch (IOException ex) {  

  31.             ex.printStackTrace();  

  32.             System.out.println("login exception" + ex.getMessage());  

  33.         }  

  34.     }  

  35.   

  36.     public void openUrl(String msg) {  

  37.         if (socket.isConnected()) {  

  38.             if (!socket.isOutputShutdown()) {  

  39.                 out.println(msg);  

  40.             }  

  41.         }  

  42.     }  

  43.   

  44.     public static void main(String[] args) {  

  45.         try {  

  46.             //把虛擬機的8090端口綁定到PC本機的8080端口,這樣當PC向8080發送數據時其實是發到虛擬機的8090端口  

  47.             //Runtime.getRuntime().exec(G3ExpPCclient.adb_path + " –s emulator-5554 forward tcp:8080 tcp:8090");這個方法很差用  

  48.             Runtime.getRuntime().exec(G3ExpPCclient.adb_path + " forward tcp:8080 tcp:8090");//這個好用  

  49.             System.out.println("已經將虛擬機端口8090綁定到PC端口8080 "+adb_path);  

  50.         } catch (IOException e1) {  

  51.             e1.printStackTrace();  

  52.         }  

  53.           

  54.         G3ExpPCclient pc = new G3ExpPCclient();  

  55.           

  56.          BufferedReader br = new BufferedReader(new InputStreamReader(System.in));  

  57.       

  58.         while (true) {  

  59.       

  60.             String msg="";  

  61.               

  62.             try {  

  63.                 msg = br.readLine();  

  64.                 System.out.println("將打開:" + msg);   //輸入完整路徑http://www.baidu.com  

  65.             } catch (IOException e) {  

  66.                 e.printStackTrace();  

  67.             }  

  68.   

  69.             if (msg.equals("exit")) {  

  70.                 System.out.println("退出");  

  71.                 System.exit(-1);  

  72.             } else {  

  73.                 pc.openUrl(msg);  

  74.             }  

  75.         }  

  76.     }  

  77. }  

 client:

 

Java代碼  收藏代碼

  1. /** 

  2.  * G3Exp.java 

  3.  * @author wuzq 

  4.  * @create 2012-2-21 

  5.  */  

  6. package com.warner.activity;  

  7.   

  8. import java.io.BufferedReader;  

  9. import java.io.InputStreamReader;  

  10. import java.net.ServerSocket;  

  11. import java.net.Socket;  

  12.   

  13. import android.app.Activity;  

  14. import android.content.Intent;  

  15. import android.net.Uri;  

  16. import android.os.Bundle;  

  17. import android.os.Handler;  

  18. import android.os.Message;  

  19. import android.util.Log;  

  20. import android.widget.TextView;  

  21.   

  22. public class G3Exp extends Activity {  

  23.     // 定義偵聽端口號  

  24.     private final int SERVER_PORT = 8090;  

  25.     private TextView textView;  

  26.     private String content = "";  

  27.       

  28.       

  29.     @Override  

  30.     public void onCreate(Bundle savedInstanceState) {  

  31.         super.onCreate(savedInstanceState);  

  32.         setContentView(R.layout.g3exp);  

  33.         textView = (TextView)findViewById(R.id.g3_msg);  

  34.           

  35.         // 開一個新的線程來偵聽客戶端鏈接及發來的信息和打開相應網站  

  36.         new Thread() {  

  37.             public void run() {  

  38.                 startServer();  

  39.             }  

  40.         }.start();  

  41.     }  

  42.   

  43.     private void startServer() {  

  44.         try {  

  45.             //ServerSocket serverSocket = new ServerSocket(SERVER_PORT);  

  46.             ServerSocket serverSocket = new ServerSocket(SERVER_PORT);  

  47.             // 循環偵聽客戶端鏈接請求  

  48.             while (true) {  

  49.                 Socket client = serverSocket.accept();  

  50.                   

  51.                 try {  

  52.                     Log.e("hehheh""有人來訪:");  

  53.                     // 等待客戶端發送打開網站的消息  

  54.                     BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));  

  55.                     String str = in.readLine();  

  56.                     content += str+"\n";  

  57.                     mHandler.sendMessage(mHandler.obtainMessage());  

  58.                     openUrl(str);  

  59.                 } catch (Exception e) {  

  60.                     e.printStackTrace();  

  61.                 } finally {  

  62.                     client.close();  

  63.                 }  

  64.                 Thread.sleep(3000);  

  65.             }  

  66.         } catch (Exception e) {  

  67.             e.printStackTrace();  

  68.         }  

  69.     }  

  70.   

  71.     private void openUrl(String url) {  

  72.         Uri uri = Uri.parse(url);  

  73.         Intent intent = new Intent(Intent.ACTION_VIEW, uri);  

  74.         startActivity(intent);  

  75.     }  

  76.       

  77.     public Handler mHandler = new Handler() {  

  78.         public void handleMessage(Message msg) {  

  79.             super.handleMessage(msg);  

  80.             textView.setText(textView.getText().toString()+content);  

  81.         }  

  82.     };  

  83. }  

 

   別忘了加:<uses-permission android:name="android.permission.INTERNET" />

 

 

=====================================================================================

下面是從別人那轉過來的:

 

android兩個模擬器之間的UDP通訊

 

 

最近在作UDP、TCP通訊相關的項目,在作的過程當中發現:同一臺電腦的兩個模擬器之間不能通訊,

解決方法:
1. 運行模擬器
2. 打開window 命令行
    執行:telnet localhost 5554 或者是 telnet 127.0.0.1  5554 
   5554是模擬器的端口,執行以後會進入android console
3. 在console下執行:

redir add udp :端口號:端口號

例如:
   redir add udp:22221:22221
   其中,第一個端口號是模擬器1的端口,第二個端口號是模擬器2端口。(端口映射)
   執行此命令以後,會把模擬器 22221 端口發送的數據經過本機轉到模擬器的22221端口,就能從22221端口接收UDP數據包了

 

http://my.oschina.net/u/211111/blog/40117

 

 

TCPpc機與模擬器及模擬器之間通訊

 

進行TCP通訊的時候本機上啓動兩個模擬器,本機(PC)和模擬器時發現兩個模擬器的IP地址都是徹底同樣的,因此要實現兩個模擬器之間的通訊,使用模擬器的IP地址是辦不到的。必須進行端口映射。

    模擬器提供了一個特殊的IP,此IP的地址爲10.0.2.2,此IP地址能夠說等同於PC本機的IP地址127.0.0.1 。因此,經過此特殊IP地址,實現PC本機與模擬器的通訊是沒有問題。

首先 ,運行模擬器在命令行adb –s emulator -模擬器  forward  tcp:端口號 tcp:端口號(例如:adb –s emulator-5554 forward tcp:8080 tcp:8090)

PC-SERVER:ServerSocket server = new ServerSocket(8080);

模擬器-CLIENT:Socket socket = new Socket("10.0.2.2", 8090);

接下來是如何在兩個模擬器之間進行通訊:一樣的先進行端口映射:adb –s emulator -模擬器  forward  tcp:端口號 tcp:端口號(先運行模擬器).代碼以下:

adb –s emulator-5554 forward tcp:8080 tcp:8081

模擬器(5554)-SERVER:ServerSocket server = new ServerSocket(8080);

模擬器(5556)-CLIENT:Socket socket = new Socket("10.0.2.2", 8081);

ps:我以爲應該是:

 

模擬器(5554)-SERVER:ServerSocket server = new ServerSocket(8081);

模擬器(5556)-CLIENT:Socket socket = new Socket("10.0.2.2", 8080);

 

由於模擬器5556鏈接的地址10.0.2.2:8080至關於本機的127.0.0.1:8080,因爲進行了端口映射本機IP8080上的鏈接請求都映射到5554:8081上,所以模擬器5556的請求會發送到5554上.

 

http://my.oschina.net/u/211111/blog/40057

 

 

 

Android 與 PC 之間的通訊

 

當PC與手機連通時,咱們能夠經過Socket鏈接來實現PC與手機間的通訊。

 

這裏咱們先討論手機作爲Server端、PC作爲Client端的狀況。

 

和其餘Java Socket程序同樣,只須要定義一個SocketServer便可實現Server端的監聽,以下:

 

 

Java代碼   收藏代碼

  1. ServerSocket serverSocket = new ServerSocket(SOCKET_PORT);  

 

寫Java Socket的時候,咱們都知道,要連上這個Server,只須要知道Server的IP地址和Port號就能夠了。這裏由於手機是和PC相連的,所以麻煩就在於怎麼定位這個IP地址和Port號。

 

IP地址其實也就是本機地址,而port號則須要有一點點技巧,須要用到adb工具。查看adb幫助中,有一條forward命令能夠用於徹底任務:

 

Html代碼   收藏代碼

  1. adb forward <local> <remote> - forward socket connections  

  2.                                forward specs are one of:  

  3.                                  tcp:<port>  

  4.                                  localabstract:<unix domain socket name>  

  5.                                  localreserved:<unix domain socket name>  

  6.                                  localfilesystem:<unix domain socket name>  

  7.                                  dev:<character device name>  

  8.                                  jdwp:<process pid> (remote only)  

 使用以下:

 

adb forward tcp:Local_Port tcp:Remote_Port

 

也即將本地的Local_Port端口,映射爲Remote_Port端口,這裏的Remote_Port即爲上面的SOCKET_PORT。

 

因此Client代碼能夠以下實現:

 

Java代碼   收藏代碼

  1. String adb_path=....;  

  2.   

  3. Runtime.getRuntime().exec(adb_path + " forward tcp:LocalPort tcp:Remote_Port");  

  4.   

  5. Socket socket = new Socket("localhost", Local_Port);  

便可實現PC與Android之間的通訊。這裏注意Android端須要有網絡訪問的權限:

 

Java代碼   收藏代碼

  1. <uses-permission android:name="android.permission.INTERNET" />  

 

Android與PC機通信總結 :

1. 經過ADB接口進行通訊 
具體依據: 
 adb方式,須要安裝手機的usb驅動,直接程序中調用adb命令。 
 wifi是端口傳輸,也須要調用adb 
若是是經過 wifi進行交互,設置IP經過socket就能夠進行通訊了。若是是使用USB則須要使用adb裏面的端口重定向(端口重定向是指:在PC端經過SOCKET向手持機發送鏈接時,當PC嘗試鏈接本機的127.0.0.1:2525時,當使用重定向端口號後adb forward tcp:2525 tcp:2525時,當PC嘗試鏈接127.0.0.1:2525時,PC機會將發送此端口的數據轉發至手持機)。若是想經過SOCKET方式經過USB鏈接手持機,可能要寫一套適用的SOCKET 協議,還要補充一點的是:當把手機看成server端時則須要使用端口重定向,若是是把PC當SERVER時,則經過手持機能夠直接經過SOCKET鏈接便可 
2. PC客戶端與Android服務端的Socket同步通訊(USB),通信的具體過程及實現方法,請查看內嵌文件 

3. PC機做爲服務端與Android間的通訊,具體實現方法請查看內嵌文件 

 

http://zhaoshaofang.iteye.com/blog/1051548

 

 

android開發中,android虛擬機做爲服務器與pc客戶端實現socket網絡通信中,android虛擬機的ip是多少?

android施用的僅只施用了pc 裏邊的1個端口

ip天然就是127.0.0.1了,或者是localhost吧

關於5037口和5555口,找到了1個看起來合理的解釋:

adb(android debug bridge)包括三個部門:

1)adb client, 運行在pc上(爲ddms,即ide工做)

2)adb daemon(守護進程項), 運行於emulator(爲與emulator中的vm交互工做);

3)adb server(服務進程項), 運行在pc(任務管理器上有),管理着adb client和adb daemon的通信.server與client通信的端口是是5037,

adb server會與emulator交互的,施用的端口有兩個,1個是5554專門用於與emulator實例的鏈接,那末數據能夠從emulator轉發給ide控制檯了,另1個則是5555,專門與adb daemon鏈接爲後面調試施用。

127.0.0.1

從exlipse啓動的android虛擬機訪問本機上的ip:10.0.2.2

相關文章
相關標籤/搜索