为了账号安全,请及时绑定邮箱和手机立即绑定

作业社区

探索学习新天地,共享知识资源!

0 提交作业
0 布置作业
0 满分作业
得分 95
讨论题

农夫三拳啊 的学生作业:

** 小红书 ** 方向设计 市场分析:在小红书出现之前,市场上的内容分享平台主要以短视频为主,而配图+文案的形式存在较大的空缺。小红书抓住了这一市场机会,通过提供以配图+文案为主体的内容分享平台,满足了用户在这一方面的需求。 自身优势:小红书拥有一群自带流量的明星入驻,这为平台带来了大量的初始用户和关注度。此外,专业的运营团队确保了平台内容的质量和用户体验。 产品定位:小红书定位为向年轻人(主流是女性)提供在任何场景下,通过中心化分发方式的内容分享以及消费服务。它解决了发布者的分享需求和播主的带货需求,同时让接收者获得信息和打发时间,平台则通过佣金和广告价值实现盈利。 用户定位 用户群体:以女性为主,年龄层主要集中在90后和00后,具有全球视野。 使用场景:用户可以在任何时间使用小红书,无论是有目的的查找信息还是打发时间。 需求真伪:用户在小红书上的主要需求包括交友和分享,这些需求是真实存在的,平台通过提供相应的功能和服务来满足这些需求。 功能设计 1. 功能优先级 首页:作为用户进入平台后看到的第一个界面,首页展示了个性化推荐的内容,是用户获取信息的主要入口。 关注:用户可以关注感兴趣的博主,以便及时获取他们的最新内容。 发现:提供各种分类的内容,如推荐、直播、短剧、情感等,帮助用户发现感兴趣的内容。 同城:展示用户所在城市的内容,增加地域相关性。 热门:展示当前热门的内容和话题,帮助用户了解最新的趋势。 发布:用户可以通过此功能发布自己的内容,包括图文和视频。 消息:包括通知、互动和私信,帮助用户与平台和其他用户进行互动。 个人主页:展示用户的个人信息和发布的内容,是用户个人品牌的展示窗口。 搜索:提供模糊和精确搜索功能,帮助用户快速找到所需信息。 信息流分发+广告:通过算法推荐,将内容和广告推送给感兴趣的用户。 购物车:支持交易和物流信息的查看,方便用户进行购物。 2. 功能设计 App产品架构: 图标:红色,引人注目。 应用层:白色,简约。 业务层:包括登录注册、推送、关注、同城和内容等功能。 数据层:存储个人账号信息、文章、图片、音频、视频、栏目和广告等数据。 3. 功能架构 个人主页:展示用户的个人信息和发布的内容。 信息流分发:通过算法推荐内容给用户。 搜索:提供模糊和精确搜索功能。 广告位:展示广告,实现商业化。 评论:用户可以对内容进行评论,增加互动性。 私信:用户之间可以进行私密交流。 分享:用户可以将内容分享到其他平台。 购物车:支持购物功能,方便用户购买商品。 异常处理:处理各种异常情况,确保平台稳定运行。 商业化设计 后向收费(广告):通过在平台上展示广告,向广告主收取费用。小红书的广告资源丰富,包括信息流广告、搜索广告等,能够满足不同广告主的需求。 商品交易佣金:小红书通过电商功能,允许用户在平台上购买商品。平台从每笔交易中收取一定比例的佣金,作为收入来源之一。 增长策略 内容推荐算法:小红书的推荐算法通过给笔记打上标签,尝试性推荐给对这些标签感兴趣的用户。根据用户的交互行为(如点赞、收藏、转发、评论、关注等)给笔记打分,决定是否继续推荐给更多用户。得分高的笔记还会获得来自站内搜索和百度搜索等流量的加持,具有很强的长尾效应。 功能优化:小红书不断优化功能,如“内容广场-热门笔记”和“私信通”功能的升级,提升内容曝光和用户互动。这些功能通过智能推荐算法和精细化排序,帮助用户更快找到感兴趣的内容,同时提升品牌和商家的营销效果。 创作者激励政策:小红书推出创作者激励政策,鼓励用户分享更多原创内容,并通过优化算法推荐机制,提升用户体验。此外,小红书还举办了多场线上直播活动,吸引了大量用户参与互动,进一步增强了平台的社区氛围。 国际化发展:小红书通过提供优质内容,吸引了大量海外用户,推动了国际化发展。例如,利用TikTok可能被禁的契机,吸引了大量美国用户涌入,注册账号并分享内容,使得小红书在美国下载量激增。

