`
warnerhit
  • 浏览: 123761 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

android socket通讯,PC和模拟器,两个模拟器之间的通信

阅读更多

 

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

我已经试验成功:

 ps:模拟器做服务器,PC机做客户端。如果通过wifi连接的话直接访问IP就行,不用重定向。

      PC访问模拟器用localhost即127.0.0.1, 模拟器 访问 模拟器用10.0.2.2

      本人已成功运行,看你的RP了- -

server:

 

/**
 * Server.java
 * @author wuzq
 * @create 2012-2-21
 */
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" />

 

 

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

下面是从别人那转过来的:

 

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

 


分享到:
评论
7 楼 lwq_net 2019-04-04  
内嵌文件在哪?
6 楼 新生无产者 2016-10-31  
看了楼主的文章,深受启发,感谢楼主
5 楼 pengqinping 2012-09-05  
楼主 有没有android 端 到 android 之建立于tcp传输 数据的例子(一个开启端口 另外一个 作为连接)
4 楼 duckbit 2012-07-23  
Android与PC机通讯总结 查看内嵌文件?
查看内嵌文件在哪里?
3 楼 lenomon 2012-04-06  
2 楼 cn23snyga 2012-03-23  
adb forward tcp:8080 tcp:8090
1 楼 cn23snyga 2012-03-23  

  

按照贵博的方法,的确可以连通 Android模拟器服务端-PC客户端。
膜拜!!!

相关推荐

    android socket编程源码—同一台PC的两个模拟器间的通信附详细文档

    二、在同一台PC上的两个模拟器通信 由于两个模拟器都运行在同一台PC上,它们可以通过本地环回地址(127.0.0.1)进行通信,这个地址代表了本机。因此,服务器端的ServerSocket会监听127.0.0.1的某个端口,而客户端的...

    android x86模拟器和PC相互通信(socket)

    综上所述,实现Android模拟器和PC之间的Socket通信需要在PC端编写服务程序,Android端编写客户端程序,通过指定的IP地址和端口进行通信。确保Android应用有网络访问权限,处理好异常,以及正确地打开和关闭Socket...

    androidstudio实现socket通讯

    Android通过socket套接字实现网络连接,通过ip地址和ip端口实现访问服务器,从而实现客户端和服务器的连接,然后实现两者数据的互连

    一个PC上的两个android模拟器间的通信

    android socket编程——两个模拟器间的通信(一台PC)

    Android 模拟器之间通信问题

    由于PC的6100端口已经映射到了模拟器(5554)的7100端口,因此,来自模拟器(5556)的连接请求会最终到达模拟器(5554),从而实现了两个模拟器之间的通信。 #### 七、总结 本文详细介绍了Android模拟器之间以及模拟器与...

    android模拟器和pc机之间TCP通信

    本文将深入探讨如何在Android模拟器和PC机之间实现TCP通信。TCP(Transmission Control Protocol)是一种面向连接的、可靠的传输协议,广泛用于互联网上的数据通信。在这个场景中,我们将PC机设置为服务器,而...

    Android应用源码安卓与PC的Socket通信项目java版及运行截图.rar

    总结起来,这个项目是一个学习和实践Android与PC间Socket通信的好例子,它涵盖了网络编程、Android应用开发和多线程处理等多个重要知识点。通过这个项目,开发者不仅可以了解如何在Android应用中使用Java进行网络...

    PC通过adb协议与android端通讯参考程序

    本教程将探讨如何通过adb协议实现PC与Android设备之间的通信,并特别关注使用ddmlib库来创建一个简单的socket通信示例。我们将讨论以下几个关键知识点: 1. ADB (Android Debug Bridge):ADB是Android系统提供的一...

    PC端与android端通信

    在这个场景中,通信分为两部分:Android服务端(作为socket服务器)和PC客户端(作为socket客户端)。Android服务端是一个后台运行的Service程序,监听特定端口(例如10086),等待接收来自PC的命令。当命令到达时,...

    Android应用源码安卓与PC的Socket通信项目java版.zip

    在本项目中,"Android应用源码安卓与PC的Socket通信项目java版.zip" 提供了一个实例,展示了如何使用Java编程语言在Android设备与个人计算机(PC)之间实现Socket通信。Socket是网络通信中的基本组件,它允许两个或...

    android socket编程

    本文主要探讨如何在Android中通过Socket实现两个模拟器之间的通信,特别是在一台PC上运行的情况。 首先,我们需要理解Android模拟器的网络环境。Android模拟器通过一个特殊的IP地址“10.0.2.15”来访问主机的网络...

    安卓socket通信

    在本教程中,我们将深入探讨如何在Android应用中使用Socket进行通信,以及如何在模拟器与个人计算机(PC)之间进行交互。 首先,理解Socket的基本概念是必要的。Socket是网络通信中的一个端点,可以看作是两台机器...

    Android 网络摄像头实现

    在Android网络摄像头应用中,Socket用于建立客户端(通常是监控设备)和服务器端(Android设备作为摄像头)之间的连接,传输视频流数据。 2. **服务器端实现**: 在Android设备上,我们需要创建一个服务器端Socket...

    Android2.doc

    在开发过程中,经常需要在Android模拟器(emulator)与个人计算机(PC)之间建立通信,以便于进行测试、调试或者实现某些特定功能。其中,Socket编程是一种常见的实现方式,它能够使两个应用程序在不同的设备上进行...

    appium简介&amp;架构&环境搭建网络下载无偿共享

    Appium的架构主要包括两个主要部分:服务器和客户端。服务器运行在开发者的机器上,接收来自客户端的测试指令,然后将这些指令转发给设备上的测试代理(如Android的UiAutomator或iOS的XCTest)。客户端可以是任何...

    【最新版】wechat_devtools_1.02.2004020.dmg【亲测可用】最好的微信开发者工具

    F 修复 PC 端模拟器的 touchend 事件回调参数 changedTouches 为空的问题 反馈详情 2020.03.25 更新说明 A 新增 云开发控制台支持开通按量付费 A 新增 云开发支持数据库备份与回档(还原)详情 A 新增 支持小...

Global site tag (gtag.js) - Google Analytics