Android和PC通信

一、这是一篇英文论文,介绍Android远程控制PC的,或许会提供一些思路::-D

http://www.ipcsit.com/vol37/015-ICINT2012-I090.pdf


二、Android和PC之间用Socket(客户端)和ServerSocket(服务端)通信,自己遇到的两个问题:

1、要在.xml配置文件中加上网络访问权限<uses-permission android:name="android.permission.INTERNET"/>

不然就会报访问被拒绝的错误:

W/System.err(10390): java.net.SocketException: socket failed: EACCES (Permission denied)


2、在加上网络访问权限之后,还是没有实现通信,报错信息如下:

android.os.NetworkOnMainThreadException

贴到网上查了一下发现是Android版本的问题,网上说Android4.0之后在主线程中执行Http请求都会报这个错,应该是怕请求时间过长会出现页面无响应。因此,通过开启一个单独的线程执行http请求来解决这个问题。

贴上自己的代码:

Android端

public class ClientActivity extends Activity {
	
	  InetAddress serverAddr;
	  Socket socket = null;
	  String message = "";
		@Override
		protected void onCreate(Bundle savedInstanceState) {
		  // TODO Auto-generated method stub
		  super.onCreate(savedInstanceState);
		  new Thread(runnable).start();
		  
		}
		Runnable runnable = new Runnable(){
	      public void run(){
	    	  try {
	   		   serverAddr = InetAddress.getByName("172.22.173.1");
	   		   Log.d("TCP", "C: Connecting...");
	   		   
	   		   // 与服务器获取连接
	   		   socket = new Socket(serverAddr, 37716);
	   		   message = "Hello eoeandroid !";
	   		  } catch (UnknownHostException e1) {
	   		   // TODO Auto-generated catch block
	   		   e1.printStackTrace();
	   		  }// TCPServer.SERVERIP
	   		  catch (IOException e) {
	   		   // TODO Auto-generated catch block
	   		   e.printStackTrace();
	   		  }
	   		  
	   		  try {
	   		   Log.d("TCP", "C: Sending: '" + message + "'");
	   		   
	   		   // 获取Client端的输出流
	   		   PrintWriter out = new PrintWriter(new BufferedWriter(
	   		     new OutputStreamWriter(socket.getOutputStream())), true);
	   		   out.println(message);
	   		  } catch (Exception e) {
	   		   Log.e("TCP", "S: Error", e);
	   		  } finally {
	   		   try {
	   		    socket.close();
	   		   } catch (IOException e) {
	   		    // TODO Auto-generated catch block
	   		    e.printStackTrace();
	   		   }
	   		  }
	   		}
		};
}
PC端:

public class PCServer implements Runnable{
	
	 	 
	    ServerSocket serverSocket;  
	    Socket socket[];  		
	
		public PCServer(){  
	        new Thread(this).start(); 
		}  
		public static void main(String[] args) {  
		    new PCServer();  
		  
		}  
		
		public void run() {
		  try {
			  System.out.println("connecting.......");
		   serverSocket = new ServerSocket(37716);//在37716端口进行侦听 
		   // 不断获取与客户端的连接(允许与多个客户端进行连接)
		   while (true) {
		    // 获取与一个客户端的连接
		    Socket client = serverSocket.accept();
		    System.out.println("S: Receiving...");
		    try {
		     // 获取与某个连接上的客户端的输入流
		     BufferedReader in = new BufferedReader(
		       new InputStreamReader(client.getInputStream()));
		     String clientConent = in.readLine();
		     
		     // 打印出服务端接收的客户端的信息
		     System.out.println("Client:  " + clientConent );
		    } catch (Exception e) {
		     System.out.println("Server Receive: Error");
		     e.printStackTrace();
		    } finally {
		     client.close();
		     System.out.println("Server Receive: Done.");
		    }
		   }
		  } catch (Exception e) {
		   System.out.println("S: Error");
		   e.printStackTrace();
		  }
		}		
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值