移动端向服务端提交数据——实现简单登录

本文介绍了一个具体的移动端与服务端交互案例,包括了服务端的servlet编写及移动端的GET与POST请求实现,展示了如何在Android应用中完成登录验证。

移动端通过网络连接与服务端进行数据交互,在App开发中占有很大比重,可以说服务端是移动端的“后勤部队”,服务端可以向移动端源源不断的更新“新鲜的血液”,使得移动端在应用市场上不那么轻易地“倒下”。


服务器端:

新建一个WEB工程

在src中新建一个servlet

package login_test;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class login extends HttpServlet {

	public login() {
		super();
	}


	public void destroy() {
		super.destroy(); // Just puts "destroy" string in log
		// Put your code here
	}


	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String username=request.getParameter("username");//采用ISO8859-1编码
		String password=request.getParameter("password");
		
		username=new String (username.getBytes("ISO8859-1"),"UTF-8");//采用iso8859-1进行你转换,转换成功字节数组,在采用utf——1编码对数据进行转换
		password=new String (password.getBytes("ISO8859-1"),"UTF-8");
		System.out.println("姓名"+username);
		System.out.println("密码"+password);
		if(username.equals("tianjie")&&password.equals("123")){
			
			//默认情况下使用的是iso8859——1编码,但是如果发现码表中没有当前字符,会使用当前系统下默认编码:GBK
			response.getOutputStream().write("登录成功".getBytes("utf-8"));
		}else{
			response.getOutputStream().write("登录失败".getBytes("UTF-8"));
		}
	}


	 
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		System.out.println("dopost!!!!!!");
				this.doGet(request, response);
	
	}

}

移动端:

新建android 工程

页面布局

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:orientation="vertical"
    tools:context=".MainActivity" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="账号" />
    <EditText 
        android:id="@+id/edt_username"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        />
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="密码" />
    <EditText 
        android:id="@+id/edt_password"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        />
    <Button 
        android:id="@+id/btn_submit_get"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="GET提交"
        />
    <Button 
        android:id="@+id/btn_submit_post"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="POST提交"
        />

</LinearLayout>


MainActivity.class

package com.example.login;

import com.example.Utils.NetUilts;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends Activity implements OnClickListener {
	private EditText edt_username,edt_password;
	private Button btn_submin_get,btn_submit_post;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		init();//初始化控件
	}
	public void init(){
		edt_username=(EditText) findViewById(R.id.edt_username);
		edt_password=(EditText) findViewById(R.id.edt_password);
		btn_submin_get=(Button) findViewById(R.id.btn_submit_get);
		btn_submit_post=(Button) findViewById(R.id.btn_submit_post);
		btn_submin_get.setOnClickListener(this);
		btn_submit_post.setOnClickListener(this);
	}
	@Override
	public void onClick(View v) {
		String username=edt_username.getText().toString();
		String password=edt_password.getText().toString();
		 switch(v.getId()){
		 case R.id.btn_submit_get:
			 doget(username,password);
			 break;
		 case R.id.btn_submit_post:
			 dopost(username,password);
			 break;
		 }
	}
	private void doget(final String username, final String password) {
		new Thread(new Runnable() {
			
			@Override
			public void run() {
				final String state=NetUilts.loginOfGet(username, password);
				
				runOnUiThread(new Runnable() {//执行任务在主线程中
					@Override
					public void run() {//就是在主线程中操作
						Toast.makeText(MainActivity.this, state, 0).show();
					}
				});
			}
		}).start();
	}
	private void dopost(final String username, final String password) {
		new Thread(new Runnable(){

			@Override
			public void run() {
				final String state=NetUilts.loginofPost(username, password);	
				runOnUiThread(new Runnable() {//执行任务在主线程中
					@Override
					public void run() {//就是在主线程中操作
						Toast.makeText(MainActivity.this, state, 0).show();
					}
				});
			}
			
		}).start();
	}

	

}

NetUils.class
package com.example.Utils;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

import android.media.MediaRecorder.OutputFormat;

