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. ELK菜鸟手记 (四) - 利用filebeat和不同端口把不同服务器上的log4j日志传输到同一台ELK服务器

    1. 问题描述  我们需要将不同服务器(如Web Server)上的log4j日志传输到同一台ELK服务器,介于公司服务器资源紧张(^_^) 2. 我们需要用到filebeat 什么是filebeat ...

  2. Python教程(0)——介绍

    What's Python? Python是一种编程语言,由荷兰人Guido van Rossum于1989年,为打发无聊的圣诞节而开发的. Python的优点是语法简洁,代码量比C/C++.Java ...

  3. ASP.NET 开发者 开始学习ASP.NET Core 2吧

    .  NET Core 从2016年6月28日发布,过去了将近一年的时间,但是在工作中发现大家对.net core的接受程度并不高,这只是一个感觉,俗话说“没有调查就没有发言权”, 这两天通过微信小程 ...

  4. Codility---MaxProfit

    Task description A zero-indexed array A consisting of N integers is given. It contains daily prices ...

  5. 用Java写的简单五子棋游戏(原创五子连珠算法)

    源码jar包(已安装jdk环境可直接运行) 下载地址:http://download.csdn.net/detail/eguid_1/9532912 五子连珠算法为自创算法,对于五子棋该算法性能足以. ...

  6. MyEclipse解决SVN同步冲突问题conflict in the working copy obstructs the current operation

    服务端版本控制软件subversion,客户端是eclipse的插件subclipse.当删除一个东西的时候老是提示错误,说冲突 commit -m "" C:/Users/Adm ...

  7. 谈一下我们是怎么做数据库单元测试(Database Unit Test)的

    作者水平有限,如有错误或纰漏,请指出,谢谢. 背景介绍 最近在团队在做release之前的regression,把各个feature分支merge回master之后发现DB的单元测试出现了20多个失败 ...

  8. 网页标题(title)动态改变

    这是一只小白的突发奇想,实验多次终于有所效果.想要实现什么效果呢, 如图所示 :    要实现这个效果,大体需要两步. 第一,如何像打印似的一个一个字显示文字.要实现这个效果有多种方法.在这里我所运用 ...

  9. 常用DOM API

    Node Node是一个接口,中文叫节点,很多类型的DOM元素都是继承于它,都共享着相同的基本属性和方法.常见的Node有 element,text,attribute,comment,documen ...

  10. JS添加类似C# string.Format方法

    String.prototype.format=function()   {     if(arguments.length==0) return this;     for(var s=this, ...