Android服务端的设计
1.创建自己的MyServletContextListener.java:
package yybwb; import java.net.ServerSocket; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; public class MyServletContextListener implements ServletContextListener { //这里使该类实现 ServletContextListener监听接口,在Tomcat启动时会调用实现该接口 //的 contextInitialized方法 ServerSocket ss = null;//声明ServerSocket对象 ServerThread st = null;//声明ServerThread对象 //创建服务线程,并将其启动,本方法在tomca启动时调用 public void contextInitialized(ServletContextEvent sce){ try{ ss = new ServerSocket(8888); st = new ServerThread(ss); st.start(); }catch(Exception e){ e.printStackTrace(); } } //停止服务线程,本方法在tomca停止时调用 public void contextDestroyed(ServletContextEvent sce){ try{ st.flag = false; ss.close(); ss = null; st = null; }catch(Exception e){ e.printStackTrace(); } } }
2.在Web.xml中配置上面的监听类
<Listener> <Listener-class>XX.MyServletContextListener</Listener-class> </Listener>
3.创建服务线程ServerThread类如:
package yybwb; import java.net.ServerSocket; import java.net.Socket; import java.net.SocketException; public class ServerThread extends Thread{ public ServerSocket ss; //声明ServerSocket对象 public boolean flag = false; //循环标志位 public ServerThread(ServerSocket ss){ //构造器 this.ss = ss; flag = true; } //run方法创建ServerSocket 监听 public void run(){ while(flag){ try{ Socket socket = ss.accept(); //客户连接后,创建代理线程 ServerAgent,负责与该客户的通讯 ServerAgent sa = new ServerAgent(socket); sa.start(); } catch(SocketException se){ try{ ss.close(); ss = null; System.out.println("ServerSocket closed"); }catch(Exception ee){ ee.printStackTrace(); } } catch(Exception e){ e.printStackTrace(); } } } }
4.代理线程ServerAgent,如:
package yybwb; /**LastDate:2014-10-22 * 更新菜单-#GET_MENULIST# * Author:Wuchyuan */ import static yybwb.ConstantUtil.DELETE_SUCCESS; import static yybwb.ConstantUtil.DIARY_SUCCESS; import static yybwb.ConstantUtil.REGISTER_FAIL; import static yybwb.ConstantUtil.UPDATE_STATE_SUCCESS; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.EOFException; import java.io.IOException; import java.net.Socket; import java.net.SocketException; import java.sql.Blob; import java.util.ArrayList; import java.util.List; public class ServerAgent extends Thread{ public Socket socket; public DataInputStream din; public DataOutputStream dout; boolean flag = false; public ServerAgent(Socket socket) { this.socket = socket; try { this.din = new DataInputStream(socket.getInputStream()); this.dout = new DataOutputStream(socket.getOutputStream()); flag =true; } catch (IOException e) { e.printStackTrace(); } } //方法:线程执行方法 public void run(){ while(flag){ try { String msg = din.readUTF(); //接收客户端发来的消息 // System.out.println("收到的消息是:"+msg); if(msg.startsWith("<#LOGIN#>")){ //消息为登录 String content = msg.substring(9); //获得消息内容 String [] sa = content.split("\\|"); ArrayList<String> result = DBUtil.checkLogin(sa[0], sa[1]); if(result.size()>1){ //登录成功 StringBuilder sb = new StringBuilder(); sb.append("<#LOGIN_SUCCESS#>"); for(String s:result){ sb.append(s); sb.append("|"); } String loginInfo = sb.substring(0,sb.length()-1); dout.writeUTF(loginInfo); //返回用户的基本信息 } else{ //登录失败 String loginInfo = "<#LOGIN_FAIL#>"+result.get(0); dout.writeUTF(loginInfo); } } //mealSvr发来的消息 2014-7-9 else if(msg.startsWith("<#PRINT_DINGD#>")){ //消息为查询打印订单2014-7-9 msg = msg.substring(15); //提取内容 String [] sa = msg.split("\\|"); //分割字符串 boolean result = DBUtil.QueryPrint(sa[0]); //查询是否有需打印订单 // if(result){ //有订单 dout.writeUTF("<#HAVE_DINGD#>"); //发回成功消息 dout.flush(); } else{ dout.writeUTF("<#NOT_DINGD#>"); //发回创建失败消息 dout.flush(); } } //2014-10-22 检查用户密码 else if(msg.startsWith("<#CHECK_USERPASSWD#>")){ // msg = msg.substring(20); //提取内容 String [] sa = msg.split("\\|"); //分割字符串 boolean result = DBUtil.CheckUserPw(sa[0],sa[1]); //查询是否有需打印订单 System.out.println("查询"+sa[0]+"密码是否正确"); if(result){ //有 dout.writeUTF("<#CHECKPWD_HAVE#>"); //发回成功消息 dout.flush(); } else{ dout.writeUTF("<#CHECKPWD_NOT#>"); //发回创建失败消息 dout.flush(); } } } } catch(SocketException se){ try { dout.close(); din.close(); socket.close(); socket = null; flag = false; } catch (IOException e) { e.printStackTrace(); } } catch(EOFException eof){ try { dout.close(); din.close(); socket.close(); socket = null; flag = false; } catch (IOException e) { e.printStackTrace(); } } catch (Exception e) { e.printStackTrace(); } } } }
Android服务端的设计的更多相关文章
- Android 服务端开发之开发环境配置
Android 服务端开发之开发环境配置 这里是在Eclipse的基础上安装PhpEclipse插件方法,PHPEclipse是Eclipse的 一个用于开发PHP的插件.当然也可以采用Java开发a ...
- erlang-百度云推送Android服务端功能实现-erlang
百度云推送官方地址http://developer.baidu.com/wiki/index.php?title=docs/cplat/push 简单的介绍下原理: 百度云推送支持IOS和Androi ...
- 从服务端架构设计角度,深入理解大型APP架构升级
随着智能设备普及和移动互联网发展,移动端应用逐渐成为用户新入口,重要性越来越突出.但企业一般是先有PC端应用,再推APP,APP 1.0版的功能大多从现有PC应用平移过来,没有针对移动自身特点考虑AP ...
- 移动APP服务端API设计应该考虑到的问题
2014年,移动APP的热度丝毫没有减退,并没有像桌面软件被WEB网站那样所取代, 不但如此,越来越多的传统应用.网站也都开始制作自己的移动APP,也就是我们常说的IOS客户端.android客户端. ...
- APP和服务端-架构设计(二)
1. App架构设计经验谈:接口的设计 App与服务器的通信接口如何设计得好,需要考虑的地方挺多的,在此根据我的一些经验做一些总结分享,旨在抛砖引玉. 1.1 安全机制的设计 现在,大部分App的接口 ...
- APP和服务端-架构设计(一)
架构因人而异,不同的架构师大多会有不同的看法:架构也因项目而异,不同的项目需求不同,相应的架构也会不同.然而,有些东西还是通用的,是所有架构师都需要考虑的,也是所有项目都会有的需求,比如API如何设计 ...
- delphi xe5 android 服务端和手机端的源码下载
xe5 android的服务端和手机客户端的源代码下载地址 http://files.cnblogs.com/nywh2008/AndroidTest.rar
- 谈一款MOBA游戏《码神联盟》的服务端架构设计与实现
一.前言 <码神联盟>是一款为技术人做的开源情怀游戏,每一种编程语言都是一位英雄.客户端和服务端均使用C#开发,客户端使用Unity3D引擎,数据库使用MySQL.这个MOBA类游戏是笔者 ...
- 谈一款MOBA类游戏《码神联盟》的服务端架构设计与实现(更新优化思路)
注:本文仅用于在博客园学习分享,还在随着项目不断更新和完善中,多有不足,暂谢绝各平台或个人的转载和推广,感谢支持. 一.前言 <码神联盟>是一款为技术人做的开源情怀游戏,每一种编程语言都是 ...
随机推荐
- RGB565的理解
一个彩色图像由R G B三个分量组成,一个RGB565的每一个像素点数据为2Byte,即16位,那么从名字上就可看出来这16位中,高5位为R分量,中间6位为G分量,低5位为B分量. 下面做了一个实验, ...
- 1.Node.js 接入微信公众平台开发
一.写在前面的话 Node.js是一个开放源代码.跨平台的JavaScript语言运行环境,采用Google开发的V8运行代码,使用事件驱动.非阻塞和异步输入输出模型等技术来提高性能,可优化应用程 ...
- wampServer 2.5 64位 更改"www 目录"不成功
已经指到自己新目录了,修改了 apache的httpd.conf里面的内容如下 修改: DocumentRoot "e:/phproot/" 修改: <Directory & ...
- VR问题无关方向,VR全景为您领航,全景智慧城市已势不可当
2016年,VR绝对是互联网科技圈的一个高频词. 在这一年里,Magic Leap获得阿里领投的近8亿美元的融资,VR公司的商业价值得到认可.Oculus Rift和HTC Vive的VR产品正式发货 ...
- RabbitMQ安装配置和基于EasyNetQ驱动的基础使用
一.RabbitMQ基本概念和原理 1.AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计. 2.Ra ...
- python对mysql数据库操作的三种不同方式
首先要说一下,在这个暑期如果没有什么特殊情况,我打算用python尝试写一个考试系统,希望能在下学期的python课程实际使用,并且尽量在此之前把用到的相关技术都以分篇博客的方式分享出来,有想要交流的 ...
- UX2 beta 3正式发布!!
UX浏览服务是为了加速浏览网页而开发的浏览服务,它解决了WebView的一系列问题,它能够在网络差的情况下快速的浏览,比webview快一倍以上,是webview的优化代替方案.它拥有完善的缓存管理策 ...
- HTML中那些不常用标签
先思考一个问题:为什么H5里面又多了那么多看似没用的标签? 我们知道,<div>能干百分之99的标签能干的事,而标签的主要作用是用来包裹内容,只要把基本内容都包含进去不就好了??胡闹!不带 ...
- Vulkan Tutorial 16 Command buffers
操作系统:Windows8.1 显卡:Nivida GTX965M 开发工具:Visual Studio 2017 诸如绘制和内存操作相关命令,在Vulkan中不是通过函数直接调用的.我们需要在命令缓 ...
- Web前端知识体系精简
Web前端技术由html.css和javascript三大部分构成,是一个庞大而复杂的技术体系,其复杂程度不低于任何一门后端语言.而我们在学习它的时候往往是先从某一个点切入,然后不断地接触和学习新的知 ...