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. 通过demo学python

    链接 Github项目地址 软件安装包(pycharm.注册码.解析器等) Python 一切皆对象 Python 编码规范 The Python Standard Library The Pytho ...

  2. OVS + dpdk 安装与实验环境配置

    ***DPDK datapath的OVS的安装与实验环境配置 首先肯定是DPDK的安装       0:安装必要的工具            make            gcc           ...

  3. 每天一个JS 小demo之日历制作。主要知识点:日期函数

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  4. Vivado2015.4使用教程(一个完成工程的建立)

    双击桌面的vivado图标,(可能有点慢) 弹出主菜单界面,点击create new project 这是介绍界面,next~ 添加好工程名,和工程位置,next~ 选择rtl Project,nex ...

  5. (转)让浏览器支持Webp

    转载:https://segmentfault.com/a/1190000005898538?utm_source=tuicool&utm_medium=referral Webp介绍 web ...

  6. 【论文:麦克风阵列增强】Speech Enhancement Based on the General Transfer Function GSC and Postfiltering

    作者:桂. 时间:2017-06-06  16:10:47 链接:http://www.cnblogs.com/xingshansi/p/6951494.html 原文链接:http://pan.ba ...

  7. 软件开发项目云端All-In-One体验

    如今在软件开发圈里混,Agile,DevOps,Cloud是大家经常挂在嘴边的词,其实大家各自都有在应用层上的经验,但是如何把三者很好的结合起来,这是所有项目管理者困惑和需要的问题. Agile让我们 ...

  8. cesium自定义气泡窗口infoWindow后续优化篇

    http://www.cnblogs.com/giserhome/p/6248858.html该篇文章实现的自定义气泡窗口是基于修改cesium源代码基础上,这种做法只是援兵之计,凑合应付的,投机取巧 ...

  9. Spring中多个工程停多个资源文件ignoreUnresolvablePlaceholders配置

    http://www.imooo.com/ruanjiangongcheng/software-architecture-design/667686.htm

  10. 探索Windows命令行系列(3):命令行脚本基础

    1.实用功能 1.1.为脚本添加注释 1.2.控制命令的回显 1.3.使用数学表达式 1.4.向脚本传递参数 2.使用变量 2.1.变量的命名及定义 2.2.调用变量 2.3.变量的作用域 3.结构语 ...