首先,先看一下服务端包的结构

首先是UserManager类

package com.server.servelt;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.util.Base64;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.server.service.UserService;
import com.sun.mail.util.BASE64DecoderStream;
public class UserManager extends HttpServlet {
private static final String CODE="UTF-8";
public UserManager()
{
super();
}
public void destroy()
{
super.destroy();
}
public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException
{
doPost(request, response);
}
public void doPost(HttpServletRequest request,HttpServletResponse response) throws IOException
{
//设置编码
response.setContentType("text/html");
response.setCharacterEncoding(CODE);
request.setCharacterEncoding(CODE);
//获取请求方法名,其中request_flag是我们安卓客户端请求的参数,详细介绍请参照servlet有关书籍
String flag=request.getParameter("request_flag");
System.out.println("flag="+flag);
//预定义一个字符串,用来接收json
String json="";
if("login".equals(flag))
{
//此处的username和password也是安卓客户端访问网址的参数
String username=request.getParameter("username");
String password=request.getParameter("password");
//调用UserService的login方法实现登录
json=UserService.login(username, password);
}
//控制台输出,方便检验,无特殊含义
System.out.println("json="+json);
//利用输出流将登录信息(此处为success或是fail)反馈给客户端
PrintWriter out=response.getWriter();
out.write(json);
out.flush();
out.close();
}
}

接着是上面调用到的 UserService类

package com.server.service;
import com.server.dao.UserDao;
import com.server.util.JSONUtil;
public class UserService {
public static String login(String username,String password)
{
//调用UserDao的login方法,该方法会查询数据库并对结果进行检测,若存在该用户,返回该用户在数据库中的位置,否则,返回0(位置从一开始)
int r=UserDao.login(username,password);
//将结果一JSONObject的形式记录下来并返回让输出流反馈给客户端
String result=JSONUtil.createJSONString("result",r);
return result;
}
}

再接着是上面调用到的 UserDao类

package com.server.dao;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import com.server.util.DBUtil;
public class UserDao {
private static Connection conn=null;
private static Statement sta=null;
private static ResultSet res=null;
public UserDao()
{
}
public static int login(String username,String password)
{
try{
conn=DBUtil.getConnection();
sta=conn.createStatement();
//注意下面的sql语句,值前后要加上单引号,同时不准存在中文字符
String sql="select COUNT(*) from userlist where username='"+username+"' and +password='"+password+"'";
res=sta.executeQuery(sql);
int result=0;
if(res!=null)
{
//不断查询,若存在,返回用户在数据库中的位置,否则返回0,下面的1代表数据库的第一列,此列为自增序号列
while(res.next())
result=res.getInt(1);
}
return result;
}catch(Exception e){
e.printStackTrace();
}
return 0;
}
}

然后是俩个工具类

package com.server.util;
import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class DBUtil {
//默认接口是3306,除非你做了修改哈
private static final String URL="jdbc:mysql://localhost:3306/data";
//下面是你的用户名,默认为root
private static final String USERNAME="root";
//在密码出填入你的密码
private static final String PASSWORD="密码";
static{
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
// TODO: handle exception
e.printStackTrace();
}
}
public static Connection getConnection()
{
try {
return DriverManager.getConnection(URL,USERNAME,PASSWORD);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
return null;
}
public void closeDB(Connection conn,Statement statement,ResultSet res)
{
try{
if(res!=null)
{
res.close();
}
if(statement!=null)
{
statement.close();
}
if(conn!=null)
{
conn.close();
}
}catch(Exception e){
e.printStackTrace();
}
}
}

package com.server.util;
import net.sf.json.JSONObject;
public class JSONUtil {
public static String createJSONString(String key ,Object value)
{
JSONObject jsonObject=new JSONObject();
jsonObject.put(key, value);
return jsonObject.toString();
}
}

另外,在WebRoot的相关路径(详细路径参考图片)需添加以下包

其中的rt.jar位于你安装的jdk路径(我的是E:\Java目标文件夹\lib)lib下面

其他包请自行百度

另外,web.xml的配置如下(eclipse)中的开发似乎不需要配置web.xml

This is the description of my J2EE componentThis is the display name of my J2EE componentUserManagercom.server.servelt.UserManagerUserManager/servlet/UserManagerindex.jsp

至此,服务端搭建完成,为了测试你的服务端,你可以启动服务端后在浏览器中输入以下地址:

