• Android服务端的设计


    1.创建自己的MyServletContextListener.java:

     1 package yybwb;
     2 
     3 import java.net.ServerSocket;
     4 
     5 import javax.servlet.ServletContextEvent;
     6 
     7 import javax.servlet.ServletContextListener;
     8 
     9 public class MyServletContextListener implements ServletContextListener
    10 
    11 { //这里使该类实现 ServletContextListener监听接口,在Tomcat启动时会调用实现该接口
    12 
    13 //的 contextInitialized方法
    14 
    15  ServerSocket ss = null;//声明ServerSocket对象
    16 
    17  ServerThread st = null;//声明ServerThread对象
    18 
    19  
    20 
    21  //创建服务线程,并将其启动,本方法在tomca启动时调用  
    22 
    23 public void contextInitialized(ServletContextEvent sce){
    24 
    25   try{    ss = new ServerSocket(8888);
    26 
    27  
    28 
    29   st = new ServerThread(ss);  
    30 
    31   st.start();
    32 
    33   }catch(Exception e){    e.printStackTrace();
    34 
    35   }  }    
    36 
    37  
    38 
    39 //停止服务线程,本方法在tomca停止时调用
    40 
    41 public void contextDestroyed(ServletContextEvent sce){  
    42 
    43  
    44 
    45  try{    st.flag = false;  
    46 
    47    ss.close();  
    48 
    49   ss = null;  
    50 
    51   st = null;   }catch(Exception e){    e.printStackTrace();  
    52 
    53  }  } }

    2.在Web.xml中配置上面的监听类

    1 <Listener>
    2 
    3   <Listener-class>XX.MyServletContextListener</Listener-class>
    4 
    5 </Listener>


    3.创建服务线程ServerThread类如:

     1 package yybwb;
     2 
     3 import java.net.ServerSocket;
     4 
     5 import java.net.Socket;
     6 
     7 import java.net.SocketException;
     8 
     9 public class ServerThread extends Thread{
    10 
    11  public ServerSocket ss;  //声明ServerSocket对象
    12 
    13  public boolean flag = false; //循环标志位
    14 
    15    public ServerThread(ServerSocket ss){ //构造器  
    16 
    17   this.ss = ss; 
    18 
    19   flag = true;  }
    20 
    21 //run方法创建ServerSocket 监听
    22 
    23  public void run(){
    24 
    25   while(flag){
    26 
    27    try{
    28 
    29     Socket socket = ss.accept();
    30 
    31 //客户连接后,创建代理线程 ServerAgent,负责与该客户的通讯
    32 
    33     ServerAgent sa = new ServerAgent(socket);    
    34 
    35   sa.start();   
    36 
    37  }  
    38 
    39   catch(SocketException se){  
    40 
    41    try{      ss.close();  
    42 
    43     ss = null;     
    44 
    45  System.out.println("ServerSocket closed");  
    46 
    47    }catch(Exception ee){
    48 
    49      ee.printStackTrace();   
    50 
    51   }   
    52 
    53  }  
    54 
    55   catch(Exception e){  
    56 
    57    e.printStackTrace();  
    58 
    59   }
    60 
    61   }
    62 
    63  }
    64 
    65 }

    4.代理线程ServerAgent,如:

      1 package yybwb;
      2 
      3 /**LastDate:2014-10-22  * 更新菜单-#GET_MENULIST#  * Author:Wuchyuan  */
      4 
      5 import static yybwb.ConstantUtil.DELETE_SUCCESS;
      6 
      7 import static yybwb.ConstantUtil.DIARY_SUCCESS;
      8 
      9 import static yybwb.ConstantUtil.REGISTER_FAIL;
     10 
     11 import static yybwb.ConstantUtil.UPDATE_STATE_SUCCESS;
     12 
     13 import java.io.DataInputStream;
     14 
     15 import java.io.DataOutputStream;
     16 
     17 import java.io.EOFException;
     18 
     19 import java.io.IOException;
     20 
     21 import java.net.Socket;
     22 
     23 import java.net.SocketException;
     24 
     25 import java.sql.Blob;
     26 
     27 import java.util.ArrayList;
     28 
     29 import java.util.List;
     30 
     31 public class ServerAgent extends Thread{
     32 
     33  public Socket socket;
     34 
     35  public DataInputStream din;
     36 
     37  public DataOutputStream dout;
     38 
     39  boolean flag = false;  
     40 
     41  public ServerAgent(Socket socket)
     42 
     43 {   this.socket = socket;
     44 
     45   try {    this.din = new DataInputStream(socket.getInputStream());    this.dout = new DataOutputStream(socket.getOutputStream());
     46 
     47    flag =true;
     48 
     49   } catch (IOException e) {    e.printStackTrace();   }  }  //方法:线程执行方法    
     50 
     51    public void run(){     
     52 
     53   while(flag){   
     54 
     55    try {     String msg = din.readUTF();   //接收客户端发来的消息
     56 
     57 //    System.out.println("收到的消息是:"+msg);    
     58 
     59   if(msg.startsWith("<#LOGIN#>")){    //消息为登录    
     60 
     61   String content = msg.substring(9);   //获得消息内容    
     62 
     63   String [] sa = content.split("\\|");  
     64 
     65     ArrayList<String> result = DBUtil.checkLogin(sa[0], sa[1]);    
     66 
     67   if(result.size()>1){   //登录成功   
     68 
     69     StringBuilder sb = new StringBuilder();  
     70 
     71      sb.append("<#LOGIN_SUCCESS#>");  
     72 
     73      for(String s:result){      
     74 
     75   sb.append(s);      
     76 
     77   sb.append("|");       }      
     78 
     79  String loginInfo = sb.substring(0,sb.length()-1);  
     80 
     81      dout.writeUTF(loginInfo);   //返回用户的基本信息         }     
     82 
     83  else{    //登录失败   
     84 
     85     String loginInfo = "<#LOGIN_FAIL#>"+result.get(0);    
     86 
     87    dout.writeUTF(loginInfo);      }     }     
     88 
     89      //mealSvr发来的消息 2014-7-9  
     90 
     91    else if(msg.startsWith("<#PRINT_DINGD#>")){  
     92 
     93   //消息为查询打印订单2014-7-9      
     94 
     95 msg = msg.substring(15);    //提取内容    
     96 
     97   String [] sa = msg.split("\\|");  //分割字符串      
     98 
     99 boolean result = DBUtil.QueryPrint(sa[0]);  //查询是否有需打印订单     
    100 
    101  //      if(result){  //有订单     
    102 
    103   dout.writeUTF("<#HAVE_DINGD#>");  //发回成功消息  
    104 
    105      dout.flush();                       
    106 
    107      }      else{  
    108 
    109      dout.writeUTF("<#NOT_DINGD#>");   //发回创建失败消息   
    110 
    111     dout.flush();      }           }          
    112 
    113      //2014-10-22 检查用户密码   
    114 
    115  
    116 
    117   else if(msg.startsWith("<#CHECK_USERPASSWD#>")){   
    118 
    119  //      msg = msg.substring(20);    //提取内容    
    120 
    121   String [] sa = msg.split("\\|");  //分割字符串  
    122 
    123     boolean result = DBUtil.CheckUserPw(sa[0],sa[1]);  //查询是否有需打印订单
    124 
    125      System.out.println("查询"+sa[0]+"密码是否正确");    
    126 
    127   if(result){  //
    128 
    129  dout.writeUTF("<#CHECKPWD_HAVE#>");  //发回成功消息    
    130 
    131    dout.flush();                            }     
    132 
    133  else{
    134 
    135       dout.writeUTF("<#CHECKPWD_NOT#>");   //发回创建失败消息
    136 
    137       dout.flush();    
    138 
    139   }        
    140 
    141    }          
    142 
    143  
    144 
    145 }  
    146 
    147   }    catch(SocketException se){     try {  
    148 
    149     dout.close();
    150 
    151      din.close();    
    152 
    153   socket.close();   
    154 
    155    socket = null;  
    156 
    157     flag = false;   
    158 
    159   } catch (IOException e) {    
    160 
    161   e.printStackTrace();     }   
    162 
    163      }    catch(EOFException eof){
    164 
    165     try {      dout.close();  
    166 
    167     din.close();    
    168 
    169   socket.close();
    170 
    171      socket = null;   
    172 
    173    flag = false;    
    174 
    175  } catch (IOException e) {
    176 
    177      e.printStackTrace();     }  
    178 
    179   }    catch (Exception e) {    
    180 
    181  e.printStackTrace();    
    182 
    183 }   
    184 
    185 }  
    186 
    187 }
    188 
    189 }
  • 相关阅读:
    js实现倒计时
    CSS解决ul下面最后一个li的margin
    js手动定时清除localStorage
    js应用中的小细节-时间戳的转换和input输入框有效数字
    javaScript将string转换成array,并将汉字按汉语拼音排序方法
    CSS3属性之text-overflow:ellipsis,指定多行文本中任意一行显示...
    移动端下拉刷新,向后台请求数据
    进程 线程 协程
    网络编程
    flask 2 进阶
  • 原文地址:https://www.cnblogs.com/realhope/p/4264837.html
Copyright © 2020-2023  润新知