Android基于Socket无线遥控(1)--Socket基本模型搭建

本文介绍了如何在Android上基于Socket实现无线遥控功能。通过创建ServerSocket监听端口,不断接收客户端请求,并启动ServerThread线程处理连接。客户端则创建Socket连接服务器,启动ClientThread线程读取服务器数据。用户界面包含多个按钮,模拟遥控器操作,如音量加减、亮度调节等,点击按钮将指令写入Socket发送给服务器。
摘要由CSDN通过智能技术生成
按计划每周更新一篇技术博文,上周因工作忙而中断,第三篇:《Android基于Socket无线遥控(1)--Socket基本模型搭建

    本例子内容比较多,初步构思分三篇完成,Android系统基于Socket实现无线遥控,可控制另一台Android设备音量增减、亮度调节、方向控制、确认、退出等,本篇主要介绍Socket基本模型搭建,以及无线控制Android系统音量增加,亮度增减。

一、技术介绍

1、Socket介绍

    Socket技术实现,软件实现部分有客户端(遥控器)和服务器(显示器),服务器与客户端定制一致的收发消息信息,以致达到需求功能,主要使用步骤如下:
a.服务器通过创建ServerSocket指定一个固定的端口号,以致客户端能够向该端口号发送连接请求;
b.服务器通过accept()方法为下一个传入的连接请求创建Socket实例,如果没有新的连接请求,accept()方法将处于阻塞等待;
c.客户端创建Socket,指定远程地址和端口号,向服务端发送请求;
d.客户端与服务器连接成功后通过InputStream和OutputStream进行数据信息交互以达到无线遥控功能。

    通常情况下,服务器端可能会接收多个客户端的请求,此时需要使用循环来接收来自不同客户端的连接请求,主要使用如下代码:
     
[java]  view plain copy
  1. // 创建一个ServerSocket,Ports为端口号  
  2.     ServerSocket ss = new ServerSocket(Ports);  
  3.                //  采用循环不断接收来自客户端的请求  
  4.                 while(!quit)  
  5.                 {  
  6.                     //此行代码会阻塞,将一直等待别人的连接  
  7.                     Socket s = ss.accept();                                  
  8.                     socketList.add(s);  
  9.                     //每当客户端连接后启动一条ServerThread线程为该客户端服务  
  10.                     new Thread(new ServerThread(s)).start();  
  11.                     ……                    
  12.                 }  


    客户端创建Socket,指定服务端IP地址和端口号,当Socket创建成功后,服务端的ServerSocket的accept()方法会向下执行,此时服务器端和客户端产生一对相互连接的Socket,创建Socket代码如下:
[java]  view plain copy
  1.      // 创建Socket连接服务器,IP 为IP地址,Ports为端口号  
  2.     Socket s = new Socket( IP, Ports );  
  3.     // 客户端启动ClientThread线程不断读取来自服务器的数据  
  4.     new Thread(new ClientThread(s , handler )).start();  
  5. ……  


    当客户端与服务端产生对应的Socket之后,程序无需再区分服务端与客户端,而是通过各自的Socket进行通讯,主要采用Java IO流来进行数据信息传输,输入输出流方法乳如下:
a.InputStream getInputStream() 返回该Socket对象对应的输入流,让程序通过该输入流从Socket中取出数据,主要使用之一:
[java]  view plain copy
  1. ……  
  2.      BufferedReader br = new BufferedReader( new InputStreamReader(socket.getInputStream()));  
  3. ……  
  4.      String content = null;  
  5.     //不断读取Socket输入流中的内容。  
  6.      while ((content = br .readLine()) != null)  
  7.     {  
  8.       // 对接收到的信息进行对应操作  
  9.      }  

b.OutputStream getOutputStream() 返回该Socket对象对应的输出流,让程序通过该输出流向Socket中输出数据,主要使用之一:
[java]  view plain copy
  1. ……  
  2.     OutputStream os = socket.getOutputStream();  
  3.    String OutputStr = "";  
  4. ……  
  5.    os.write(OutputStr + "\r\n").getBytes("utf-8"));  
  6. ……  

 
二、编码前预定准则

1、客户端(遥控器)、服务器(显示器)

2、端口:58888 (有效范围0~65535)

3、消息规则

a.客户端 --请求连接--> 服务器
消息:"CN"     // CN为connect标志

b.客户端 --方向请求--> 服务器
消息:
"DT" // 向上( direction  Top
"DB" // 向下( bottom  
"DL" // 向左(Left)
"DR" // 向右(Right)
 
C.客户端 --音量增加、减少-->服务器
消息:
"VO +" // 音量增加(v olume
"VO -"  // 音量减少
 
D.客户端  --亮度增加、减少-->服务器
消息:
"BR +" // 亮度增加( brightness)
"BR -"  // 亮度减少
 
E.客户端 --单击确认-->服务器
消息:
"CL" // 单击确认(Click)
F.客户端 --菜单-->服务器
消息:
"ME" // 取消(Menu l)
 