得分 100
学习任务

别摸我的键盘 的学生作业:

client #include #include #include #include /* See NOTES */ #include #include #include #include int main(int argc, const char *argv[]) { int sockfd,ret; struct sockaddr_in addr_in; char buf[] = {"Hello buffer"}; ssize_t sz; if(argc != 3){ fprintf(stderr, "[ERROR] %s \n", argv[0]); exit(EXIT_FAILURE); } sockfd= socket(AF_INET, SOCK_STREAM, 0); if(sockfd == -1){ perror("[ERROR] socket()"); exit(EXIT_FAILURE); } //清空 相当于memset() bzero(&addr_in, sizeof(addr_in)); addr_in.sin_family = AF_INET; addr_in.sin_port = htons(atoi(argv[2])); addr_in.sin_addr.s_addr = inet_addr(argv[1]); ret = connect(sockfd, (const struct sockaddr *)&addr_in, sizeof(addr_in)); if(ret == -1){ perror("[ERROR] connect()"); exit(EXIT_FAILURE); } char *sendbuf; int length; while(1){ length = strlen(buf); sendbuf = (char *)malloc(length + 4); memcpy(sendbuf, &length, 4); memcpy(sendbuf + 4, buf, length); sz = send(sockfd, sendbuf, length + 4, 0); if(sz == -1){ perror("[ERROR] send()"); exit(EXIT_FAILURE); } if(strncmp(buf, "quit", 4) == 0){ break; } free(sendbuf); //在 Linux C 编程中,`usleep` 是一个用于微秒级延时的函数 usleep(100); } close(sockfd); return 0; } server #include #include #include #include /* See NOTES */ #include #include #include #include #define QUEUE_SZ 10 int main(int argc, const char *argv[]) { int sockfd,ret,csockfd; struct sockaddr_in addr_in; char buf[1024]; ssize_t sz; if(argc != 3){ fprintf(stderr, "[ERROR] %s \n", argv[0]); exit(EXIT_FAILURE); } sockfd= socket(AF_INET, SOCK_STREAM, 0); if(sockfd == -1){ perror("[ERROR] socket()"); exit(EXIT_FAILURE); } //清空 相当于memset() bzero(&addr_in, sizeof(addr_in)); addr_in.sin_family = AF_INET; addr_in.sin_port = htons(atoi(argv[2])); addr_in.sin_addr.s_addr = inet_addr(argv[1]); ret = bind(sockfd, (const struct sockaddr *)&addr_in, sizeof(addr_in)); if(ret == -1){ perror("[ERROR] bind()"); exit(EXIT_FAILURE); } ret = listen(sockfd, QUEUE_SZ); if(-1 == ret){ perror("[ERROR] listen()"); exit(EXIT_FAILURE); } int len = sizeof(addr_in); csockfd = accept(sockfd, (struct sockaddr *)&addr_in, &len); if(-1 == csockfd){ perror("[ERROR] accept()"); exit(EXIT_FAILURE); } // printf("client ip is %s\n", inet_ntoa(addr_in.sin_addr)); // printf("client port is %d\n", ntohs(addr_in.sin_port)); int recv_total_sz; int length; while(1){ length = 0; recv_total_sz = 0; memset(buf, 0, sizeof(buf)); sz = recv(csockfd, &length, 4, 0); if(-1 == sz){ perror("[ERROR] recv()"); exit(EXIT_FAILURE); } while(1){ sz = recv(csockfd, buf + recv_total_sz, length - recv_total_sz, 0); if(-1 == sz){ perror("[ERROR] recv()"); exit(EXIT_FAILURE); }else if(sz > 0){ recv_total_sz += sz; if(recv_total_sz == length){ break; } } } printf("recv data is --> %s\n", buf); if(strncmp(buf, "quit", 4) == 0){ printf("server quit!\n"); break; } sleep(1); }; close(csockfd); close(sockfd); return 0; }

