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. 走进javascript——数组的那些事

    Array构造器 如果参数只有一个并且是Number类型,那么就是指定数组的长度,但不能是NaN,如果是多个会被当做参数列表. new Array(12) // (12) [undefined × 1 ...

  2. css重构之旅

    css重构之旅 >前言: 今年我大一,马上就要大二了.从高三毕业暑假到大学的这一年马上过去,马上迎来大二生活学习前端也有将近一年了.一昧去追求那些视觉的效果和相对高端和新颖的技术,反而忽略了最基 ...

  3. Asp.Net Core写个共享磁盘文件Web查看器

    本篇和大家分享的是一个磁盘文件查看系统,严格来说是使用NetCore写的一个Web系统应用,由于NetCore跨平台特性,我生成了exe的运行包,只需要配置运行电脑ip+端口,即可在浏览器中通过IP+ ...

  4. 打印杨辉三角--for循环

    要求打印7行直角杨辉三角 杨辉三角特点: 第1行和第2行数字都为1: 从第三行开始,除去开头和结尾数字为1,中间数字为上一行斜对角两个数字的和. 如下图: 打印结果: 代码如下: package 杨辉 ...

  5. 4.Node.js 微信消息管理

    一.写在前面的话   当用户发送消息给公众号时(或某些特定的用户操作引发的事件推送时),会产生一个POST请求,开发者可以在响应包(Get)中返回特定XML结构,来对该消息进行响应.   消息推送也是 ...

  6. 关于sqlmap的一些命令

    Options(选项):--version 显示程序的版本号并退出-h, --help 显示此帮助消息并退出-v VERBOSE 详细级别:0-6(默认为1)Target(目标):以下至少需要设置其中 ...

  7. [转]如何使用BackTrack破解WIFI无线网络的WEP密钥

    aireplay-ng - -a (bssid) -h ::::: -e (essid) (interface) 你可能已经知道如果你想要加锁自己的WIFI无线网络,你最好选择WPA加密方式,因为WE ...

  8. 《Python编程从入门到实践》第三章_列表简介

    什么是列表呢? 官方说明就是由一些列按特点顺序排列的元素组成.其实可以看出很多个字符串的有序组合吧,里面的内容可以随时的删除,增加,修改. 下面这个就是一个列表,python打印列表的时候会将中括号和 ...

  9. JVM高级特性-三、垃圾收集之判断对象存活算法

    一.概述 运行时数据区中,程序计数器.虚拟机栈.本地方法栈都是随线程而生随线程而灭的 因此,他们的内存分配和回收是确定的,在方法或线程结束时就回收.而Java堆和方 法区则是不确定的,程序运行过程中创 ...

  10. 多线程并发执行任务,取结果归集。终极总结:Future、FutureTask、CompletionService、CompletableFuture

    目录 1.Futrue 2.FutureTask 3.CompletionService 4.CompletableFuture 5.总结 ================正文分割线========= ...