学习地址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
@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;
}