基于TCP和多线程实现无线鼠标键盘-Socket(1)
把手机作为移动鼠标、键盘使用非常方便,本文将实现这一功能。该应用分为两部分:Windows服务端和Android客户端。
本文源代码的下载地址:http://download.csdn.net/detail/k_c_u_f/6673245。
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进行通信。
基于TCP和多线程实现无线鼠标键盘-Socket(1)的更多相关文章
- 基于TCP和多线程实现无线鼠标键盘-Socket(2)
		
在(1)中,实现了Windows服务端与Android客户端的连接,本节将实现在Windows服务端与Android客户端之间传递数据. Android客户端的发送线程SendThread.java代 ...
 - 基于TCP和多线程实现无线鼠标键盘-GestureDetector
		
为了实现无线鼠标,需要识别出用户在手机屏幕上的滑动动作,这就需要用到GestureDetector类. 首先是activity_main.xml: <LinearLayout xmlns:and ...
 - 基于TCP和多线程实现无线鼠标键盘-Robot
		
Windows端收到Android端传递来的键盘或鼠标操作信息以后,需要根据这些信息操作鼠标或键盘,这就需要用到java.awt.Robot类,该类用于控制鼠标或键盘. 在Java主窗体中定义: pu ...
 - 基于TCP和多线程实现无线鼠标键盘-InputMethodManager
		
为了实现无线键盘的功能,使用了InputMethodManager弹出软键盘. // 弹出软键盘 public void pop_keyboard(){ imm = (InputMethodManag ...
 - 基于tcp和多线程的多人聊天室-C语言
		
之前在学习关于网络tcp和多线程的编程,学了知识以后不用一下总绝对心虚,于是就编写了一个基于tcp和多线程的多人聊天室. 具体的实现过程: 服务器端:绑定socket对象->设置监听数-> ...
 - 网络编程(二)--TCP协议、基于tcp协议的套接字socket
		
一.TCP协议(Transmission Control Protocol 传输控制协议) 1.可靠传输,TCP数据包没有长度限制,理论上可以无限长,但是为了保证网络的效率,通常TCP数据包的长度不会 ...
 - 网络编程(二)——TCP协议、基于tcp协议的套接字socket
		
TCP协议与基于tcp协议的套接字socket 一.TCP协议(流式协议) 1.可靠传输,TCP数据包没有长度限制,理论上可以无限长,但是为了保证网络的效率,通常TCP数据包的长度不会超过IP数据包的 ...
 - 基于TCP协议的项目架构之Socket流传输的实现
		
项目背景 某银行的影像平台由于使用时间长,服务器等配置原因,老影像系统满足不了现在日益增长的数据量的需求,所以急需要升级改造.传统的影像平台使用的是Oracle数据库和简单的架构来存储数据(视频.图 ...
 - 基于tcp的下载文件,以及struct模块的应用。
		
一 基于TCP的下载 客户端: from socket import * import os def main(): tcp_socket = socket(AF_INET, SOCK_STREAM) ...
 
随机推荐
- windows批处理总结
			
rem echo off 表示之后所有命令行不显示,但命令结果总是会显示的!! 不存在%ROOT_DIR% . %CUR_DIR%的变量 rem @表示命令行不显示当前行,但命令结果总是会显示的!! ...
 - 我心中的核心组件(可插拔的AOP)~消息组件~完善篇
			
回到目录 为什么要有本篇文章 本篇文章主要实现了RTX消息生产者,并且完成了整体的设计方式,之前在设计时消息生产者全局使用单一的生产方式,即一个项目里使用了Email就不能使用SMS,这种设计方法和实 ...
 - Atitit 理解Monad attilax总结
			
Atitit 理解Monad attilax总结 但函数式编程最大的一个问题是,函数是一个数学抽象,在现实世界中不存在,1 那既然这样就够用了,还要 Monad 干嘛?Monad 的作用在这里就体现出 ...
 - 常用Math 方法
			
/** * * @authors Your Name (you@example.org) * @date 2016-11-18 11:26:44 * @version $Id$ */ Math.pow ...
 - Test Design Guidelines for Reusability
			
Last Updated: JAN.10.2008 From: http://safsdev.sourceforge.net/sqabasic2000/TestDesignGuidelines.htm ...
 - JTMz换路径导致MySQL服务不能启动的问题
			
问题: JTMz解压到我的机器上,运行一次后,把服务停止了,然后移到了另外一个路径,JTMz中自带的MySQL服务启动不起来了. 解决: 在注册表中修改 HKEY_LOCAL_MACHINE\SYST ...
 - 找到SQL Server数据库历史增长信息
			
很多时候,在我们规划SQL Server数据库的空间,或向存储方面要空间时,都需要估算所需申请数据库空间的大小,估计未来最简单的办法就是看过去的趋势,这通常也是最合理的方式. 通常来讲 ...
 - DOM对象模型四大基本接口
			
本文向大家描述一下DOM对象模型的四个基本接口,在DOM对象模型接口规范中,有四个基本的接口:Document,Node,NodeList以及NamedNodeMap. 在DOM对象模型接口规范中,有 ...
 - MyEclipse使用总结——MyEclipse10安装SVN插件
			
一.下载SVN插件subclipse 下载地址:http://subclipse.tigris.org/servlets/ProjectDocumentList?folderID=2240 在打开的网 ...
 - kqueue用法简介
			
1.什么是kqueue和IO复用 kueue是在UNIX上比较高效的IO复用技术. 所谓的IO复用,就是同时等待多个文件描述符就绪,以系统调用的形式提供.如果所有文件描述符都没有就绪的话,该系统调用阻 ...