得分 100
学习任务

别摸我的键盘 的学生作业:

1.tcp粘包(主要是自定义结构)的原因,可以从两方面分析,一个是发送方,一个是接收方 (一)发送方角度: 1)当发送方发送的数据小于内核缓冲区时,默认情况下,会使用Nagle算法,合并多个包,导致TCP粘包 2)另外一个情况时,发送包的大小超过MTU,导致一个包被拆分成多个,也会导致TCP粘包问题 (二)接收方角度: 如果发送方发送的速度,远远大于接收方,接收方在读取缓存时,就有可能读取到多个包,或者读取到被拆分不完整的包 2.粘包代码验证(发送方速度大于接收方) 发送方 #include #include #include #include /* See NOTES */ #include #include #include #include int main(int argc, const char *argv[]) { int sockfd,ret; struct sockaddr_in addr_in; char buf[64]; ssize_t sz; if(argc != 3){ fprintf(stderr, "[ERROR] %s \n", argv[0]); exit(EXIT_FAILURE); } sockfd= socket(AF_INET, SOCK_STREAM, 0); if(sockfd == -1){ perror("[ERROR] socket()"); exit(EXIT_FAILURE); } //清空 相当于memset() bzero(&addr_in, sizeof(addr_in)); addr_in.sin_family = AF_INET; addr_in.sin_port = htons(atoi(argv[2])); addr_in.sin_addr.s_addr = inet_addr(argv[1]); ret = connect(sockfd, (const struct sockaddr *)&addr_in, sizeof(addr_in)); if(ret == -1){ perror("[ERROR] connect()"); exit(EXIT_FAILURE); } printf("please input send data\n"); while(1){ memset(buf, 0, sizeof(buf)); strcpy(buf, "hello server"); if(buf[sizeof(buf) -1] == '\n') buf[sizeof(buf) - 1] = '\0'; sz = send(sockfd, buf, strlen(buf), 0); if(sz == -1){ perror("[ERROR] send()"); exit(EXIT_FAILURE); } if(strncmp(buf, "quit", 4) == 0){ break; } } close(sockfd); return 0; } 接收方 #include #include #include #include /* See NOTES */ #include #include #include #include #define QUEUE_SZ 10 int main(int argc, const char *argv[]) { int sockfd,ret,csockfd; struct sockaddr_in addr_in; char buf[64]; ssize_t sz; if(argc != 3){ fprintf(stderr, "[ERROR] %s \n", argv[0]); exit(EXIT_FAILURE); } sockfd= socket(AF_INET, SOCK_STREAM, 0); if(sockfd == -1){ perror("[ERROR] socket()"); exit(EXIT_FAILURE); } //清空 相当于memset() bzero(&addr_in, sizeof(addr_in)); addr_in.sin_family = AF_INET; addr_in.sin_port = htons(atoi(argv[2])); addr_in.sin_addr.s_addr = inet_addr(argv[1]); ret = bind(sockfd, (const struct sockaddr *)&addr_in, sizeof(addr_in)); if(ret == -1){ perror("[ERROR] bind()"); exit(EXIT_FAILURE); } ret = listen(sockfd, QUEUE_SZ); if(-1 == ret){ perror("[ERROR] listen()"); exit(EXIT_FAILURE); } int len = sizeof(addr_in); csockfd = accept(sockfd, (struct sockaddr *)&addr_in, &len); if(-1 == csockfd){ perror("[ERROR] accept()"); exit(EXIT_FAILURE); } // printf("client ip is %s\n", inet_ntoa(addr_in.sin_addr)); // printf("client port is %d\n", ntohs(addr_in.sin_port)); while(1){ memset(buf, 0, sizeof(buf)); sz = recv(csockfd, buf, sizeof(buf), 0); if(-1 == sz){ perror("[ERROR] recv()"); exit(EXIT_FAILURE); }else if(sz == 0){ printf("client quit!\n"); break; } printf("recv data is --> %s\n", buf); if(strncmp(buf, "quit", 4) == 0){ printf("server quit!\n"); break; } sleep(1); }; close(csockfd); close(sockfd); return 0; }