http://localhost:8080/AndroidWebService/servlet/UserManager?request_flag=login&username=admin&password=123(用于上面的配置中有了<url-pattern>/servlet/UserManager</url-pattern>这一句,所以这里的地址就有了servlet,所以,如果你改动了配置,这里的地址也要做相应修改)

结果如下:

接下来是安卓客户端:

首先是MainActivity

package com.example.servertestandroid;
import java.io.IOException;
import com.example.util.HttpUtil;
import com.example.util.JSONUtil;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity extends Activity {
//安卓客户端是以网址的方式访问服务器,此处的ip地址即为本机地址
//这里的路径其实 就是我们上面的网址,只不过在安卓中不支持localhost,所以必须写成实质性的地址
//另外,电脑应该链接网线,而手机使用电脑开启的WiFi,俩者都用WiFi似乎不行
public static final String REQUEST_URL = "http://ip:8080/AndroidWebService/servlet/UserManager?";
private String username="";
private String userpwd="";
private EditText editTextUsername,editTextUserpwd;
private Button buttonLogin;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
//初始化控件
initViews();
}
private void initViews() {
// TODO Auto-generated method stub
editTextUsername=(EditText) findViewById(R.id.id_username);
editTextUserpwd=(EditText) findViewById(R.id.id_userpwd);
//此处我直接将俩个输入框中文字设置成相应的用户名和密码,懒得码字了
editTextUsername.setText("admin");
editTextUserpwd.setText("123");
buttonLogin=(Button) findViewById(R.id.id_login);
buttonLogin.setOnClickListener(clickListener);
}
private OnClickListener clickListener=new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
String username=editTextUsername.getText().toString();
String password=editTextUserpwd.getText().toString();
//设置参数
final String params="request_flag=login&username="+username+"&password="+password;
//开启线程,避免影响界面与用户的交互
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
//通过开启httpConnection来达到访问网址的目的,此处的result即为服务端出发送的json
String result = HttpUtil.sendGet(REQUEST_URL, params);
//将上述json进行解析,得到结果(序号)
int res=JSONUtil.getResult("result", result);
if(res==1)
{
//线程中不能进行与界面交互,所以我们开启一个handler来处理
handler.sendEmptyMessage(1);
}
}
//注意此处还有 一个start()
}).start();
}
};
Handler handler=new Handler()
{
public void handleMessage(Message message)
{
Toast.makeText(getApplicationContext(), "success",Toast.LENGTH_SHORT).show();
}
};
}

其次是俩个工具类

package com.example.util;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.URL;
public class HttpUtil {
public HttpUtil()
{
}
public static String sendGet(String request_url,String params)
{
try {
URL url = new URL(request_url+params);
HttpURLConnection httpURLConnection=(HttpURLConnection) url.openConnection();
httpURLConnection.setConnectTimeout(3000);
httpURLConnection.setRequestMethod("GET");
//据我的理解,应该是设置该链接是用来接收数据的,因为还有一个方法是setDoIOutput
httpURLConnection.setDoInput(true);
//200代表HTTP_OK,可以通过鼠标移至给方法上后右键或是按下F3查看声明
if(httpURLConnection.getResponseCode()==200)
{
return InputStream2String(httpURLConnection.getInputStream());
}
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
return "";
}
private static String InputStream2String(InputStream inputStream) throws IOException {
// TODO Auto-generated method stub
ByteArrayOutputStream byteArrayOutputStream=new ByteArrayOutputStream();
int len=0;
byte[] b=new byte[1024];
//将服务端发过来的数据读取到b中
while((len=inputStream.read(b))!=-1)
{
byteArrayOutputStream.write(b, 0, len);
}
return new String(byteArrayOutputStream.toByteArray());
}
}
package com.example.util;
import org.json.JSONException;
import org.json.JSONObject;
public class JSONUtil {
/**
* 解析Json数据
* @param key
* @param json
* @return
*/
public static int getResult(String key,String json){
try {
JSONObject jsonObject=new JSONObject(json);
int result=jsonObject.getInt(key);
return result;
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return -1;
}
}

此处省略布局文件

效果图如下:

另外,只支持传送文本信息,至于图片和文件有待进一步研究

基于servlet的服务端与安卓客户端的通信(文本)相关推荐

  1. mysql架设手游_手游长生诀手工架设完整服务端文件+安卓客户端+架设教程

    内容介绍 架设教程: 文件:readme.txt csj_file.tar.gz csj.tar.gz 解压上面两个包 1. 系统要求:内存16G为佳,CENTOS6.5_X64 2. iptable ...

  2. TCP/IP网络编程之基于TCP的服务端/客户端(二)

