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

解决Android模拟器(客户端)与PC(服务器端)之间的socket通信

 
阅读更多
1、创建一个模拟器(API level小于等于10,当时选择了很多模拟器,只有模拟器的android版本较低时,可以测试通,具体原因也不知道为什么),建立模拟器的截图如下:

2、服务器端代码如下:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
 * 服务器端
 * @author 王颖
 */
public class MultiThreadServer {
	private static int port = 5000;//端口号
	private ServerSocket serverSocket;
	private ExecutorService executorService; //线程池
	private final int POOL_SIZE = 10; //单个CPU线程池大小
	
	
	public MultiThreadServer(){
		try {
			serverSocket = new ServerSocket(port);
			//Runtime的availableProcessor()返回当前系统的CPU个数
			executorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()*POOL_SIZE);
			System.out.println("服务器启动....");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	public void service(){
		while(true){
			Socket socket = null;
			try {
				socket = serverSocket.accept();
				executorService.execute(new Handler(socket));//在未来的某个时间执行给定命令
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
		}
	}
	
	
	public static void main(String[] args) {
		MultiThreadServer multi = new MultiThreadServer();
		multi.service();
		
	}
	
}

class Handler implements Runnable{
	
	private Socket socket;
	public Handler(Socket socket){
		this.socket = socket;
	}
	
	public BufferedReader getReader(Socket socket){
		InputStream socketIn = null;
		try {
			socketIn = socket.getInputStream();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return new BufferedReader(new InputStreamReader(socketIn));
	}	
	
	public BufferedWriter getWriter(Socket socket){
		OutputStream socketOut = null;
		try {
			socketOut = socket.getOutputStream();
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return new BufferedWriter(new OutputStreamWriter(socketOut));
	}
	
	public void run(){
		BufferedReader br = getReader(socket);
		BufferedWriter bw = getWriter(socket);
		String msg = "";
		boolean flag = false;//读
		try {
			System.out.println("等待客户端发来的信息.....");
			
			while((msg = br.readLine()) != null){
				System.out.println(msg);
				flag = true;
			}
			if(!flag){
				bw.write("服务器发来的信息");
			}
			

		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			try{
				if(br != null){
					br.close();
				}
				if(bw != null){
					bw.close();
				}
				if(socket != null){
					socket.close();
				}				
			}catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
			
		
	}
}

3、客户端代码如下:
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
/**
 * 客户端
 * @author 王颖
 *
 */
public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		//响应确认按钮事件
		
		Button sure = (Button)findViewById(R.id.sure);
		sure.setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				EditText port_Text = (EditText)findViewById(R.id.port_info);

				String port = port_Text.getText().toString();
				Toast.makeText(MainActivity.this, port, Toast.LENGTH_SHORT).show();
				
				if(sendMsg("10.0.2.2",port,"info from AVD")){
//					if(sendMsg("10.20.61.61",port,"info from AVD")){//也可
					Toast.makeText(MainActivity.this, "发送成功!", Toast.LENGTH_SHORT).show();
				}else{
					Toast.makeText(MainActivity.this, "发送失败", Toast.LENGTH_SHORT).show();
				}
			}
		});

	}
	
	
    /*
	 *向服务器发送信息
	 */
	public boolean sendMsg(String ip, String port , String msg){
		try
    	{
	    	int port1 = Integer.parseInt(port);
			Toast.makeText(MainActivity.this, "socket通信的端口号:" + port1, Toast.LENGTH_SHORT).show();
			Socket socket= new Socket(ip,port1);
	     	BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
//	     	System.out.println("");
	     	bw.write(msg);
	     	bw.newLine();//防止阻塞
	     	bw.flush();
	     	bw.close();
	    	socket.close();
	    	return true;
    	}
    	catch(UnknownHostException e)
    	{
    		Log.e("UnknownHostException", "来自客户端信息");
    		e.printStackTrace();
    		return false;
    	} catch (IOException e) 
    	{
    		Log.e("IOException", "来自客户端信息");
    	    e.printStackTrace();
    	    return false;
        }
	}
	

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

}

4、重点:在Mainfest文件中添加网络访问权限
<uses-permission android:name="android.permission.INTERNET" >
</uses-permission>

5、测试结果截图如下

  • 大小: 23.6 KB
  • 大小: 152.1 KB
分享到:
评论

