[完结12章+电子书]基于C++从0到1手写Linux高性能网络编程框架
时间:2023-12-25
大小:3.48KB
阅读数:127
查看他发布的资源
资料介绍
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<String> 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;
}
版权说明:本资料由用户提供并上传,仅用于学习交流;若内容存在侵权,请进行举报,或
联系我们 删除。