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服务端的设计的更多相关文章

  1. Android 服务端开发之开发环境配置

    Android 服务端开发之开发环境配置 这里是在Eclipse的基础上安装PhpEclipse插件方法,PHPEclipse是Eclipse的 一个用于开发PHP的插件.当然也可以采用Java开发a ...

  2. erlang-百度云推送Android服务端功能实现-erlang

    百度云推送官方地址http://developer.baidu.com/wiki/index.php?title=docs/cplat/push 简单的介绍下原理: 百度云推送支持IOS和Androi ...

  3. 从服务端架构设计角度,深入理解大型APP架构升级

    随着智能设备普及和移动互联网发展,移动端应用逐渐成为用户新入口,重要性越来越突出.但企业一般是先有PC端应用,再推APP,APP 1.0版的功能大多从现有PC应用平移过来,没有针对移动自身特点考虑AP ...

  4. 移动APP服务端API设计应该考虑到的问题

    2014年,移动APP的热度丝毫没有减退,并没有像桌面软件被WEB网站那样所取代, 不但如此,越来越多的传统应用.网站也都开始制作自己的移动APP,也就是我们常说的IOS客户端.android客户端. ...

  5. APP和服务端-架构设计(二)

    1. App架构设计经验谈:接口的设计 App与服务器的通信接口如何设计得好,需要考虑的地方挺多的,在此根据我的一些经验做一些总结分享,旨在抛砖引玉. 1.1 安全机制的设计 现在,大部分App的接口 ...

  6. APP和服务端-架构设计(一)

    架构因人而异,不同的架构师大多会有不同的看法:架构也因项目而异,不同的项目需求不同,相应的架构也会不同.然而,有些东西还是通用的,是所有架构师都需要考虑的,也是所有项目都会有的需求,比如API如何设计 ...

  7. delphi xe5 android 服务端和手机端的源码下载

    xe5 android的服务端和手机客户端的源代码下载地址 http://files.cnblogs.com/nywh2008/AndroidTest.rar

  8. 谈一款MOBA游戏《码神联盟》的服务端架构设计与实现

    一.前言 <码神联盟>是一款为技术人做的开源情怀游戏,每一种编程语言都是一位英雄.客户端和服务端均使用C#开发,客户端使用Unity3D引擎,数据库使用MySQL.这个MOBA类游戏是笔者 ...

  9. 谈一款MOBA类游戏《码神联盟》的服务端架构设计与实现(更新优化思路)

    注:本文仅用于在博客园学习分享,还在随着项目不断更新和完善中,多有不足,暂谢绝各平台或个人的转载和推广,感谢支持. 一.前言 <码神联盟>是一款为技术人做的开源情怀游戏,每一种编程语言都是 ...

随机推荐

  1. RGB565的理解

    一个彩色图像由R G B三个分量组成,一个RGB565的每一个像素点数据为2Byte,即16位,那么从名字上就可看出来这16位中,高5位为R分量,中间6位为G分量,低5位为B分量. 下面做了一个实验, ...

  2. 1.Node.js 接入微信公众平台开发

    一.写在前面的话   Node.js是一个开放源代码.跨平台的JavaScript语言运行环境,采用Google开发的V8运行代码,使用事件驱动.非阻塞和异步输入输出模型等技术来提高性能,可优化应用程 ...

  3. wampServer 2.5 64位 更改"www 目录"不成功

    已经指到自己新目录了,修改了 apache的httpd.conf里面的内容如下 修改: DocumentRoot "e:/phproot/" 修改: <Directory & ...

  4. VR问题无关方向,VR全景为您领航,全景智慧城市已势不可当

    2016年,VR绝对是互联网科技圈的一个高频词. 在这一年里,Magic Leap获得阿里领投的近8亿美元的融资,VR公司的商业价值得到认可.Oculus Rift和HTC Vive的VR产品正式发货 ...

  5. RabbitMQ安装配置和基于EasyNetQ驱动的基础使用

    一.RabbitMQ基本概念和原理 1.AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计. 2.Ra ...

  6. python对mysql数据库操作的三种不同方式

    首先要说一下,在这个暑期如果没有什么特殊情况,我打算用python尝试写一个考试系统,希望能在下学期的python课程实际使用,并且尽量在此之前把用到的相关技术都以分篇博客的方式分享出来,有想要交流的 ...

  7. UX2 beta 3正式发布!!

    UX浏览服务是为了加速浏览网页而开发的浏览服务,它解决了WebView的一系列问题,它能够在网络差的情况下快速的浏览,比webview快一倍以上,是webview的优化代替方案.它拥有完善的缓存管理策 ...

  8. HTML中那些不常用标签

    先思考一个问题:为什么H5里面又多了那么多看似没用的标签? 我们知道,<div>能干百分之99的标签能干的事,而标签的主要作用是用来包裹内容,只要把基本内容都包含进去不就好了??胡闹!不带 ...

  9. Vulkan Tutorial 16 Command buffers

    操作系统:Windows8.1 显卡:Nivida GTX965M 开发工具:Visual Studio 2017 诸如绘制和内存操作相关命令,在Vulkan中不是通过函数直接调用的.我们需要在命令缓 ...

  10. Web前端知识体系精简

    Web前端技术由html.css和javascript三大部分构成,是一个庞大而复杂的技术体系,其复杂程度不低于任何一门后端语言.而我们在学习它的时候往往是先从某一个点切入,然后不断地接触和学习新的知 ...