Android服务端的设计
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服务端的设计的更多相关文章
- Android 服务端开发之开发环境配置
Android 服务端开发之开发环境配置 这里是在Eclipse的基础上安装PhpEclipse插件方法,PHPEclipse是Eclipse的 一个用于开发PHP的插件.当然也可以采用Java开发a ...
- erlang-百度云推送Android服务端功能实现-erlang
百度云推送官方地址http://developer.baidu.com/wiki/index.php?title=docs/cplat/push 简单的介绍下原理: 百度云推送支持IOS和Androi ...
- 从服务端架构设计角度,深入理解大型APP架构升级
随着智能设备普及和移动互联网发展,移动端应用逐渐成为用户新入口,重要性越来越突出.但企业一般是先有PC端应用,再推APP,APP 1.0版的功能大多从现有PC应用平移过来,没有针对移动自身特点考虑AP ...
- 移动APP服务端API设计应该考虑到的问题
2014年,移动APP的热度丝毫没有减退,并没有像桌面软件被WEB网站那样所取代, 不但如此,越来越多的传统应用.网站也都开始制作自己的移动APP,也就是我们常说的IOS客户端.android客户端. ...
- APP和服务端-架构设计(二)
1. App架构设计经验谈:接口的设计 App与服务器的通信接口如何设计得好,需要考虑的地方挺多的,在此根据我的一些经验做一些总结分享,旨在抛砖引玉. 1.1 安全机制的设计 现在,大部分App的接口 ...
- APP和服务端-架构设计(一)
架构因人而异,不同的架构师大多会有不同的看法:架构也因项目而异,不同的项目需求不同,相应的架构也会不同.然而,有些东西还是通用的,是所有架构师都需要考虑的,也是所有项目都会有的需求,比如API如何设计 ...
- delphi xe5 android 服务端和手机端的源码下载
xe5 android的服务端和手机客户端的源代码下载地址 http://files.cnblogs.com/nywh2008/AndroidTest.rar
- 谈一款MOBA游戏《码神联盟》的服务端架构设计与实现
一.前言 <码神联盟>是一款为技术人做的开源情怀游戏,每一种编程语言都是一位英雄.客户端和服务端均使用C#开发,客户端使用Unity3D引擎,数据库使用MySQL.这个MOBA类游戏是笔者 ...
- 谈一款MOBA类游戏《码神联盟》的服务端架构设计与实现(更新优化思路)
注:本文仅用于在博客园学习分享,还在随着项目不断更新和完善中,多有不足,暂谢绝各平台或个人的转载和推广,感谢支持. 一.前言 <码神联盟>是一款为技术人做的开源情怀游戏,每一种编程语言都是 ...
随机推荐
- 走进javascript——数组的那些事
Array构造器 如果参数只有一个并且是Number类型,那么就是指定数组的长度,但不能是NaN,如果是多个会被当做参数列表. new Array(12) // (12) [undefined × 1 ...
- css重构之旅
css重构之旅 >前言: 今年我大一,马上就要大二了.从高三毕业暑假到大学的这一年马上过去,马上迎来大二生活学习前端也有将近一年了.一昧去追求那些视觉的效果和相对高端和新颖的技术,反而忽略了最基 ...
- Asp.Net Core写个共享磁盘文件Web查看器
本篇和大家分享的是一个磁盘文件查看系统,严格来说是使用NetCore写的一个Web系统应用,由于NetCore跨平台特性,我生成了exe的运行包,只需要配置运行电脑ip+端口,即可在浏览器中通过IP+ ...
- 打印杨辉三角--for循环
要求打印7行直角杨辉三角 杨辉三角特点: 第1行和第2行数字都为1: 从第三行开始,除去开头和结尾数字为1,中间数字为上一行斜对角两个数字的和. 如下图: 打印结果: 代码如下: package 杨辉 ...
- 4.Node.js 微信消息管理
一.写在前面的话 当用户发送消息给公众号时(或某些特定的用户操作引发的事件推送时),会产生一个POST请求,开发者可以在响应包(Get)中返回特定XML结构,来对该消息进行响应. 消息推送也是 ...
- 关于sqlmap的一些命令
Options(选项):--version 显示程序的版本号并退出-h, --help 显示此帮助消息并退出-v VERBOSE 详细级别:0-6(默认为1)Target(目标):以下至少需要设置其中 ...
- [转]如何使用BackTrack破解WIFI无线网络的WEP密钥
aireplay-ng - -a (bssid) -h ::::: -e (essid) (interface) 你可能已经知道如果你想要加锁自己的WIFI无线网络,你最好选择WPA加密方式,因为WE ...
- 《Python编程从入门到实践》第三章_列表简介
什么是列表呢? 官方说明就是由一些列按特点顺序排列的元素组成.其实可以看出很多个字符串的有序组合吧,里面的内容可以随时的删除,增加,修改. 下面这个就是一个列表,python打印列表的时候会将中括号和 ...
- JVM高级特性-三、垃圾收集之判断对象存活算法
一.概述 运行时数据区中,程序计数器.虚拟机栈.本地方法栈都是随线程而生随线程而灭的 因此,他们的内存分配和回收是确定的,在方法或线程结束时就回收.而Java堆和方 法区则是不确定的,程序运行过程中创 ...
- 多线程并发执行任务,取结果归集。终极总结:Future、FutureTask、CompletionService、CompletableFuture
目录 1.Futrue 2.FutureTask 3.CompletionService 4.CompletableFuture 5.总结 ================正文分割线========= ...