    回声客户端问题 上一章TCP/IP网络编程之基于TCP的服务端/客户端(一)中,我们解释了回声客户端所存在的问题,那么单单是客户端的问题,服务端没有任何问题?是的,服务端没有问题,现在先让我们回顾下服 ...

  3. TCP/IP网络编程之基于TCP的服务端/客户端(一)

    TCP/IP网络编程之基于TCP的服务端/客户端(一) 理解TCP和UDP 根据数据传输方式的不同,基于网络协议的套接字一般分为TCP套接字和UDP套接字.因为TCP套接字是面向连接的,因此又称为基于 ...

  4. 基于TCP/IP协议的Java服务端与Android客户端的Socket通信及数据交互

    基于TCP/IP协议的Java服务端与Android客户端的Socket通信及数据交互 一.前言 1.Java服务端程序代码的项目名为TcpSocketServerOfJava,包名为com.exam ...

  5. 学习 ET(1)- 开源的游戏客户端(基于 unity3d)服务端双端框架

    我: 客户端程序员,15+ 以上 C++ 编码经历, 还算扎实.Unity 编码经历 1年,C# 没有单独学过.真不想离开C++的世界,大形势驱使进入了Unity+C#世界. ET - 开源的游戏客户 ...

  6. ssm配置socket_ssm框架中集成websocket实现服务端主动向客户端发送消息

    找了很多配置文档及实例说明,也还是没能成功,最终在csdn博客中发现了基于stomp的消息推送的文章, 下面整理自csdn博客,https://blog.csdn.net/u013627689/art ...

  7. 服务端渲染vs客户端渲染到前后端同构

    关于服务端渲染与客户端渲染的优劣,互联网上已经有过很多的文章进行过分析,在这里我谈一下我个人的见解. 首先,还是来老生常谈一下关于两种渲染方式的主要优劣: 服务端渲染(仅列出当下最突出的优劣): 优: ...

  8. websocket服务端和html客户端进行二进制数据交互

    一.概念和理论理解 1.HTTP HTTP 是基于请求响应式的,即通信只能由客户端发起,服务端做出响应,无状态,无连接. 无状态:每次连接只处理一个请求,请求结束后断开连接. 无连接:对于事务处理没有 ...

  9. 【踩坑】cat3.x服务端部署, springboot客户端接入

    [踩坑]cat3.x服务端部署, springboot客户端接入 前言 服务器部署问题 1. 数据库连不上 2. 不要创建server.xml 客户端注册问题 1. client.xml信息错误 2. ...

最新文章

  1. BZOJ 1821 [JSOI2010] Group 部落划分 Group
  2. docker常用命令行集锦
  3. Git - ‘假设未改变‘和‘跳过工作树‘之间的区别
  4. PyQt 编程基本思想-HelloWorld
  5. 按次计费接口的简单实现思路
  6. IDEA报错Web server failed to start. Port 8080 was already in use的解决方法
  7. 深入理解操作系统内核架构(送书)!
  8. 《Genesis-3D开源游戏引擎完整实例教程-跑酷游戏篇:简介及目录》(附上完整工程文件)...
  9. 产品经理进行时间管理的6个核心点
  10. 解决XP的IIS HTTP 500”内部服务器错误
  11. 换一种姿势阅读《人工智能简史》
  12. Starting Programe
  13. 感悟较多影响较多的心理效应
  14. adcclk最大_关于STM32 在进行ADC采样时,ADCCLK时钟频率的确定
  15. 【PTA】【C语言】书香节
  16. 推荐系统入门(七):新闻推荐实践2(附代码)
  17. 笔记:腾讯云服务器的使用
  18. ubuntu windows双系统默认启动项切换
  19. 树莓派开发笔记(十七):树莓派4B+上Qt多用户连接操作Mysql数据库同步(单条数据悲观锁)
  20. 5月10日12点,看雪.深信服2021 KCTF春季赛正式开赛!

热门文章

  1. 《UNIX环境高级编程》笔记 第十九章-伪终端
  2. supermap动态流向_计算流向 | SuperMap iDesktop Java
  3. luckySheet实现Excel在线保存,导出,编辑
  4. 计算机组成原理之指令流水
  5. text-overflow: ellipsis; white-space: nowrap;文本超出部门省略号
  6. edu平台Web实训CSS3背景样式
  7. matlab实现神经网络算法,人工神经网络matlab代码
  8. 【精品】使用阿里的EasyExcel读写Excel文档
  9. 一张百度收录图片反映出众多配资平台的问题。
  10. 技术债:HTTP/HTTPS