G.客户端 --返回--> 服务器
消息:
"BA" //退出(Back)

H.客户端 --电源--> 服务器
消息:
"PO" // 电源(Power) 

I.客户端 --Home--> 服务器
消息:
"HO" //退出(Home)

三、编码实现
 
1.页面截图
a.遥控器简单界面
 
b.服务器端显示界面一
 
c.服务器端显示界面二
 
2.客户端(遥控器)主要代码
a. RemoteControlClient.java 遥控器客户端
[java]  view plain copy
  1. /** 
  2.  * 遥控器客户端 
  3.  * 
  4.  */  
  5. public class RemoteControlClient extends Activity  
  6. {  
  7.   
  8. ……  
  9.     private OutputStream os ;  
  10.   
  11.     private String IP = "192.168.2.10" ; // 此IP地址根据实际项目修改  
  12.     private int Ports = 58888;          // 端口  
  13.   
  14. ……  
  15.      
  16.     private Handler handler = new Handler()  
  17.     {  
  18.         @Override  
  19.         public void handleMessage(Message msg)  
  20.         {  
  21.             // 如果消息来自于子线程  
  22.             if (msg.what == 0x123)  
  23.             {  
  24.                 // 将读取的内容追加显示在文本框中  
  25.                 show .append(msg.obj .toString());  
  26.             }  
  27.         }  
  28.     };  
  29.   
  30.     OnClickListener mOnClickListener = new OnClickListener()  
  31.     {  
  32.         @Override  
  33.         public void onClick(View v)  
  34.         {  
  35.             switch (v.getId()) {  
  36.                 case R.id. send:  
  37.                     try  
  38.                     {  
  39.                         Log. v( """Socket ---> input : " + input.getText().toString());  
  40.                         // 将用户在文本框内输入的内容写入网络  
  41.                         os .write((input .getText().toString() + "\r\n").getBytes( "utf-8" ));  
  42.                         // 清空input文本框  
  43.                         input .setText("" );  
  44.                     }  
  45.                     catch (Exception e)  
  46.                     {  
  47.                         e.printStackTrace();  
  48.                     }  
  49.   
  50.                     break ;  
  51.   
  52.                 case R.id. volume_add_btn:  
  53.                     input .setText("VO +" );                    
  54.                     break ;  
  55.   
  56.                 case R.id. volume_reduced_btn:  
  57.                     input .setText("VO -" );  
  58.                     break ;  
  59.                 case R.id. brightness_add_btn:  
  60.                     input .setText("BR +" );  
  61.                     break ;  
  62.                 case R.id. brightness_reduced_btn:  
  63.                     input .setText("BR -" );                     
  64.                     break ;  
  65.                 case R.id. direction_top_btn:  
  66.                     input .setText("DT" );  
  67.                     break ;  
  68.                 case R.id. direction_bottom_btn:  
  69.                     input .setText("DB" );  
  70.                     break ;  
  71.                 case R.id. direction_left_btn:  
  72.                     input .setText("DL" );  
  73.                     break ;  
  74.   
  75.                 case R.id. direction_right_btn:  
  76.                     input .setText("DR" );  
  77.                     break ;  
  78.                 case R.id. click_btn:  
  79.                     input .setText("CL" );  
  80.                     break ;  
  81.                 case R.id. back_btn:  
  82.                     input .setText("BA" );  
  83.                     break ;  
  84.                 case R.id. menu_btn:  
  85.                     input .setText("ME" );                     
  86.                     break ;  
  87.                 case R.id. power_btn:  
  88.                     input .setText("PO" );                     
  89.                     break ;  
  90.                 case R.id. home_btn:  
  91.                     input .setText("HO" );                     
  92.                     break ;  
  93.                      
  94.                 case R.id. connect_btn:  
  95.                                 
  96.                     try  
  97.                     {  
  98.                         IP = ipInput .getText().toString();  
  99.                         Log. v( """ --> IP : " + IP );  
  100.                         // 创建Socket连接服务器  
  101.                         Socket s = new Socket(IP , Ports);  
  102.                         // 客户端启动ClientThread线程不断读取来自服务器的数据  
  103.                         new Thread( new ClientThread(s, handler)).start();                         os = s.getOutputStream();  
  104.                          
  105.                         Toast. makeText( context, getString(R.string. con_success ), Toast. LENGTH_LONG).show();  
  106.                         reContentView();  
  107.                          
  108.                     }  
  109.                     catch (Exception e)  
  110.                     {  
  111.                         e.printStackTrace();  
  112.                         Toast. makeText( context, getString(R.string. con_failed ), Toast. LENGTH_LONG).show();  
  113.                     }  
  114.                     break ;  
  115.             }  
  116.         }  
  117.     };  
  118. }  

b. ClientThread.java 不断读取来自服务端的数据信息
 
[java]  view plain copy
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值