相关推荐

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

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

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

    本项目聚焦于在同一台PC上运行的两个Android模拟器之间的Socket通信,这对于开发和测试分布式应用程序或需要设备间通信的场景非常有用。以下是关于这个主题的详细解释: 一、Android Socket基础 Socket是网络通信的...

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

    在本项目中,"Android应用源码安卓与PC的Socket通信项目java版及运行截图.rar",我们将探讨如何实现Android设备与个人计算机(PC)之间的通信,主要利用Java的Socket编程技术。Socket通信是一种基于TCP/IP协议的网络...

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

    在PC端,我们将创建一个服务器端Socket,监听特定的端口,等待来自Android模拟器的连接请求。这通常涉及以下步骤: 1. 导入必要的Java套接字库:`import java.net.ServerSocket;` 和 `import java.net.Socket;` 2. ...

    Android手机与pc的socket通信

    本文将详细探讨如何实现Android设备与PC之间的Socket通信。Socket,又称为套接字,是网络编程的基本组件,它提供了进程间通信的能力,使得运行在不同设备上的应用程序能够相互通信。 首先,我们需要理解Socket通信...

    PC端与android端通信

    【PC端与Android端通信】是指在个人计算机(PC)和Android设备之间建立通信链路,以便进行数据传输或控制指令的交互。这种通信通常利用USB接口,通过adb(Android Debug Bridge)工具实现。adb是Android开发环境中的...

    android模拟机与PC通信实例

    在Android模拟器中,与PC进行通信通常涉及到网络编程,主要使用的是Socket通信技术。这里的实例展示了如何在Android客户端和PC服务器端通过TCP/IP协议进行数据传输。下面将详细讲解这个过程。 首先,Android客户端...

    android+pc socket通信.rar

    2. **PC服务器端实现**: - **创建ServerSocket**:在PC上,我们需要创建一个ServerSocket来监听特定的端口,等待客户端连接。例如,`ServerSocket serverSocket = new ServerSocket(端口号);` - **接受连接**:...

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

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

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

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

    安卓socket通信

    - **端口映射**:默认情况下,Android模拟器的端口与主机上的相同。例如,如果服务器在主机的8080端口监听,那么在模拟器中也要连接到8080端口。 4. **示例代码**: - 服务器端(Java): ```java ServerSocket...

    android socket编程

    在Android平台上进行网络编程时,Socket通信是一种常用的技术,它允许设备之间进行数据交换。本文主要探讨如何在Android中通过Socket实现两个模拟器之间的通信,特别是在一台PC上运行的情况。 首先,我们需要理解...

    Android 简单通讯源码:手机控制PC的关机、重启、.zip源码资源下载

    - Android应用需要获取网络权限,通过Socket编程或者使用HTTP库(如OkHttp或Retrofit)与PC服务器进行数据交换。 4. **服务器端实现**: - 在PC端,需要有一个服务器程序监听来自Android客户端的请求。这可能是一...

    Android2.doc

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

    Socket编程源码(与PC通讯)

    如果是在模拟器或真机上测试,可能需要使用“10.0.2.2”作为服务器IP,这是Android模拟器对localhost的映射。 为了实现Android应用,你需要创建一个新的Android项目,并在活动中实现Socket通信逻辑。可以创建线程或...

    Android简单通讯源码:手机控制PC的关机、重启、.rar

    - **服务器端脚本/应用**:PC端需要一个监听特定端口的服务器程序,接收来自Android客户端的指令并执行相应操作,如Python的socket服务器或Java的Socket服务器。 - **命令行接口(CLI)**:服务器端可能需要通过...

    Android 网络摄像头实现

    在Android设备上,我们需要创建一个服务器端Socket来监听特定端口,等待客户端的连接请求。一旦连接建立,服务器端将开始接收客户端发送的控制命令,并向客户端发送视频流数据。这个过程可能涉及到多线程处理,确保...

    Android源码——简单通讯源码:手机控制PC的关机、重启、.7z

    6. **PC服务器端开发**:在PC端,你需要一个服务器程序接收并解析来自Android的请求,然后执行相应的操作。这可以使用Java的ServerSocket类,或者其他服务器端框架如Node.js、Python的Flask或Django等实现。 7. **...

    安卓Android源码——Android应用源码之 实现远程控制PC源代码.zip

    开发者可能使用Socket编程来创建客户端-服务器模型,实现数据的双向传输。在Android中,网络访问通常需要在主线程之外进行,以避免阻塞UI,因此需要了解AsyncTask或者IntentService等异步处理机制。 3. **JNI(Java ...

Global site tag (gtag.js) - Google Analytics