得分 100
学习任务

别摸我的键盘 的学生作业:

client #include #include #include #include /* See NOTES */ #include #include #include #include int main(int argc, const char *argv[]) { int sockfd,ret; struct sockaddr_in addr_in; char buf[64]; ssize_t sz; if(argc != 3){ fprintf(stderr, "[ERROR] %s \n", argv[0]); exit(EXIT_FAILURE); } sockfd= socket(AF_INET, SOCK_STREAM, 0); if(sockfd == -1){ perror("[ERROR] socket()"); exit(EXIT_FAILURE); } //清空 相当于memset() bzero(&addr_in, sizeof(addr_in)); addr_in.sin_family = AF_INET; addr_in.sin_port = htons(atoi(argv[2])); addr_in.sin_addr.s_addr = inet_addr(argv[1]); ret = connect(sockfd, (const struct sockaddr *)&addr_in, sizeof(addr_in)); if(ret == -1){ perror("[ERROR] connect()"); exit(EXIT_FAILURE); } printf("please input send data\n"); while(1){ printf(">"); memset(buf, 0, sizeof(buf)); fgets(buf, sizeof(buf), stdin); if(buf[sizeof(buf) -1] == '\n') buf[sizeof(buf) - 1] = '\0'; sz = send(sockfd, buf, strlen(buf), 0); if(sz == -1){ perror("[ERROR] send()"); exit(EXIT_FAILURE); } if(strncmp(buf, "quit", 4) == 0){ break; } } close(sockfd); return 0; } server #include #include #include #include /* See NOTES */ #include #include #include #include #define QUEUE_SZ 10 int main(int argc, const char *argv[]) { int sockfd,ret,csockfd; struct sockaddr_in addr_in; char buf[64]; ssize_t sz; if(argc != 3){ fprintf(stderr, "[ERROR] %s \n", argv[0]); exit(EXIT_FAILURE); } sockfd= socket(AF_INET, SOCK_STREAM, 0); if(sockfd == -1){ perror("[ERROR] socket()"); exit(EXIT_FAILURE); } //清空 相当于memset() bzero(&addr_in, sizeof(addr_in)); addr_in.sin_family = AF_INET; addr_in.sin_port = htons(atoi(argv[2])); addr_in.sin_addr.s_addr = inet_addr(argv[1]); ret = bind(sockfd, (const struct sockaddr *)&addr_in, sizeof(addr_in)); if(ret == -1){ perror("[ERROR] bind()"); exit(EXIT_FAILURE); } ret = listen(sockfd, QUEUE_SZ); if(-1 == ret){ perror("[ERROR] listen()"); exit(EXIT_FAILURE); } int len = sizeof(addr_in); csockfd = accept(sockfd, (struct sockaddr *)&addr_in, &len); if(-1 == csockfd){ perror("[ERROR] accept()"); exit(EXIT_FAILURE); } // printf("client ip is %s\n", inet_ntoa(addr_in.sin_addr)); // printf("client port is %d\n", ntohs(addr_in.sin_port)); while(1){ memset(buf, 0, sizeof(buf)); sz = recv(csockfd, buf, sizeof(buf), 0); if(-1 == sz){ perror("[ERROR] recv()"); exit(EXIT_FAILURE); }else if(sz == 0){ printf("client quit!\n"); break; } printf("recv data is --> %s\n", buf); if(strncmp(buf, "quit", 4) == 0){ printf("server quit!\n"); break; } }; close(csockfd); close(sockfd); return 0; }

微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号