`

实现Android手机(服务端)与PC(客户端)实现通信

阅读更多

本文在此基础上做了一些修改:http://blog.csdn.net/wufenglong/article/details/5778862

我主要是要通过在PC端发送命令控制手机作出相应的反应,比如界面的切换,屏幕的滑动。手机和PC通过Socket进行通信,手机作为服务端监听PC端的连接请求,连接成功后接受命令。所以在这里需要两个部分来实现,一个手机端和一个服务端。

1.手机端:在手机需要启动一个Service来监听PC端的Socket的连接请求,这个是不能放在Activity里面,否则程序会“死掉”的。在这里我通过一个Activity来启动Service的:

 

public class ServerActivity extends Activity {
    /** Called when the activity is first created. */
	Button start, stop;
	private static final String str = "edu.hdu.server.SERVICE";
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        start = (Button) findViewById(R.id.start);
        stop = (Button) findViewById(R.id.stop); 
        
        //创建启动service的Intent
        final Intent intent = new Intent();
        //为Intent设置Action属性
        intent.setAction(str);
        
        start.setOnClickListener(new OnClickListener()
        {
        	public void onClick(View arg0)
        	{
        		startService(intent);//启动对应的Service
        	}
        });
        
        stop.setOnClickListener(new OnClickListener()
        {
        	public void onClick(View arg0)
        	{
        		stopService(intent);//关闭对应的Service
        	}
        });
    }
}

下面是Service的实现:它的主要工作是侦听客户端的请求,并启动一个线程IOSocket来处理PC端发来的命令。里面有个Handler是用来处理IOSocket线程发来的消息的,实现屏幕的切换:

 

public class AndroidService extends Service{
	
	public static Boolean mainThreadFlag = true;
	public static Boolean ioThreadFlag = true;
	ServerSocket serverSocket = null;
	final int SERVER_PORT = 10086;
	private int currentId = 0;
	//这个Handler用来处理IOSocket线程发来的消息
	Handler handler = new Handler()
	{
		public void handleMessage(Message msg)
		{
			if (msg.what == 0x1)
			{
				if (currentId > 2)
				{
					currentId = 0;
				}
				if (currentId == 0)
				{
					currentId++;
					Intent intent = new Intent(AndroidService.this,FirstActivity.class);
					intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
					startActivity(intent);
				}
				else if (currentId == 1)
				{
					currentId++;
					Intent intent = new Intent(AndroidService.this,SecondActivity.class);
					intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
					startActivity(intent);
				}
				else if (currentId == 2)
				{
					currentId++;
					Intent intent = new Intent(AndroidService.this,ServerActivity.class);
					intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
					startActivity(intent);
				}
			}
		}
	};
	
	public IBinder onBind(Intent arg0)
	{
		return null;
	}
	
	public void onCreate()
	{
		System.out.println("Service is created");
		super.onCreate();
		new Thread()
		{
			public void run()
			{
				doListen();
			};
		}.start();
	}
	
	private void doListen()
	{
		serverSocket = null;
		try
		{
			serverSocket = new ServerSocket(SERVER_PORT);
			
			boolean mainThreadFlag = true;
			while (mainThreadFlag)
			{  //侦听有没有来自客户端的连接,没有连接一直阻塞在这里
				Socket client = serverSocket.accept();
				
				new Thread(new IOSocket(handler, client)).start();
			}
		}catch(IOException e)
		{
			e.printStackTrace();
		}
	}
	
	public void onDestory()
	{
		super.onDestroy();
		
		//关闭线程
		mainThreadFlag = false;
		ioThreadFlag = false;
		//关闭服务器
		try
		{
			serverSocket.close();
		}catch (IOException e)
		{
			e.printStackTrace();
		}
	}
	
	public int onStartCommand(Intent intent, int flags, int startId)
	{
		super.onStartCommand(intent, flags, startId);
		return START_STICKY;
	}
}

类IOSocket用来处理PC端的命令,并根据命令向主线程发送消息:

 

public class IOSocket implements Runnable{
	private Handler handler;
	private Socket client;
	
	
	public IOSocket(Handler handler, Socket client)
	{
		this.handler = handler;
		this.client = client;
	}
	
	public void run()
	{
		//BufferedOutputStream out;
		BufferedInputStream in;
		try
		{
			
			//out = new BufferedOutputStream(client.getOutputStream());
			in = new BufferedInputStream(client.getInputStream());
			//PC端发来的命令
			String order = "";
			//测试socket
			AndroidService.ioThreadFlag = true;
			while (AndroidService.ioThreadFlag)
			{
				try
				{
					if (!client.isConnected())
					{
						break;
					}
					
					
					//读取PC发送过来的命令
					order = readCMDFromSocket(in);
					
					/* 根据命令分别处理数据 */
					if (order.equals("switch")) 
					{
						Message msg = new Message();
						msg.what = 0x1;
						handler.sendMessage(msg);
						//out.write("OK".getBytes());
						//out.flush();
					} 
					else if (order.equals("otherOrder")) 
					{
						//out.write("OK".getBytes());
						//out.flush();
					} 
					else if (order.equals("exit")) 
					{

					}
				}catch (Exception e)
				{
					e.printStackTrace();
				}
			}
			//out.close();
			in.close();
		}catch(Exception e)
		{
			e.printStackTrace();
		}finally
		{
			try
			{
				if (client != null)
				{
					client.close();
				}
			}catch(IOException e)
			{
				e.printStackTrace();
			}
		}
	}
	/* 读取命令 */
	public static String readCMDFromSocket(InputStream in) 
	{
		int MAX_BUFFER_BYTES = 2048;
		String msg = "";
		byte[] tempbuffer = new byte[MAX_BUFFER_BYTES];
		try 
		{
			int numReadedBytes = in.read(tempbuffer, 0, tempbuffer.length);
			msg = new String(tempbuffer, 0, numReadedBytes, "utf-8");
			tempbuffer = null;
		} catch (Exception e) 
		{
			e.printStackTrace();
		}
		return msg;
	}

}

PC端的代码比较简单。


分享到:
评论

相关推荐

    PC客户端与Android服务端的Socket同步通信.docx

    本文档将详细介绍如何通过Socket同步通信技术,实现PC客户端与Android服务端的数据交换。该文档不仅包括了理论知识,还提供了具体的实践案例和技术难点解析。 #### 需求分析 本项目的需求主要包括两个方面: 1. *...

    PC客户端与Android服务端的Socket同步通信

    ### PC客户端与Android服务端的Socket同步通信 #### 需求分析 在现代移动设备与个人电脑(PC)之间的通信中,实现稳定的双向数据传输变得越来越重要。本篇将详细介绍如何构建一个基于Socket的同步通信系统,其中...

    android聊天室客户端与服务端(PC)代码

    服务器端是基于PC平台的,这通常意味着使用了如Java或C#等编程语言来实现,而客户端则是针对Android设备设计的,所以使用的是Android Studio开发环境和Java或Kotlin编程语言。 **Android客户端** Android客户端...

    PC客户端与Android服务端的Socket同步通信(USB) demo

    标题中的“PC客户端与Android服务端的Socket同步通信(USB)demo”指的是一个示例项目,它演示了如何使用Socket编程实现PC(个人计算机)与Android设备通过USB接口进行双向通信。这种通信方式通常用于开发者调试、...

    socket pc服务端与手机客户端互通

    在本场景中,我们将探讨如何利用Socket实现PC服务端与Android手机客户端的互通。 首先,我们需要了解Socket的基本概念。Socket,通常被称为套接字,是网络通信的一种接口,它允许两个应用程序通过网络进行数据交换...

    Android客户端与PC服务器实现Socket通信

    "Android 客户端与 PC 服务器实现 Socket 通信" Android 客户端与 PC 服务器实现 Socket 通信是基于 TCP 协议的网络虚拟链路的建立和维护。该实现过程分为两部分:PC 服务器端和 Android 客户端。 PC 服务器端使用...

    PC客户端与Android服务端的Socket同步通信(USB)

    在IT领域,尤其是在移动设备和桌面系统的交互中,"PC客户端与Android服务端的Socket同步通信(USB)"是一个重要的技术主题。这个话题涉及到多个关键知识点,包括Android的USB通信、Socket编程以及客户端-服务器架构...

    android聊天室(带服务端,PC输入界面)

    关键点在于它不仅包含Android客户端,还具备服务端和PC客户端,这意味着用户可以通过Android设备进行聊天,并且服务端能够处理来自PC端的输入,实现了跨平台的通信。 【描述分析】 描述提到"此demo为android聊天室...

    Android客户端与pc服务端程序

    在IT领域,构建Android客户端与PC服务端程序的交互是常见的任务,这涉及到移动设备与桌面系统的通信,以便实现数据的共享和交换。本项目主要关注Android应用如何连接到PC上的服务端,通过访问数据库(如MySQL和...

    PC客户端与Android服务端的Socket同步通信 实例

    PC客户端与Android服务端的Socket同步通信,虽然不到20页的实例讲解,但是非常的经典,不要多分,仅仅1分

    基于C#的KTV系统源码(服务端、PC+Android手机端).zip

    本篇将深入探讨一个基于C#的KTV系统,包括服务端、PC客户端以及Android手机端的实现细节,旨在为学习C#和毕业设计的同学提供参考。 一、服务端开发 1. **服务端架构**:通常,服务端采用三层架构,包括表示层(UI)...

    Android客户端与pc服务端程序demo

    本项目提供的"Android客户端与pc服务端程序demo"是一个很好的学习资源,旨在帮助开发者理解如何实现这两者之间的通信。下面将详细介绍这个demo涉及的关键知识点。 1. **Android客户端**: - **HTTP通信**:在这个...

    android基于WiFi的socket客户端和服务器端

    在Android平台上实现基于WiFi的Socket通信,涉及到网络编程的核心概念,包括TCP/IP协议、套接字(Socket)以及客户端(Client)与服务器端(Server)的交互。本篇将详细阐述这些知识点,并以"SocketServer"和"Socket...

    Android与PC使用蓝牙通信

    本教程主要探讨的是如何利用Java在PC端建立一个服务端,并与Android设备进行蓝牙通信,实现多设备同时连接和数据传输的功能。 首先,我们需要理解蓝牙通信的基本原理。蓝牙是一种短距离无线通信技术,它允许设备...

    linux下基于Bluez实现蓝牙SPP服务端demo

    基于Bluez实现了蓝牙串口通信,用来与手机端,pc端传输数据。蓝牙模块服务多种多样,这个小demo实现了linux下建立蓝牙服务端的demo,并带了一个客户端测试。 使用时,可通过两台设备,分别作为服务端可客户端,连接...

    android客户端连接pc服务端

    通过上述分析可以看出,`SocketConnect.java`主要实现了通过Socket在Android客户端与PC服务端之间建立连接的功能。它通过按钮触发连接动作,然后通过输入框获取用户输入的信息,并将这些信息发送到指定的IP地址和...

    KTV系统(服务端、PC+Android手机端).7z

    PC客户端通过WebSocket或其他长连接协议与服务端保持实时通信,实现快速响应用户操作。 3. Android手机端应用 随着移动设备的普及,Android手机端应用成为KTV系统的重要补充。开发者通常使用Java或Kotlin语言,...

    android客户端_PC服务端

    在Android客户端与PC服务端通信的过程中,通常会采用网络编程技术来实现数据的交互。这里主要涉及到了Socket连接,这是TCP/IP协议栈中用于应用程序之间建立全双工、面向连接的通信方式。以下是对Android客户端连接PC...

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

    在Android开发中,有时我们需要实现Android模拟器与个人计算机(PC)之间的通信,这通常涉及到网络编程中的Socket通信。在本场景中,我们将探讨如何利用Android的Socket API来实现这一功能,具体步骤如下: 首先,...

Global site tag (gtag.js) - Google Analytics