[完结12章+电子书]基于C++从0到1手写Linux高性能网络编程框架

荀勗
• 阅读 128

学习地址1:https://pan.baidu.com/s/1yXZMBwdAbtW635Lws9Efiw 提取码: erbx 学习地址2:https://share.weiyun.com/XNELQdHP 密码:bdmum6

Linux Socket 网络编程框架主要由 3 大模块组成: BSD Socket APIs Socket Abstraction Layer VFS Layer

TCP/IP 协议在设计和实现上并没有客户端和服务器的概念,在通信过程中所有机器都是对等的。但由于资源(视频、新闻、软件等)都被数据提供者所垄断,所以几乎所有的网络应用程序都很自然地用了客户端/服务器模型,即所有客户端都通过访问服务器来获取所需的资源。

BS和CS服务器架构 (1)CS架构介绍(client server,客户端服务器架构) (2)BS架构介绍(broswer server,浏览器服务器架构)

TCP协议 (1)建立连接需要三次握手 (2)建立连接的条件:服务器listen时客户端主动发起connect (3)关闭连接需要四次握手 (4)服务器或者客户端都可以主动发起关闭

package com.example.emos.wx.controller.form; import io.swagger.annotations.ApiModel; import lombok.Data;

import javax.validation.constraints.NotBlank; import javax.validation.constraints.Pattern;

@Data @ApiModel public class RegisterForm { @NotBlank(message = "注册码不能为空") @Pattern(regexp = "^[0-9]{6}$",message = "注册码必须是6位数字") private String registerCode;

@NotBlank(message = "微信临时授权不能为空")
private String code;

@NotBlank(message = "昵称不能为空")
private String nickname;

@NotBlank(message = "头像不能为空")
private String photo;

}

在UserController.java中创建login()方法。 @PostMapping("/login") @ApiOperation("登陆系统") public R login(@Valid @RequestBody LoginForm form) { int id = userService.login(form.getCode()); String token = jwtUtil.createToken(id); Set permsSet = userService.searchUserPermissions(id); saveCacheToken(token, id); return R.ok("登陆成功").put("token", token).put("permission", permsSet); } 在CheckinServiceImpl类中,实现抽象方法 …… public class CheckinServiceImpl implements CheckinService { …… public void createFaceModel(int userId, String path) { HttpRequest request = HttpUtil.createPost(createFaceModelUrl); request.form("photo", FileUtil.file(path)); HttpResponse response = request.execute(); String body = response.body(); if ("无法识别出人脸".equals(body) || "照片中存在多张人脸".equals(body)) { throw new EmosException(body); } else { TbFaceModel entity = new TbFaceModel(); entity.setUserId(userId); entity.setFaceModel(body); faceModelDao.insert(entity); } } } 在CheckinServiceImpl.java类中,实现三个抽象方法。 public class CheckinServiceImpl implements CheckinService { …… @Override public HashMap searchTodayCheckin(int userId) { HashMap map = checkinDao.searchTodayCheckin(userId); return map; }

@Override
public long searchCheckinDays(int userId) {
    long days = checkinDao.searchCheckinDays(userId);
    return days;
}

@Override
public ArrayList<HashMap> searchWeekCheckin(HashMap param) {
    ArrayList<HashMap> checkinList = checkinDao.searchWeekCheckin(param);
    ArrayList<String> holidaysList = holidaysDao.searchHolidaysInRange(param);
    ArrayList<String> workdayList = workdayDao.searchWorkdayInRange(param);

    DateTime startDate = DateUtil.parseDate(param.get("startDate").toString());
    DateTime endDate = DateUtil.parseDate(param.get("endDate").toString());
    DateRange range = DateUtil.range(startDate, endDate, DateField.DAY_OF_MONTH);
    ArrayList list = new ArrayList();
    range.forEach(one -> {
        String date = one.toString("yyyy-MM-dd");
        //查看今天是不是假期或者工作日
        String type = "工作日";
        if (one.isWeekend()) {
            type = "节假日";
        }
        if (holidaysList != null && holidaysList.contains(date)) {
            type = "节假日";
        } else if (workdayList != null && workdayList.contains(date)) {
            type = "工作日";
        }

        String status = "";
        if (type.equals("工作日") && DateUtil.compare(one, DateUtil.date()) <= 0) {
            status = "缺勤";
            boolean flag=false;
            for (HashMap<String, String> map : checkinList) {
                if (map.containsValue(date)) {
                    status = map.get("status");
                    flag=true;
                    break;
                }
            }
            DateTime endTime=DateUtil.parse(DateUtil.today()+" "+constants.attendanceEndTime);
            String today=DateUtil.today();
            if(date.equals(today)&&DateUtil.date().isBefore(endTime)&&flag==false){
                status="";
            }
        }

        HashMap map = new HashMap();
        map.put("date", date);
        map.put("status", status);
        map.put("type", type);
        map.put("day", one.dayOfWeekEnum().toChinese("周"));
        list.add(map);
    });
    return list;
}

}

在EmosWxApiApplicationTests.java类中提供了contextLoads()测试用例方法,我们把生成大量系统消息记录的代码写在其中,程序运行的时候这些消息记录就会写入到MongoDB里面。 @SpringBootTest class EmosWxApiApplicationTests { @Autowired private MessageService messageService;

@Test
void contextLoads() {
    for (int i = 1; i <= 100; i++) {
        MessageEntity message = new MessageEntity();
        message.setUuid(IdUtil.simpleUUID());
        message.setSenderId(0);
        message.setSenderName("系统消息");
        message.setMsg("这是第" + i + "条测试消息");
        message.setSendTime(new Date());
        String id=messageService.insertMessage(message);

        MessageRefEntity ref=new MessageRefEntity();
        ref.setMessageId(id);
        ref.setReceiverId(11); //注意:这是接收人ID
        ref.setLastFlag(true);
        ref.setReadFlag(false);
        messageService.insertRef(ref);
    }
}

} 在该页面的模型层里面声明静态数据。list数组保存的是后端Java返回的成员数据,内容上按照部门进行分组。members数组保存的是页面上选择的成员id。 #include <stdio.h> #include <sys/socket.h> #include <sys/types.h> #include <stdlib.h> #include <arpa/inet.h> #include <unistd.h> #include <string.h>

