android客户端和服务器端怎么交互
android客户端和服务器端是基于IntentService的,具体如下:
后台使用简单的servlet,支持GET或POST。这个servlet最终返回给前台一个字符串flag,值是true或false,表示登录是否成功。
然后在安卓的ADT上创建一个安卓项目,建立两个Activity,分别作为登录界面和登录成功界面。
HTTP的访问公共类,用于处理GET和POST请求。
IntentService服务,用于在后台以队列方式处理耗时操作。
在AndroidManifestxml中注册IntentService。注意uses-permission节点,为程序开启访问网络的权限。
登陆界面处理,注意按钮监听事件中,使用Intent将要传递的值传给service。接收广播类中,同样使用Intent将要传递的值传给下一个Activity。在onCreate()中,动态注册接收广播类的实例receiver。在接收广播类中,不要使用完毕后忘记注销接收器,否则会报一个Are you missing a call to unregisterReceiver() 的异常。
登录验证账号密码是否匹配肯定是在后台。
需要在android把账号密码发到服务器,服务器再去查sql,然后返回给android一个Json,最后android解析Json就可以了。
具体代码和界面到这里看。
http://blogcsdnnet/banboofly/article/details/52931387
package comtest;
import javaioBufferedReader;
import javaioInputStreamReader;
import javaioOutputStream;
import javanetHttpURLConnection;
import javanetURL;
import javanetURLEncoder;
import javautilHashMap;
import javautilMap;
import orgjsonJSONObject;
import androidappActivity;
import androidcontentIntent;
import androidosBundle;
import androidosHandler;
import androidosLooper;
public class TestPost extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
superonCreate(savedInstanceState);
setContentView(Rlayoutloading);
new Handler()postDelayed(new Runnable() {
@Override
public void run() {
final Map<String, String> params0 = new HashMap<String, String>();
params0put("username", username);
params0put("password", password);
final String url0 = "http://192168011:80/xxxxphp";
Runnable downloadRun = new Runnable() {
@Override
public void run() {
Looperprepare();
try {
String result0 = sendPostRequest(
params0, url0);
JSONObject jsonObject = new JSONObject(result0);
String status = jsonObjectgetString("status");
String message = jsonObjectgetString("message");
if (statusequals("success")) {
//成功干啥
} else {
//失败干啥
}
} catch (Exception e) {
//出现异常干啥
}
}
};
new Thread(downloadRun)start();
}
}, 200);
}
//post请求方法
public String sendPostRequest(Map<String, String> params, String actionurl)
throws Exception {
String URl = actionurl;
StringBuilder sb = new StringBuilder();
if (params != null && !paramsisEmpty()) {
for (MapEntry<String, String> entry : paramsentrySet()) {
sbappend(entrygetKey())append('=')
append(URLEncoderencode(entrygetValue(), "UTF-8"))
append('&');
}
sbdeleteCharAt(sblength() - 1);
}
byte[] entitydata = sbtoString()getBytes();// 得到实体的二进制数据
URL url = new URL(URl);
HttpURLConnection conn = (HttpURLConnection) urlopenConnection();
connsetDoInput(true);
connsetRequestMethod("POST");
connsetConnectTimeout(10000);
connsetDoOutput(true);// 如果通过post提交数据,必须设置允许对外输出数据
connsetUseCaches(false);// 是否缓存
connsetRequestProperty("Content-Type","application/x-www-form-urlencoded");
connsetRequestProperty("Content-Length",StringvalueOf(entitydatalength));
OutputStream outStream = conngetOutputStream();
outStreamwrite(entitydata);
outStreamflush();
outStreamclose();
BufferedReader bufferRead = null;
if(conngetResponseCode() == 200){
bufferRead = new BufferedReader(new InputStreamReader(conngetInputStream()));
}
String result = "";
String readLine = null;
while ((readLine = bufferReadreadLine()) != null) {
result += readLine;
}
bufferReadclose();
conndisconnect();
return result;
}
}
我用的是这种方法
你好,很高兴为你作答!下面有几种可能:
①明日之后中,你登入的区服不一样,例如你玩的是“秋日森林”,现在又跑到了“白树高地”(这个可能性不大)
②如果你是在应用商店下载的,假如你换手机了,换了不一样品牌的手机,例如你本来用的是“小米”,现在又用了“华为”,“小米”用的是小米账号,而“华为”用的是华为账号,这样数据就不一样了
③你用同一个手机的话,可能是你用不同方式下载的。例如你当初是在“应用商店”下载的,现在就在“应用宝”下载的
在Android上有类似于session的东西,叫做Application。
1、你可以新建一个类,例如:HelloWordApplicationjava(名字随你取)
在这个类里面设定你要全局的数据变量,例如:private String loginName;
然后生成它的get、set方法。
2、在AndroidManifestxml文件中配置你的Application类,方法如下:
<application android:icon="@drawable/icon" android:label="@string/app_name" android:name="HelloWordApplication">
<activity >
//略
</activity>
</application>
就是在<application>标签儿中增加android:name="HelloWordApplication"的属性配置。
3、在使用的时候:
HelloWordApplicationapplication = (HelloWordApplication)getApplication();
applicationsetLoginName("百度");
则就将"百度"保存到了Application里,其他地方要用的时候,applicationgetLoginName();就可以了。
方法如下:
在Activity中调用 JsonUtil工具类 只需要
调用findAll方法即可,如:
JsonUtilfindAll(strUrl); // strUrl: 连接地址
若需要传值如s:strUrl = http:127001:8080/xxxxid=1&name=shsjhs;
public class JsonUtil {
public static String json;
public static String findAll(String strUrl) throws Exception {
// 创建请求HttpClient客户端
Systemoutprintln("连接上服务器");
HttpClient httpClient = new DefaultHttpClient();
// 创建请求的url
// 创建请求的对象
HttpGet get = new HttpGet(new URI(strUrl));
// 发送get请求
HttpResponse httpResponse = httpClientexecute(get);
// 如果服务成功返回响应
if (httpResponsegetStatusLine()getStatusCode() == 200) {
HttpEntity entity = httpResponsegetEntity();
if (entity != null) {
// 获取服务器响应的json字符串
json = EntityUtilstoString(entity, "UTF-8");
Systemoutprintln(json); //输出返回的字符串信息
}
} else {
Systemoutprintln("连接超时");
}
return json;
}
}
0条评论