Android实时绘制效果

一、概述 通过长连接的Socket通信,实时发送绘制信息给各客户端,以实现实时显示效果。 二、运行效果 三、功能代码 1 )通信部分 长连接的Socket通信,支持多客户端。服务器和客户端都可主动发送消息。消息的话,将Object转成了json字符串了。 之前用ObjectOutputStream多客户端传送对象时遇到了问题,又搜索了下,参见该网址: http://blog.csdn.net/jsjboss/article/details/752193。也就是要建立了ObjectOutputStream的集合,来传消息了?总之,服务器通过Socket集合每次new个ObjectOutputStream来发消息是不成的!

ps:不想转json,还是想用ObjectOutputStream发送的,可参照《Java Socket通信》长连接通信内的对象消息样例。

1.1)EasyServer.java
        
  1. /**
  2. *长连接、1对n主动发消息的服务器
  3. *
  4. *@authorJoin
  5. */
  6. publicclassEasyServerextendsThread{
  7. /**退出命令*/
  8. publicstaticfinalStringEXIT_COMMAND="end";
  9. /**服务端口*/
  10. privateintport;
  11. /**服务套接字*/
  12. privateServerSocketmServerSocket;
  13. /**线程池*/
  14. privateExecutorServicepool;
  15. /**客户端套接字集合*/
  16. privateArrayList<Socket>mClientList;
  17. /**服务器监听接口*/
  18. privateOnServerListenerlistener;
  19. publicEasyServer(intport){
  20. this.port=port;
  21. pool=Executors.newCachedThreadPool();//缓存线程池
  22. mClientList=newArrayList<Socket>();
  23. }
  24. @Override
  25. publicvoidrun(){
  26. try{
  27. mServerSocket=newServerSocket(port);//创建本地特定端口服务器套接字
  28. Socketclient=null;
  29. while(true){
  30. client=mServerSocket.accept();//接收连接的套接字
  31. mClientList.add(client);//加入客户端列表
  32. if(null!=listener){
  33. listener.onClientConnected(client.getInetAddress());
  34. }
  35. pool.execute(newThreadServer(client));//新线程执行任务
  36. }
  37. }catch(BindExceptione){//端口使用中
  38. if(null!=listener){
  39. listener.onBindException();
  40. }
  41. }catch(IOExceptione){
  42. e.printStackTrace();
  43. }
  44. }
  45. /**各个连接客户端的服务线程*/
  46. privateclassThreadServerextendsThread{
  47. privateSocketclient;
  48. publicThreadServer(Socketclient){
  49. this.client=client;
  50. }
  51. @Override
  52. publicvoidrun(){
  53. DataInputStreamin=null;
  54. try{
  55. in=newDataInputStream(client.getInputStream());
  56. while(true){
  57. /*接收数据消息*/
  58. Stringmsg=in.readUTF();
  59. if(EXIT_COMMAND.equals(msg)){
  60. /*接收退出命令时,处理退出*/
  61. DataOutputStreamout=newDataOutputStream(
  62. client.getOutputStream());
  63. out.writeUTF(EXIT_COMMAND);//再返回至客户端,使得退出循环
  64. out.flush();
  65. if(null!=listener){
  66. listener.onExited(client.getInetAddress());
  67. }
  68. break;
  69. }else{
  70. /*否则,处理接收消息*/
  71. if(null!=listener){
  72. listener.onReceive(client.getInetAddress(),msg);
  73. }
  74. }
  75. /*回复或转发已接收数据*/
  76. }
  77. }catch(SocketExceptione){//Connectionreset
  78. if(null!=listener){
  79. listener.onSocketException(client.getInetAddress());
  80. }
  81. }catch(IOExceptione){
  82. e.printStackTrace();
  83. }finally{
  84. mClientList.remove(client);//移除当前客户端
  85. try{
  86. if(null!=in){
  87. in.close();
  88. }
  89. if(null!=client){
  90. client.close();
  91. }
  92. }catch(IOExceptione){
  93. e.printStackTrace();
  94. }
  95. }
  96. }
  97. }
  98. /**向客户端群发信息*/
  99. publicvoidsendMessage(Stringmsg){
  100. inti=0;
  101. try{
  102. DataOutputStreamout=null;
  103. for(;i<mClientList.size();i++){
  104. out=newDataOutputStream(mClientList.get(i).getOutputStream());
  105. out.writeUTF(msg);
  106. out.flush();
  107. }
  108. }catch(SocketExceptione){//Connectionreset
  109. if(null!=listener&&mClientList.size()>0){
  110. listener.onSocketException(mClientList.get(i).getInetAddress());
  111. }
  112. mClientList.remove(i);//移除出异常的那个客户端
  113. }catch(IOExceptione){
  114. e.printStackTrace();
  115. mClientList.remove(i);//移除出异常的那个客户端
  116. }
  117. }
  118. /**设置服务器监听接口*/
  119. publicvoidsetOnServerListener(OnServerListenerlistener){
  120. this.listener=listener;
  121. }
  122. }