#define BACKLOG 5

int main(int argc, char *argv[]) { int fd; struct sockaddr_in addr; char buf[BUFSIZ] = {};

if(argc < 3){
    fprintf(stderr, "%s<addr><port>\n", argv[0]);
    exit(0);
}

/*创建套接字*/
fd = socket(AF_INET, SOCK_STREAM, 0);
if(fd < 0){
    perror("socket");
    exit(0);
}

addr.sin_family = AF_INET;
addr.sin_port = htons( atoi(argv[2]) );
if ( inet_aton(argv[1], &addr.sin_addr) == 0) {
    fprintf(stderr, "Invalid address\n");
    exit(EXIT_FAILURE);
}

/*向服务端发起连接请求*/
if(connect(fd, (struct sockaddr *)&addr, sizeof(addr) ) == -1){
    perror("connect");
    exit(0);
}
while(1){
    printf("Input->");
    fgets(buf, BUFSIZ, stdin);
    write(fd, buf, strlen(buf) );
}
close(fd);
return 0;

}

点赞
收藏
评论区
推荐文章
笑面虎 笑面虎
5个月前
基于C++从0到1手写Linux高性能网络编程框架(2023新课)
基于C从0到1手写Linux高性能网络编程框架(2023新课)分享课程——基于C从0到1手写Linux高性能网络编程框架,2023年新课,附源码电子书,课程包更新。Linux在服务器领域有着强大的优势,网络编程便是其中一项重要组成部分,运用合理的
赵颜 赵颜
5个月前
[15章]基于C++从0到1手写Linux高性能网络编程框架
深度掌握网络编程是逆袭成为高阶开发者的秘密法宝,所以今天给大家深度讲解基于C的Linux高性能事件驱动网络编程框架的设计方法及技巧,我将采取渐进迭代的授课方式,配合C11新特性的使用,以及网络编程理论的深度讲解,并手把手带着大家落地实现,助力在网络
荀勗 荀勗
5个月前
基于C++从0到1手写Linux高性能网络编程框架-15章
参考资料地址1:https://pan.baidu.com/s/1i8FuLluEUV3BJFphjKWvhQ提取码:zvet参考资料地址2:https://pan.baidu.com/s/1MgD4BdeD6V6HfXkoMAZ5Hw提取码:l5t4网络
赵颜 赵颜
4个月前
[23章附电子书]SpringBoot+Vue3+MySQL集群 开发健康体检双系统
学习地址1:https://pan.baidu.com/s/1WWeuY50AZ0d3rbJ0LJ4pg提取码:kubm学习地址2:https://share.weiyun.com/74nsFIu0密码:ih38qp大家都知道医疗行业是互联网发展前景极好的
赵嬷嬷 赵嬷嬷
4个月前
[升级16章+电子书]SpringBoot+Vue3 项目实战,打造企业级在线办公系统
学习地址1:https://pan.baidu.com/s/1gx9YoT3asP0fRdlwnBzXIQ提取码:ftyi学习地址2:https://share.weiyun.com/jVSDdcBU密码:cruqf9SpringBootVue3项目实战
笑面虎 笑面虎
4个月前
【完结12章】基于C++从0到1手写Linux高性能网络编程框架
【完结12章】基于C从0到1手写Linux高性能网络编程框架分享一套课程——基于C从0到1手写Linux高性能网络编程框架,已完结12章,附源码电子书。大家下载学习。Socket网络编程框架Socket(套接字)是一个网络编程概念,描述了一个通信
赵嬷嬷 赵嬷嬷
4个月前
[完结12章]基于C++从0到1手写Linux高性能网络编程框架(附电子书)
学习地址1:https://pan.baidu.com/s/1AISz1k2uwYAB41St1HxfA提取码:t2gy学习地址2:https://share.weiyun.com/XNELQdHP密码:bdmum6今天我将给大家讲解基于C的Linux
赵嬷嬷 赵嬷嬷
3个月前
[完结8周]LLM大语言模型算法特训,带你转型AI大语言模型算法工程师
学习地址1:https://pan.baidu.com/s/1qq4jYRutBn5Jox0UHfU2Hg提取码:6tzd学习地址2:https://share.weiyun.com/grO4IKgp密码:bfvf7y一、大语言模型(LLM)是基于海量文本
鲍二家的 鲍二家的
1个月前
AI Agent智能应用从0到1定制开发(12章)
学习地址1:https://pan.baidu.com/s/1ccnoXsPCUg4eP5rSrD0UA提取码:o0mu学习地址2:https://pan.baidu.com/s/1JYJ6dMkwgx0XWQnCM6Q0A提取码:2m68AIAgent已
鲍二家的 鲍二家的
4星期前
[完结17章]SpringBoot3+Vue3 开发高并发秒杀抢购系统
学习地址1:https://pan.baidu.com/s/1DRZXkQeGkrPwhVTd2ko00g提取码:gpwn学习地址2:https://share.weiyun.com/ysK13sR2密码:74m96t众所周知,作为开发新手,入行、实习、转