Android实时绘制效果(一)
16lz
2021-01-24
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.java1.2)EasyClient.java
- /**
- *长连接、1对n主动发消息的服务器
- *
- *@authorJoin
- */
- publicclassEasyServerextendsThread{
- /**退出命令*/
- publicstaticfinalStringEXIT_COMMAND="end";
- /**服务端口*/
- privateintport;
- /**服务套接字*/
- privateServerSocketmServerSocket;
- /**线程池*/
- privateExecutorServicepool;
- /**客户端套接字集合*/
- privateArrayList<Socket>mClientList;
- /**服务器监听接口*/
- privateOnServerListenerlistener;
- publicEasyServer(intport){
- this.port=port;
- pool=Executors.newCachedThreadPool();//缓存线程池
- mClientList=newArrayList<Socket>();
- }
- @Override
- publicvoidrun(){
- try{
- mServerSocket=newServerSocket(port);//创建本地特定端口服务器套接字
- Socketclient=null;
- while(true){
- client=mServerSocket.accept();//接收连接的套接字
- mClientList.add(client);//加入客户端列表
- if(null!=listener){
- listener.onClientConnected(client.getInetAddress());
- }
- pool.execute(newThreadServer(client));//新线程执行任务
- }
- }catch(BindExceptione){//端口使用中
- if(null!=listener){
- listener.onBindException();
- }
- }catch(IOExceptione){
- e.printStackTrace();
- }
- }
- /**各个连接客户端的服务线程*/
- privateclassThreadServerextendsThread{
- privateSocketclient;
- publicThreadServer(Socketclient){
- this.client=client;
- }
- @Override
- publicvoidrun(){
- DataInputStreamin=null;
- try{
- in=newDataInputStream(client.getInputStream());
- while(true){
- /*接收数据消息*/
- Stringmsg=in.readUTF();
- if(EXIT_COMMAND.equals(msg)){
- /*接收退出命令时,处理退出*/
- DataOutputStreamout=newDataOutputStream(
- client.getOutputStream());
- out.writeUTF(EXIT_COMMAND);//再返回至客户端,使得退出循环
- out.flush();
- if(null!=listener){
- listener.onExited(client.getInetAddress());
- }
- break;
- }else{
- /*否则,处理接收消息*/
- if(null!=listener){
- listener.onReceive(client.getInetAddress(),msg);
- }
- }
- /*回复或转发已接收数据*/
- }
- }catch(SocketExceptione){//Connectionreset
- if(null!=listener){
- listener.onSocketException(client.getInetAddress());
- }
- }catch(IOExceptione){
- e.printStackTrace();
- }finally{
- mClientList.remove(client);//移除当前客户端
- try{
- if(null!=in){
- in.close();
- }
- if(null!=client){
- client.close();
- }
- }catch(IOExceptione){
- e.printStackTrace();
- }
- }
- }
- }
- /**向客户端群发信息*/
- publicvoidsendMessage(Stringmsg){
- inti=0;
- try{
- DataOutputStreamout=null;
- for(;i<mClientList.size();i++){
- out=newDataOutputStream(mClientList.get(i).getOutputStream());
- out.writeUTF(msg);
- out.flush();
- }
- }catch(SocketExceptione){//Connectionreset
- if(null!=listener&&mClientList.size()>0){
- listener.onSocketException(mClientList.get(i).getInetAddress());
- }
- mClientList.remove(i);//移除出异常的那个客户端
- }catch(IOExceptione){
- e.printStackTrace();
- mClientList.remove(i);//移除出异常的那个客户端
- }
- }
- /**设置服务器监听接口*/
- publicvoidsetOnServerListener(OnServerListenerlistener){
- this.listener=listener;
- }
- }
1.3)JsonUtil.java
- /**
- *接收和发送消息的客户端
- *
- *@authorJoin
- */
- publicclassEasyClientextendsThread{
- (还报8W字符冗余,受不住了,就这么着吧T^T)...
- }
Android实时绘制效果(二)(附件工程在该篇内)
- publicclassJsonUtil{
- /**
- *解析Object成为json
- *
- *@paramobj对象
- *@returnjson字符串
- */
- publicstaticStringobjToJson(Objectobj){
- JSONStringerarrayJson=newJSONStringer();//Json构造对象
- Class<?>clazz=obj.getClass();//获取对象运行时类
- try{
- arrayJson.array().value(clazz.getName());//创建数组,第一位存放类名
- JSONStringerobjJson=newJSONStringer();//Json构造对象
- objJson.object();
- Field[]fields=clazz.getDeclaredFields();//返回类声明的所有字段
- for(Fieldfield:fields){
- field.setAccessible(true);//设置变量可访问
- objJson.key(field.getName()).value(field.get(obj));
- }
- objJson.endObject();
- arrayJson.value(objJson).endArray();//第二位存放类对象
- }catch(IllegalArgumentExceptione){
- e.printStackTrace();
- }catch(IllegalAccessExceptione){
- e.printStackTrace();
- }catch(JSONExceptione){
- e.printStackTrace();
- }
- returnarrayJson.toString();
- }
- /**
- *解析json成为Object
- *
- *@paramjsonjson字符串
- *@return对象
- *@warning由于是使用newInstance()构建实例,自己写构造函数时要显式写明默认构造函数
- */
- publicstaticObjectjsonToObj(Stringjson){
- Objectobj=null;
- try{
- JSONArrayjarray=newJSONArray(json);
- StringclassName=jarray.getString(0);//获得第一位类名
- Class<?>clazz=Class.forName(className);//载入该类
- obj=clazz.newInstance();//构建实例
- JSONObjectjobj=newJSONObject(jarray.getString(1));//获得第二位类对象
- @SuppressWarnings("unchecked")
- Iterator<String>it=jobj.keys();
- Fieldfield;
- while(it.hasNext()){
- Stringkey=it.next();
- field=clazz.getDeclaredField(key);
- setValue(obj,field,jobj.getString(key));
- }
- }catch(Exceptione){
- e.printStackTrace();
- }
- returnobj;
- }
- /**
- *给字段设值
- *
- *@paramobj对象
- *@paramfield字段
- *@paramvalue值
- */
- privatestaticvoidsetValue(Objectobj,Fieldfield,Stringvalue)
- throwsIllegalArgumentException,IllegalAccessException{
- ...
- }
- }
更多相关文章
- 转:Android(安卓)内存泄漏调试
- 通过PhoneGap在Android上去推送通知
- Android中RecyclerView调用notifyDataSetChanged方法无效
- Android数据解析JSON解析之手动JSON解析
- 关于String a=new String("a")创建几个对象问题的正确答案
- Android(安卓)Activity启动(二) App内部activity跳转过程及原理
- android开发之Parcelable使用详解
- 《Android/OPhone开发完全讲义》连载(7):使用SharedPreferences存
- 基于 AVOS Cloud 的 Android(安卓)应用程序快速开发简介