257,Android程序员如何有效提升学习效率

__android_log_print(ANDROID_LOG_ERROR,TAG,“JNI-login: username = %s, passwd = %s, isDriver = %s”,

username, passwd, isDriver);

//封装一个数据协议

/*

给服务端的协议

http://ip:port/login [json_data]

{

username: “gailun”,

password: “123123”,

driver: “yes”

}

  • */

//(1)封装一个json字符串

cJSON *root = cJSON_CreateObject();

cJSON_AddStringToObject(root, “username”, username);

cJSON_AddStringToObject(root, “password”, passwd);

cJSON_AddStringToObject(root, “driver”, isDriver);

post_str = cJSON_Print(root);

cJSON_Delete(root);//释放root的空间

root = NULL;

__android_log_print(ANDROID_LOG_ERROR,TAG,“JNI-login: post_str = [%s]\n”, post_str);

//(2) 想web服务器 发送http请求 其中post数据 json字符串

//1 设置curl url

curl_easy_setopt(curl, CURLOPT_URL, “http://101.200.190.150:7777/login”);

//2 开启post请求开关

curl_easy_setopt(curl, CURLOPT_POST, true);

//3 添加post数据

curl_easy_setopt(curl, CURLOPT_POSTFIELDS, post_str);

//4 设定一个处理服务器响应的回调函数,deal_response是回调函数

curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, deal_response);

//5 给回调函数传递一个形参

curl_easy_setopt(curl, CURLOPT_WRITEDATA, &responseData);

//6 向服务器发送请求,等待服务器的响应

res = curl_easy_perform(curl);

if (res != CURLE_OK) {

__android_log_print(ANDROID_LOG_ERROR,TAG,“JNI-login:perform ERROR, rescode= [%d]\n”,

res);

return JNI_FALSE;

}

//(3) 等待服务器的响应 此刻的responseData就是从服务器获取的数据

/*

//成功

{

result: “ok”,

}

//失败

{

result: “error”,

reason: “why…”

}

  • */

//(4) 解析服务器返回的json字符串

root = cJSON_Parse(responseData.data);

cJSON *result = cJSON_GetObjectItem(root, “result”);

if(result && strcmp(result->valuestring, “ok”) == 0) {

//登陆成功

__android_log_print(ANDROID_LOG_ERROR,TAG,“JNI-login:login succ!!!”);

return JNI_TRUE;

}

else {

//登陆失败

cJSON* reason = cJSON_GetObjectItem(root, “reason”);

if (reason) {

//已知错误

__android_log_print(ANDROID_LOG_ERROR,TAG,“JNI-login:login error, reason = %s!!!”, reason->valuestring);

}

else {

//未知的错误

__android_log_print(ANDROID_LOG_ERROR,TAG,“JNI-login:login error, reason = Unknow!!!”);

}

return JNI_FALSE;

}

return JNI_TRUE;

}

服务器代码如下http_server.c:

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h> //for getopt, fork

#include <string.h> //for strcat

//for struct evkeyvalq

#include <sys/queue.h>

#include <event.h>

//for http

//#include <evhttp.h>

#include <event2/http.h>

#include <event2/http_struct.h>

#include <event2/http_compat.h>

#include <event2/util.h>

#include <signal.h>

#include <cJSON.h>

#define MYHTTPD_SIGNATURE “MoCarHttpd v0.1”

//处理模块

void httpd_handler(struct evhttp_request *req, void *arg) {

char output[2048] = “\0”;

char tmp[1024];

//获取客户端请求的URI(使用evhttp_request_uri或直接req->uri)

const char *uri;

uri = evhttp_request_uri(req);

#if 0

sprintf(tmp, “uri=%s\n”, uri);// /data?cmd=new…

strcat(output, tmp);

#endif

sprintf(tmp, “uri=%s\n”, req->uri);

strcat(output, tmp);

//decoded uri

char *decoded_uri;

decoded_uri = evhttp_decode_uri(uri);

sprintf(tmp, “decoded_uri=%s\n”, decoded_uri);// /data?cmd= newFile …

strcat(output, tmp);

//http://127.0.0.1:8080/username=gailun&passwd=123123

//解析URI的参数(即GET方法的参数)

struct evkeyvalq params;//key —value, key2— value2// cmd — newfile fromId == 0

//将URL数据封装成key-value格式,q=value1, s=value2

evhttp_parse_query(decoded_uri, &params);

//得到q所对应的value

sprintf(tmp, “username=%s\n”, evhttp_find_header(&params, “username”));

strcat(output, tmp);

//得到s所对应的value

sprintf(tmp, “passwd=%s\n”, evhttp_find_header(&params, “passwd”));

strcat(output, tmp);

free(decoded_uri);

//获取POST方法的数据

char *post_data = (char *) EVBUFFER_DATA(req->input_buffer);

sprintf(tmp, “post_data=%s\n”, post_data);

strcat(output, tmp);

/*

具体的:可以根据GET/POST的参数执行相应操作,然后将结果输出

*/

//入库

/* 输出到客户端 */

//HTTP header

evhttp_add_header(req->output_headers, “Server”, MYHTTPD_SIGNATURE);

evhttp_add_header(req->output_headers, “Content-Type”, “text/plain; charset=UTF-8”);

evhttp_add_header(req->output_headers, “Connection”, “close”);

//输出的内容

struct evbuffer *buf;

buf = evbuffer_new();

evbuffer_add_printf(buf, “It works!\n%s\n”, output);

//将封装好的evbuffer 发送给客户端

evhttp_send_reply(req, HTTP_OK, “OK”, buf);

evbuffer_free(buf);

}

