一、这是一篇英文论文,介绍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();
}
}
}