1.2)EasyClient.java
        
  1. /**
  2. *接收和发送消息的客户端
  3. *
  4. *@authorJoin
  5. */
  6. publicclassEasyClientextendsThread{
  7. (还报8W字符冗余,受不住了,就这么着吧T^T)...
  8. }
1.3)JsonUtil.java
        
  1. publicclassJsonUtil{
  2. /**
  3. *解析Object成为json
  4. *
  5. *@paramobj对象
  6. *@returnjson字符串
  7. */
  8. publicstaticStringobjToJson(Objectobj){
  9. JSONStringerarrayJson=newJSONStringer();//Json构造对象
  10. Class<?>clazz=obj.getClass();//获取对象运行时类
  11. try{
  12. arrayJson.array().value(clazz.getName());//创建数组,第一位存放类名
  13. JSONStringerobjJson=newJSONStringer();//Json构造对象
  14. objJson.object();
  15. Field[]fields=clazz.getDeclaredFields();//返回类声明的所有字段
  16. for(Fieldfield:fields){
  17. field.setAccessible(true);//设置变量可访问
  18. objJson.key(field.getName()).value(field.get(obj));
  19. }
  20. objJson.endObject();
  21. arrayJson.value(objJson).endArray();//第二位存放类对象
  22. }catch(IllegalArgumentExceptione){
  23. e.printStackTrace();
  24. }catch(IllegalAccessExceptione){
  25. e.printStackTrace();
  26. }catch(JSONExceptione){
  27. e.printStackTrace();
  28. }
  29. returnarrayJson.toString();
  30. }
  31. /**
  32. *解析json成为Object
  33. *
  34. *@paramjsonjson字符串
  35. *@return对象
  36. *@warning由于是使用newInstance()构建实例,自己写构造函数时要显式写明默认构造函数
  37. */
  38. publicstaticObjectjsonToObj(Stringjson){
  39. Objectobj=null;
  40. try{
  41. JSONArrayjarray=newJSONArray(json);
  42. StringclassName=jarray.getString(0);//获得第一位类名
  43. Class<?>clazz=Class.forName(className);//载入该类
  44. obj=clazz.newInstance();//构建实例
  45. JSONObjectjobj=newJSONObject(jarray.getString(1));//获得第二位类对象
  46. @SuppressWarnings("unchecked")
  47. Iterator<String>it=jobj.keys();
  48. Fieldfield;
  49. while(it.hasNext()){
  50. Stringkey=it.next();
  51. field=clazz.getDeclaredField(key);
  52. setValue(obj,field,jobj.getString(key));
  53. }
  54. }catch(Exceptione){
  55. e.printStackTrace();
  56. }
  57. returnobj;
  58. }
  59. /**
  60. *给字段设值
  61. *
  62. *@paramobj对象
  63. *@paramfield字段
  64. *@paramvalue值
  65. */
  66. privatestaticvoidsetValue(Objectobj,Fieldfield,Stringvalue)
  67. throwsIllegalArgumentException,IllegalAccessException{
  68. ...
  69. }
  70. }
Android实时绘制效果(二)(附件工程在该篇内)

更多相关文章

  1. 转:Android(安卓)内存泄漏调试
  2. 通过PhoneGap在Android上去推送通知
  3. Android中RecyclerView调用notifyDataSetChanged方法无效
  4. Android数据解析JSON解析之手动JSON解析
  5. 关于String a=new String("a")创建几个对象问题的正确答案
  6. Android(安卓)Activity启动(二) App内部activity跳转过程及原理
  7. android开发之Parcelable使用详解
  8. 《Android/OPhone开发完全讲义》连载(7):使用SharedPreferences存
  9. 基于 AVOS Cloud 的 Android(安卓)应用程序快速开发简介

随机推荐

  1. android聊天,存储聊天记录sqlite
  2. Android(安卓)文件存放路径
  3. Android(安卓)Studio中AVD SDk找不到的解
  4. android读取原始的xml文件
  5. Android(安卓)NFS 文件系统
  6. Android消息机制(三):Looper
  7. Android实现搜索保存历史记录功能
  8. Android(安卓)Camera2.0 结合ImageReader
  9. Android(安卓)SDK更新后提示This version
  10. 【Android】【UI】8.0以上版本Notificati