public class NetUilts {
	/*
	 * 用post方式登录
	 * @param username
	 * @param password
	 * @return 登录状态
	 * */
	public static String  loginofPost(String username,String password){
		HttpURLConnection conn=null;
		try {
			URL url=new URL("http://192.168.1.106:8080/server_login/servlet/login");
			conn=(HttpURLConnection) url.openConnection();
			conn.setRequestMethod("POST");//设置请求方式
			conn.setConnectTimeout(10000);//设置连接超时时间
			conn.setReadTimeout(5000);//设置读取超时时间
			
			//POST请求的参数
			OutputStream out=conn.getOutputStream();//获得输出流对象,用于向服务器写数据
			String data="username="+username+"&"+"password="+password;
			out.write(data.getBytes());//向服务器写数据;
			out.close();//关闭输出流
			conn.connect();//开始连接
			int responseCode=conn.getResponseCode();//获取响应吗
			if(responseCode==200){
				//访问成功
				InputStream is=conn.getInputStream();//得到InputStream输入流
				String state=getstateFromInputstream(is);
				return state;
			}else{
				//访问失败
				
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			if(conn!=null){//如果conn不等于空,则关闭连接
				conn.disconnect();
			}
		}
		return null;
		
	}
	/*
	 * 使用GET的方式登录
	 * @param username
	 * @param password
	 * @return 登录状态
	 * */
	public static String loginOfGet(String username,String password){
		HttpURLConnection conn=null;
		try {
			String data="username="+username+"&"+"password="+password;
			URL url=new URL("http://192.168.1.106:8080/server_login/servlet/login?"+data);
			conn=(HttpURLConnection) url.openConnection();
			conn.setRequestMethod("GET");//设置请求方式
			conn.setConnectTimeout(10000);//设置连接超时时间
			conn.setReadTimeout(5000);//设置读取超时时间
			conn.connect();//开始连接
			int responseCode=conn.getResponseCode();//获取响应吗
			if(responseCode==200){
				//访问成功
				InputStream is=conn.getInputStream();//得到InputStream输入流
				String state=getstateFromInputstream(is);
				return state;
			}else{
				//访问失败
				
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			if(conn!=null){//如果conn不等于空,则关闭连接
				conn.disconnect();
			}
		}
		return null;
		
	}

	private static String getstateFromInputstream(InputStream is) throws IOException {
			ByteArrayOutputStream baos=new ByteArrayOutputStream();//定义一个缓存流
			byte[] buffer=new byte[1024];//定义一个数组,用于读取is
			int len=-1;
			while((len =is.read(buffer)) != -1){//将字节写入缓存
				baos.write(buffer,0,len);
			}
			is.close();//关闭输入流
			String state =baos.toString();//将缓存流中的数据转换成字符串
//			String state=new String (baos.toByteArray(),"GBK");//把流中的数据转换成字符串,采用的是GBk
			baos.close();
		return state;
	}
}

最后在AndroidManifest中添加权限

    <uses-permission android:name="android.permission.INTERNET"/>

如有不妥之处,请予以指正,谢谢!
1. 实训简介 描述实训项目整体功能简介,描述知识简介 本项目是一个基于Android客户端和Python服务端的简易实时聊天室系统,主要实现用户注册、登录认证和实时群聊功能。系统采用C/S架构,分为移动端服务端两个部分: (1). 客户端功能(Android) • 用户认证模块: o 注册功能:通过HTTP POST请求提交用户名/密码到服务端,完成账户创建 o 登录功能:验证凭证后获取唯一token用于后续通信 • 实时通信模块: o 建立Socket长连接实现消息实时收发 o 消息本地展示(含发送者、时间戳、内容) o 用户上下线状态通知 (2). 服务端功能(Python) • REST API服务: o 用户注册/登录接口(Flask实现) o 密码哈希存储(安全防护) o Token生成与验证机制 • 实时通信服务: o 多线程Socket服务器管理客户端连接 o 在线用户状态维护(字典存储) o 消息广播机制(群发/排除发送者) • 数据持久化: o SQLite数据库存储用户信息 o Token有效期管理 系统交互流程: 1. 用户通过Android客户端注册/登录获取token 2. 建立Socket连接时提交token进行认证 3. 认证成功后加入聊天室,可收发消息 4. 服务端实时广播消息并管理用户状态 要求:给出4 详细设计 4.1 系统数据数据库设计 说明:编写项目数据字典、E-R;(数据字典示例,R图示例);4.2 系统数据接口设计API 说明:api接口文档
07-10
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值