我已经试验成功: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