//处理模块

void login_handler(struct evhttp_request *req, void *arg) {

printf("got connection ");

char request_data[4096] = {0};

//获取POST方法的数据

size_t post_size = EVBUFFER_LENGTH(req->input_buffer);

char *post_data = (char *) EVBUFFER_DATA(req->input_buffer);

memcpy(request_data, post_data, post_size);

printf(“post_data = [%s], len =%ld\n”, post_data, post_size);

char username[256] = {0};

char password[256] = {0};

char isDriver[10] = {0};

/*

具体的:可以根据GET/POST的参数执行相应操作,然后将结果输出

*/

/*

给服务端的协议

http://ip:port/login [json_data]

{

username: “gailun”,

password: “123123”,

driver: “yes”

}

  • */

cJSON *root = cJSON_Parse(request_data);

cJSON* username_obj = cJSON_GetObjectItem(root, “username”);

strcpy(username, username_obj->valuestring);

cJSON* password_obj = cJSON_GetObjectItem(root, “password”);

strcpy(password, password_obj->valuestring);

cJSON* isDriver_obj = cJSON_GetObjectItem(root, “driver”);

strcpy(isDriver, isDriver_obj->valuestring);

printf(“username = %s, password = %s, isDriver = %s\n”, username, password, isDriver);

cJSON_Delete(root);

printf(“----\n”);

//查询数据库 得到查询结果

//给前段回复一个响应结果

cJSON*response_root = cJSON_CreateObject();

cJSON_AddStringToObject(response_root, “result”, “ok”);

char *response_str = cJSON_Print(response_root);

/* 输出到客户端 */

//HTTP header

evhttp_add_header(req->output_headers, “Server”, MYHTTPD_SIGNATURE);

evhttp_add_header(req->output_headers, “Content-Type”, “text/plain; charset=UTF-8”);

evhttp_add_header(req->output_headers, “Connection”, “close”);

//输出的内容

struct evbuffer *buf;

buf = evbuffer_new();

evbuffer_add_printf(buf, “%s”, response_str);

//将封装好的evbuffer 发送给客户端

evhttp_send_reply(req, HTTP_OK, “OK”, buf);

最后

**一个零基础的新人,我认为坚持是最最重要的。**我的很多朋友都找我来学习过,我也很用心的教他们,可是不到一个月就坚持不下来了。我认为他们坚持不下来有两点主要原因:

他们打算入行不是因为兴趣,而是因为所谓的IT行业工资高,或者说完全对未来没有任何规划。

刚开始学的时候确实很枯燥,这确实对你是个考验,所以说坚持下来也很不容易,但是如果你有兴趣就不会认为这是累,不会认为这很枯燥,总之还是贵在坚持。

技术提升遇到瓶颈了?缺高级Android进阶视频学习提升自己吗?还有大量大厂面试题为你面试做准备!

点击:Android 学习,面试文档,视频收集大整理

来获取学习资料提升自己去挑战一下BAT面试难关吧

对于很多Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。整理的这些知识图谱希望对Android开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。

不论遇到什么困难,都不应该成为我们放弃的理由!

如果有什么疑问的可以直接私我,我尽自己最大力量帮助你!

教他们,可是不到一个月就坚持不下来了。我认为他们坚持不下来有两点主要原因:

他们打算入行不是因为兴趣,而是因为所谓的IT行业工资高,或者说完全对未来没有任何规划。

刚开始学的时候确实很枯燥,这确实对你是个考验,所以说坚持下来也很不容易,但是如果你有兴趣就不会认为这是累,不会认为这很枯燥,总之还是贵在坚持。

技术提升遇到瓶颈了?缺高级Android进阶视频学习提升自己吗?还有大量大厂面试题为你面试做准备!

点击:Android 学习,面试文档,视频收集大整理

来获取学习资料提升自己去挑战一下BAT面试难关吧

[外链图片转存中…(img-DL4HgMyj-1710330195368)]

对于很多Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。整理的这些知识图谱希望对Android开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。

不论遇到什么困难,都不应该成为我们放弃的理由!

如果有什么疑问的可以直接私我,我尽自己最大力量帮助你!

最后祝各位新人都能坚持下来,学有所成。

  • 17
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值