我已經試驗成功:java
ps:模擬器作服務器,PC機作客戶端。若是經過wifi鏈接的話直接訪問IP就行,不用重定向。android
PC訪問模擬器用localhost即127.0.0.1, 模擬器 訪問 模擬器用10.0.2.2windows
本人已成功運行,看你的RP了- -服務器
server:網絡
/** dom
* Server.java socket
* @author wuzq tcp
* @create 2012-2-21 ide
*/
package com.warner.client;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.Console;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
public class G3ExpPCclient {
public static final String adb_path= "E:\\android-sdk-windows\\tools\\adb ";//adb所在路徑
private static final String HOST = "localhost";
private static final int PORT = 8080;
private Socket socket = null;
private BufferedReader in = null;
private PrintWriter out = null;
public G3ExpPCclient() {
try {
socket = new Socket(HOST, PORT);
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
} catch (IOException ex) {
ex.printStackTrace();
System.out.println("login exception" + ex.getMessage());
}
}
public void openUrl(String msg) {
if (socket.isConnected()) {
if (!socket.isOutputShutdown()) {
out.println(msg);
}
}
}
public static void main(String[] args) {
try {
//把虛擬機的8090端口綁定到PC本機的8080端口,這樣當PC向8080發送數據時其實是發到虛擬機的8090端口
//Runtime.getRuntime().exec(G3ExpPCclient.adb_path + " –s emulator-5554 forward tcp:8080 tcp:8090");這個方法很差用
Runtime.getRuntime().exec(G3ExpPCclient.adb_path + " forward tcp:8080 tcp:8090");//這個好用
System.out.println("已經將虛擬機端口8090綁定到PC端口8080 "+adb_path);
} catch (IOException e1) {
e1.printStackTrace();
}
G3ExpPCclient pc = new G3ExpPCclient();
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
while (true) {
String msg="";
try {
msg = br.readLine();
System.out.println("將打開:" + msg); //輸入完整路徑http://www.baidu.com
} catch (IOException e) {
e.printStackTrace();
}
if (msg.equals("exit")) {
System.out.println("退出");
System.exit(-1);
} else {
pc.openUrl(msg);
}
}
}
}
client:
/**
* G3Exp.java
* @author wuzq
* @create 2012-2-21
*/
package com.warner.activity;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.widget.TextView;
public class G3Exp extends Activity {
// 定義偵聽端口號
private final int SERVER_PORT = 8090;
private TextView textView;
private String content = "";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.g3exp);
textView = (TextView)findViewById(R.id.g3_msg);
// 開一個新的線程來偵聽客戶端鏈接及發來的信息和打開相應網站
new Thread() {
public void run() {
startServer();
}
}.start();
}
private void startServer() {
try {
//ServerSocket serverSocket = new ServerSocket(SERVER_PORT);
ServerSocket serverSocket = new ServerSocket(SERVER_PORT);
// 循環偵聽客戶端鏈接請求
while (true) {
Socket client = serverSocket.accept();
try {
Log.e("hehheh", "有人來訪:");
// 等待客戶端發送打開網站的消息
BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
String str = in.readLine();
content += str+"\n";
mHandler.sendMessage(mHandler.obtainMessage());
openUrl(str);
} catch (Exception e) {
e.printStackTrace();
} finally {
client.close();
}
Thread.sleep(3000);
}
} catch (Exception e) {
e.printStackTrace();
}
}
private void openUrl(String url) {
Uri uri = Uri.parse(url);
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);
}
public Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
super.handleMessage(msg);
textView.setText(textView.getText().toString()+content);
}
};
}
別忘了加:<uses-permission android:name="android.permission.INTERNET" />
=====================================================================================
下面是從別人那轉過來的:
最近在作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
進行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
當PC與手機連通時,咱們能夠經過Socket鏈接來實現PC與手機間的通訊。
這裏咱們先討論手機作爲Server端、PC作爲Client端的狀況。
和其餘Java Socket程序同樣,只須要定義一個SocketServer便可實現Server端的監聽,以下:
ServerSocket serverSocket = new ServerSocket(SOCKET_PORT);
寫Java Socket的時候,咱們都知道,要連上這個Server,只須要知道Server的IP地址和Port號就能夠了。這裏由於手機是和PC相連的,所以麻煩就在於怎麼定位這個IP地址和Port號。
IP地址其實也就是本機地址,而port號則須要有一點點技巧,須要用到adb工具。查看adb幫助中,有一條forward命令能夠用於徹底任務:
adb forward <local> <remote> - forward socket connections
forward specs are one of:
tcp:<port>
localabstract:<unix domain socket name>
localreserved:<unix domain socket name>
localfilesystem:<unix domain socket name>
dev:<character device name>
jdwp:<process pid> (remote only)
使用以下:
adb forward tcp:Local_Port tcp:Remote_Port
也即將本地的Local_Port端口,映射爲Remote_Port端口,這裏的Remote_Port即爲上面的SOCKET_PORT。
因此Client代碼能夠以下實現:
String adb_path=....;
Runtime.getRuntime().exec(adb_path + " forward tcp:LocalPort tcp:Remote_Port");
Socket socket = new Socket("localhost", Local_Port);
便可實現PC與Android之間的通訊。這裏注意Android端須要有網絡訪問的權限:
<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