邮箱账号:
请输入邮箱帐号!
请输入账号密码!
请输入Djob码!
自动登录 (网吧,公共环境下请取消)
授权登录:
还没有账号,
福建创昱达信息技术有限公司
公司行业:
IT行业、计算机、互联网、通讯、电子、电子商务、仪器仪、微电子技术表等
招聘人数:
提供月薪:
工作性质:
学历要求:
大专及以上
工作年限:
年龄要求:
职位类别:
通信设计与开发类,Android开发工程师,J***A工程师
工作地点:
上海-杨浦区
职位描述:
&&&&熟悉android;参与app html页面开发工作;熟悉html 、html5、css、css3、js、jquery;(都熟悉者优先);接受能力较强,责任心强,学习态度积极。能承受一定的压力。
查看地图位置
统一***:5Android客户端与服务端交互之登陆示例
今天了解了一下android客户端与服务端是怎样交互的,发现其实跟web有点类似吧,然后网上找了大神的登陆示例,是基于IntentService的
1.后台使用简单的servlet,支持GET或POST。这个servlet最终返回给前台一个字符串flag,值是true或false,表示登录是否成功。
servlet使用之前需要配置,主义servlet的servlet-name要和servlet-mapping的servlet-name一致,否则找不到路径
我是在myEclipse上创建的一个web service 项目,然后部署到tomcat服务器上以便android客户端访问
helloWorld
com.zhongzhong.wap.action.HelloServlet
helloWorld
/queryOrder
import java.io.IOE
import java.io.PrintW
import javax.servlet.ServletE
import javax.servlet.http.HttpS
import javax.servlet.http.HttpServletR
import javax.servlet.http.HttpServletR
import javax.servlet.http.HttpS
import com.zhongzhong.wap.bean.UserB
public class HelloServlet extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doPost(req, resp);
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
resp.setContentType(text/html);
PrintWriter out = resp.getWriter();
Boolean flag =
String userName = req.getParameter(un);
String password = req.getParameter(pw);
if(userName.equals(htp)&&password.equals(123))
else flag =
System.out.println(userName:+userName+ password:+password);
out.print(flag);
out.flush();
out.close();
2.然后我是在安卓的ADT上创建一个安卓项目,建立两个Activity,分别作为登录界面和登录成功界面。
3.HTTP的访问公共类,用于处理GET和POST请求
package com.example.
import java.util.ArrayL
import java.util.L
import java.util.M
import org.apache.http.HttpR
import org.apache.http.NameValueP
import org.apache.http.client.HttpC
import org.apache.http.client.entity.UrlEncodedFormE
import org.apache.http.client.methods.HttpG
import org.apache.http.client.methods.HttpP
import org.apache.http.impl.client.DefaultHttpC
import org.apache.http.message.BasicNameValueP
import org.apache.http.util.EntityU
import android.content.E
import android.util.L
public class HttpUtil {
// 创建HttpClient对象
public static HttpClient httpClient = new DefaultHttpClient();
public static final String BASE_URL = http://192.168.3.14:8090/HelloWord/;
* @param url
发送请求的URL
* @return 服务器响应字符串
* @throws Exception
public static String getRequest(String url) throws Exception {
// 创建HttpGet对象。
HttpGet get = new HttpGet(url);
// 发送GET请求
HttpResponse httpResponse = httpClient.execute(get);
// 如果服务器成功地返回响应
if (httpResponse.getStatusLine().getStatusCode() == 200) {
// 获取服务器响应字符串
String result = EntityUtils.toString(httpResponse.getEntity());
Log.d(服务器响应代码, (new Integer(httpResponse.getStatusLine()
.getStatusCode())).toString());
* @param url
发送请求的URL
* @param params
* @return 服务器响应字符串
* @throws Exception
public static String postRequest(String url, Map rawParams)
throws Exception {
// 创建HttpPost对象。
HttpPost post = new HttpPost(url);
// 如果传递参数个数比较多的话可以对传递的参数进行封装
List params = new ArrayList();
for (String key : rawParams.keySet()) {
// 封装请求参数
params.add(new BasicNameValuePair(key, rawParams.get(key)));
// 设置请求参数
post.setEntity(new UrlEncodedFormEntity(params, UTF-8));
// 发送POST请求
HttpResponse httpResponse = httpClient.execute(post);
// 如果服务器成功地返回响应
if (httpResponse.getStatusLine().getStatusCode() == 200) {
// 获取服务器响应字符串
String result = EntityUtils.toString(httpResponse.getEntity());
4.IntentService服务,用于在后台以队列方式处理耗时操作。
package com.example.
import java.util.HashM
import android.app.IntentS
import android.content.I
import android.util.L
public class ConnectService extends IntentService {
private static final String ACTION_RECV_MSG = com.example.logindemo.action.RECEIVE_MESSAGE;
public ConnectService() {
super(TestIntentService);
// TODO Auto-generated constructor stub
protected void onHandleIntent(Intent intent) {
// TODO Auto-generated method stub
* 经测试,IntentService里面是可以进行耗时的操作的
* IntentService使用队列的方式将请求的Intent加入队列,
* 然后开启一个worker thread(线程)来处理队列中的Intent
* 对于异步的startService请求,IntentService会处理完成一个之后再处理第二个
Boolean flag =
//通过intent获取主线程传来的用户名和密码字符串
String username = intent.getStringExtra(username);
String password = intent.getStringExtra(password);
flag = doLogin(username, password);
Log.d(登录结果, flag.toString());
Intent broadcastIntent = new Intent();
broadcastIntent.setAction(ACTION_RECV_MSG);
broadcastIntent.addCategory(Intent.CATEGORY_DEFAULT);
broadcastIntent.putExtra(result, flag.toString());
sendBroadcast(broadcastIntent);
// 定义发送请求的方法
private Boolean doLogin(String username, String password)
String strFlag = ;
// 使用Map封装请求参数
HashMap map = new HashMap();
map.put(un, username);
map.put(pw, password);
// 定义发送请求的URL
String url = HttpUtil.BASE_URL + queryOrder?un= + username + &pw= +
// String url = HttpUtil.BASE_URL + LoginS //POST方式
Log.d(url, url);
Log.d(username, username);
Log.d(password, password);
// 发送请求
strFlag = HttpUtil.postRequest(url, map);
//POST方式
strFlag = HttpUtil.getRequest(url);
Log.d(服务器返回值, strFlag);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
if(strFlag.trim().equals(true)){
5。在Manifest.xml中注册IntentService。注意uses-permission节点,为程序开启访问网络的权限。
6.登陆界面处理,注意
按钮***事件中,使用Intent将要传递的值传给service。接收广播类中,同样使用Intent将要传递的值传给下一个Activity。在onCreate()中,动态注册接收广播类的实例receiver。在接收广播类中,不要使用完毕后忘记注销接收器,否则会报一个Are you missing a call to unregisterReceiver()? 的异常。
package com.example.
import android.os.B
import android.app.A
import android.content.BroadcastR
import android.content.C
import android.content.I
import android.content.IntentF
import android.util.L
import android.view.M
import android.view.V
import android.view.View.OnClickL
import android.widget.B
import android.widget.EditT
import android.widget.T
public class MainActivity extends Activity {
private static final String ACTION_RECV_MSG = com.example.logindemo.action.RECEIVE_MESSAGE;
private Button loginB
private EditText et_
private EditText et_
private String userN
private String passW
private MessageR
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
//动态注册receiver
IntentFilter filter = new IntentFilter(ACTION_RECV_MSG);
filter.addCategory(Intent.CATEGORY_DEFAULT);
receiver = new MessageReceiver();
registerReceiver(receiver, filter);
private void initView() {
// TODO Auto-generated method stub
et_username = (EditText)findViewById(R.id.et_user);
et_password =( EditText)findViewById(R.id.et_psw);
loginBtn = (Button)findViewById(R.id.btn_login);
loginBtn.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
if(matchLoginMsg())
// 如果校验成功
Intent msgIntent = new Intent(MainActivity.this, ConnectService.class);
msgIntent.putExtra(username, et_username.getText().toString().trim());
msgIntent.putExtra(password, et_password.getText().toString().trim());
startService(msgIntent);
protected boolean matchLoginMsg() {
// TODO Auto-generated method stub
userName = et_username.getText().toString().trim();
passWord = et_password.getText().toString().trim();
if(userName.equals())
Toast.makeText(MainActivity.this, 账号不能为空,Toast.LENGTH_SHORT).show();
if(passWord.equals())
Toast.makeText(MainActivity.this, 密码不能为空,Toast.LENGTH_SHORT).show();
//接收广播类
public class MessageReceiver extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
String message = intent.getStringExtra(result);
Log.i(MessageReceiver, message);
// 如果登录成功
if (message.equals(true)){
// 启动Main Activity
Intent nextIntent = new Intent(MainActivity.this, NaviActivity.class);
startActivity(nextIntent);
// 结束该Activity
//注销广播接收器
context.unregisterReceiver(this);
Toast.makeText(MainActivity.this, 用户名或密码错误,请重新输入!,Toast.LENGTH_SHORT).show();
public boolean onCreateOptionsMenu(Menu menu) {
// I this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
运行截图:
(window.slotbydup=window.slotbydup || []).push({
id: '2467140',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467141',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467142',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467143',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467148',
container: s,
size: '1000,90',
display: 'inlay-fix'&&&&&& 最近的Android项目开发过程中一个问题困扰自己很长时间,Android客户端与服务器交互有几种方式,最常见的就是webservices和json。要在Android手机客户端与pc服务器交互,需要满足下面几种条件:跨平台、传输数据格式标准、交互方便。
&&&&& 为了与服务器通讯其实无非就两种协议HTTP和TCP,TCP的学习Socket,HTTP的话熟悉一下HTTP协议和相关Java API。而下面的几种方式就是从这两种协议扩展出来的:webservices soap、SSH的JSON(可参考:)、xmlrpc(wordpress for android)......
&& && Socket 不推荐 ,HTTP RESTful 推荐。跟服务器传数据的话,一般都是采用 RESTful API 来传输。这样首先要对 HTTP 协议有初步的理解,至少知道 GET / POST 分别是干嘛的有什么区别。
&&&&& 如果没有特殊要求,使用比较简单及通用,如果对数据大小及传输速度有要求的话就用json更合适。
【Socket与HTTP连接的区别】
&&&&& HTTP连接使用的是&请求&响应&的方式,不仅在请求时需要先建立连接,而且需要客户端向服务器发出请求后,服务器端才能回复数据。
socket是可以***,因此Socket连接一旦建立,通信双方即可开始相互发送数据内容,直到双方连接断开。保持客户端与服务器数据的实时与同步。
&&&&& xml rpc是使用http协议做为传输协议的rpc机制,使用xml文本的方式传输命令和数据。
RPC是Remote Procedure Call的缩写,翻译成中文就是远程过程调用,是一种在本地的机器上调用远端机器上的一个过程(方法)的技术,这个过程也被大家称为&分布式计算&
&&&& 网上有很多例子来演示客户端和服务器端数据如何实现交互。不过这些例子大多比较繁杂,对于初学者来说这是不利的,现在介绍一种代码简单、逻辑清晰的交互例子:
一、服务器端:
代码1:添加名为&AndroidServerServlet.java&的文件
1 package com.ghj.
3 import java.io.IOE
4 import java.io.PrintW
6 import javax.servlet.ServletE
7 import javax.servlet.http.HttpS
8 import javax.servlet.http.HttpServletR
9 import javax.servlet.http.HttpServletR
11 public class AndroidServerServlet extends HttpServlet {
private static final long serialVersionUID = 8634227L;
public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
response.setContentType(text/ charset=UTF-8);
request.setCharacterEncoding(UTF-8);
System.err.println(request.getParameter(clientData));
PrintWriter printWriter = response.getWriter();
printWriter.print(您好Android客户端!);
printWriter.flush();
printWriter.close();
代码2:修改名为&web.xml&的文件
1 &!--?xml version=1.0 encoding=UTF-8?--&
2 &web-app http:="=" javaee="ns=" version="2.5" web-app_2_5.xsd="xml=" xmlns="/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemalocation="/xml/ns/javaee"&&servlet&
&servlet-name&AndroidServerServlet&/servlet-name&
&servlet-class&com.ghj.packageofservlet.AndroidServerServlet&/servlet-class&
&/servlet&
&servlet-mapping&
&servlet-name&AndroidServerServlet&/servlet-name&
&url-pattern&/AndroidServerServlet&/url-pattern&
&/servlet-mapping&
11 &/web-app&
二、Android手机客户端:
代码1:添加名为&AndroidClientActivity.java&的文件
1 package com.example.
3 import java.io.IOE
4 import java.io.UnsupportedEncodingE
5 import java.util.ArrayL
6 import java.util.L
8 import org.apache.http.HttpR
9 import org.apache.http.NameValueP
10 import org.apache.http.client.ClientProtocolE
11 import org.apache.http.client.HttpC
12 import org.apache.http.client.entity.UrlEncodedFormE
13 import org.apache.http.client.methods.HttpP
14 import org.apache.http.impl.client.DefaultHttpC
15 import org.apache.http.message.BasicNameValueP
16 import org.apache.http.protocol.HTTP;
17 import org.apache.http.util.EntityU
19 import android.app.A
20 import android.os.B
21 import android.os.H
22 import android.os.M
23 import android.view.V
24 import android.view.View.OnClickL
25 import android.widget.B
26 import android.widget.T
28 public class AndroidClientActivity extends Activity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.android_client);
Button sendButton = (Button) findViewById(R.id.send_button);
sendButton.setOnClickListener(new OnClickListener(){
public void onClick(View v) {
new Thread(new Runnable(){
public void run() {
HttpPost httpRequest = new HttpPost(http://172.16.99.207:8080/AndroidServer/AndroidServerServlet);
List&namevaluepair& params = new ArrayList&namevaluepair&();
params.add(new BasicNameValuePair(clientData, 您好服务器端!));
Message message = new Message();
Bundle bundle = new Bundle();
httpRequest.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));//设置请求参数项
HttpClient httpClient = new DefaultHttpClient();
HttpResponse httpResponse = httpClient.execute(httpRequest);//执行请求返回响应
if(httpResponse.getStatusLine().getStatusCode() == 200){//判断是否请求成功
bundle.putString(msg, EntityUtils.toString(httpResponse.getEntity()));
bundle.putString(msg, 没有获取到Android服务器端的响应!);
message.setData(bundle);
handler.sendMessage(message);
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}).start();
private Handler handler = new Handler(){
public void handleMessage(Message message) {
super.handleMessage(message);
Bundle bundle = message.getData();
String msg = bundle.getString(msg);
Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_LONG).show();
80 }&/namevaluepair&&/namevaluepair&
参考出处:1.
&&&&&&&&&&&&&&&&& 2.
阅读(...) 评论()