把手机作为移动鼠标、键盘使用非常方便,本文将实现这一功能。该应用分为两部分:Windows服务端和Android客户端。
本文源代码的下载地址:。
Windows服务端的工程目录如下:
fMain是服务端的主界面,tListen是服务端的监听线程,tReceive是服务端的接收线程。
Android客户端的工程目录如下:
MainActivity是客户端的主Activity,ConnectThread是客户端的连接线程,SendThread是客户端的发送线程。
Java语言的通信有Socket(套接字)和HTTP两种方式,其中Socket(套接字)又分为TCP和UDP。TCP是面向连接的、可靠的通信方式,UDP是无连接的通信方式。
TCP通信方式的服务端采用ServerSocket进行监听,客户端采用Socket发出连接请求。当ServerSocket收到连接请求时,调用accept()方法返回一个Socket和客户端的Socket建立连接并通信。
本文采用TCP实现了Android移动设备和Windows计算机的连接,计算机作为服务器端监听,移动设备作为客户端,向计算机发出连接请求。
Windows端监听线程tListen.java的代码如下:
import java.net.InetAddress;import java.net.ServerSocket;import java.net.Socket;public class tListen extends Thread{ public static ServerSocket ssct_server; public static Socket sct_server; public static InetAddress ip_server; public static Integer pt_server; // 线程变量 public static tReceive t_receive; // 本机IP和PORT public tListen(InetAddress ip, int port){ this.ip_server = ip; this.pt_server = port; } public void run(){ // 开始监听 try { fMain.l_status.setText("状态:正在监听客户端......"); ssct_server = new ServerSocket(pt_server,2,ip_server); sct_server = ssct_server.accept(); fMain.l_status.setText("状态:已经连接上客户端!"); fMain.set_btn(0, 1); // 启动接收线程 t_receive = new tReceive(sct_server); t_receive.start(); } catch (Exception e0) { fMain.l_status.setText("错误:" + e0); if (ssct_server != null) try { ssct_server.close(); } catch (Exception e1) { fMain.l_status.setText("错误:" + e1); } } }}
ssct_server = new ServerSocket(pt_server,2,ip_server)监听ip_server地址的pt_server端口,当收到客户端的连接请求时,sct_server = ssct_server.accept()接受连接请求,并返回一个socket和客户端通信。
Android端连接线程ConnectThread.java的代码如下:
package com.hzhi.mouse_mb;import java.net.Socket;import android.os.Bundle;import android.os.Message;import android.widget.Toast;public class ConnectThread extends Thread{ public static Socket socket_client; public static String ip_server; public static int port_server; // 消息变量 private Message msg; private Bundle bdl; public ConnectThread(String ip, int pt){ this.ip_server = ip; this.port_server = pt; } public void run(){ try { socket_client = new Socket(ip_server, port_server); send_message(MainActivity.msg_con_stop, ""); } catch(Exception e) { send_message(MainActivity.msg_error, e.getMessage()); } } // 发送消息(用于更新UI) public void send_message(int x, String s){ msg = new Message(); bdl = new Bundle(); bdl.putString("1",s); msg.what = x; msg.setData(bdl); MainActivity.main_handler.sendMessage(msg); } }
socket_client = new Socket(ip_server, port_server)向地址为ip_server、端口为port_server的服务器发出连接请求,如连接成功,使用socket_client和服务器的Socket进行通信。