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. 1.搭建Maven 多模块应用 --Intellij IDEA 2016.3.5

    1.打开IDEA,file->new ->project  新建工程 2.建成的项目如下图,然后新建java class 模块: 右击工程名->new -> Module 3. ...

  2. kali虚拟机安装提示安装系统步骤失败

    首先虚拟机不论是VM还是VirtualBox都可以直接安装kali镜像文件的,不过如果你采用虚拟机默认硬盘8G设置的话,到的系统安装步骤会出错无法继续,具体原因不明. 解决办法却很简单,将虚拟机的硬盘 ...

  3. 生成简单的php验证码

    之前发表过,但是上面只是一个截图,不便于大家复制和使用,所以在这重新发表一遍. <?php //生成验证码图片 Header("Content-type: image/JPEG&quo ...

  4. Akka(5): ConsistentHashing Router - 可选定Routee的任务分配模式

    上一篇讨论里我们介绍了几种任务分配(Routing)模式.Akka提供的几种现成智能化Routing模式大多数是通过对用户屏蔽具体的运算Routee选择方式来简化Router使用,提高智能程度,所以我 ...

  5. 我做的第一个程序(菜鸟的java课堂笔记)

    内存: 堆区,栈区,常量区,计数区,代码区: 数据类型: 基本数据类型:整形,浮点型,布尔型 boolean 只能返回真假值,字符型: 引用数据类型:类,数组: 基本数据类型-->直接存放到栈区 ...

  6. python语言精粹《一》

    第一章 静态语言:需要声明类型.变量不能改变类型! 动态语言:(也称脚本语言)主要的应用场景都是很短的应用程序(脚本),比如给静态语言编写的程序进行数据预处理.这样的程序通常也统称胶水代码. pyth ...

  7. (转)C++——std::string类的引用计数

    1.概念 Scott Meyers在<More Effective C++>中举了个例子,不知你是否还记得?在你还在上学的时候,你的父母要你不要看电视,而去复习功课,于是你把自己关在房间里 ...

  8. SVN·最新使用教程总结

    SVN简介: 为什么要使用SVN? 程序员在编写程序的过程中,每个程序员都会生成很多不同的版本,这就需要程序员有效的管理代码,在需要的时候可以迅速,准确取出相应的版本. Subversion是什么? ...

  9. css简单了解

    今天主要是说一下css样式表!HTML结合他使用可以是HTML页面变得很绚丽多彩! 先简单介绍一下为什么要使用CSS(Cascading Style Sheets)层叠样式表! 1.因为CSS样式表可 ...

  10. windows7 64bit下mvn命令后提示‘cmd’不是内部或外部命令,也不是可执行程序或批处理文件

    首先,开命令提示符,输入如下命令试试echo %M2_HOME% 回车如果显示的路径和安装路径一致说明配置没问题; 那么出现这个问题的原因可能就是路径问题,可能是你安装了某个软件更改了系统映射路径导致 ...