epoll 基于多线程的边沿非阻塞处理

news2025/1/23 10:28:16

往期文章推荐: 

epoll() 多路复用 和 两种工作模式_呵呵哒( ̄▽ ̄)"的博客-CSDN博客https://blog.csdn.net/weixin_41987016/article/details/132523789?spm=1001.2014.3001.5501

epoll_server.c

#include <stdio.h>
#include <ctype.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>
#include <arpa/inet.h>
#include <sys/epoll.h>
#include <errno.h>

// server
int main(int argc,const char* argv[]) {
    // 创建监听的套接字
    int lfd = socket(AF_INET,SOCK_STREAM,0);
    if(lfd == -1) {
        perror("socket");
        close(lfd);
        exit(1);
    }

    // 绑定
    struct sockaddr_in saddr;
    memset(&saddr,0,sizeof(saddr));
    saddr.sin_family = AF_INET;
    saddr.sin_port = htons(9999);
    saddr.sin_addr.s_addr = htonl(INADDR_ANY);
    // inet_pton(AF_INET,"127.0.0.1",&saddr.sin_addr.s_addr);

    // 设置端口复用
    int optval = 1;
    setsockopt(lfd,SOL_SOCKET,SO_REUSEPORT,&optval,sizeof(optval));
    // setsockopt(lfd,SOL_SOCKET,SO_REUSEADDR,&optval,sizeof(optval));

    // 绑定端口
    int ret = bind(lfd,(struct sockaddr*)&saddr,sizeof(saddr));
    if(ret == -1) {
        perror("bind");
        close(lfd);
        exit(1);
    }    

    // 监听
    ret = listen(lfd,64);
    if(ret == -1) { 
        perror("listen");
        close(lfd);
        exit(1);
    }

    // 创建epoll 实例
    int epfd = epoll_create(1);
    if(epfd == -1) {
        perror("epoll_create");
        close(lfd);
        exit(-1);
    }
    struct epoll_event ev;
    ev.events = EPOLLIN;
    ev.data.fd = lfd;
    
    // 创建了epfd,设置lfd上需要检测事件并将lfd绑定到epfd
    ret = epoll_ctl(epfd,EPOLL_CTL_ADD,lfd,&ev);

    // epoll_ctl 调用成功返回0,调用失败返回-1,可以通过 errno 错误码获取具体的错误原因
    if(ret == -1) {
        perror("epoll_ctl");
        close(lfd);
        exit(1);
    }

    struct epoll_event evs[1024];
    int size = sizeof(evs)/sizeof(evs[0]);
    while (1) {
        // epoll_wait 检测事件
        int num = epoll_wait(epfd,evs,size,-1);
        if(num < 0) {
            // 被信号中断
            if(errno == EINTR) 
                continue;
            // 出错,退出
            break;
        } else if(num == 0) {
            // 超时,继续
            continue;
        }
        printf("num = %d\n",num);
        for(int i = 0;i < num;i++) {
            // 判断是否是监听套接字
            int curfd = evs[i].data.fd;
            // 如果是监听套接字,则处理连接请求
            if(curfd == lfd) {
                struct sockaddr_in caddr;
                socklen_t len = sizeof(caddr);
                int cfd = accept(lfd,(struct sockaddr*)&caddr,&len);
                if(cfd == -1) {
                    perror("accept");
                    exit(1);
                }
                // 注意:传递给epoll_ctl之后,会做一个拷贝,其实可以不用再创建一个epoll_event ev
                ev.events = EPOLLIN;
                ev.data.fd = cfd;
                ret = epoll_ctl(epfd,EPOLL_CTL_ADD,cfd,&ev);
                if(ret != -1) {
                    printf("new cfd: %d add to epoll success",cfd);
                } else {
                    perror("epoll_ctl");
                    close(cfd);
                }
                printf("accept a new client: %s:%d\n",inet_ntoa(caddr.sin_addr),ntohs(caddr.sin_port));
            } 
            else {
                // 如果是连接套接字,则处理读写事件
                char buf[1024];
                int len = recv(curfd,buf,sizeof(buf),0);
                if(len == -1) {
                    perror("recv error");
                    // 出错,从epfd上移除cfd
                    if(errno!=EWOULDBLOCK && errno!=EINTR) {
                        ret = epoll_ctl(epfd,EPOLL_CTL_DEL,curfd,NULL);
                        if(ret == -1) {
                            printf("client disconnected,cfd: %d remove from epoll error \n",curfd);
                        }
                        close(curfd);
                    }
                } else if(len == 0) {
                    printf("客户端已经断开连接...\n");
                    // 先删除
                    ret = epoll_ctl(epfd,EPOLL_CTL_DEL,curfd,NULL);
                    if(ret != -1) {
                        printf("curfd: %d delete from epoll success\n",curfd);
                    }else{
                        perror("epoll_ctl");
                    }
                    // 再关闭
                    /*
                        注意:如果咱先关闭这个通信的文件描述符,然后再对这个节点进行删除
                        这个epoll_ctl会返回-1,也就说删除失败
                    */
                    close(curfd);
                }
                printf("read buf = %s\n",buf);
                // 小写转大写   
                for(int i=0;i<len;i++) {
                    buf[i] = toupper(buf[i]);
                }
                printf("after buf = %s\n",buf);

                // 大写发给客户端
                ret = send(curfd,buf,strlen(buf)+1,0);
                if(ret == -1) {
                    perror("send error");
                    exit(-1);
                }       
            }
        }
    }
    close(lfd);
    return 0;
}

 epoll_tl.c

#include <stdio.h>
#include <ctype.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>
#include <arpa/inet.h>
#include <sys/epoll.h>
#include <errno.h>

// server
int main(int argc,const char* argv[]) {
    // 创建监听的套接字
    int lfd = socket(AF_INET,SOCK_STREAM,0);
    if(lfd == -1) {
        perror("socket");
        exit(1);
    }

    // 绑定
    struct sockaddr_in saddr;
    memset(&saddr,0,sizeof(saddr));
    saddr.sin_family = AF_INET;
    saddr.sin_port = htons(9999);
    saddr.sin_addr.s_addr = htonl(INADDR_ANY);
    // inet_pton(AF_INET,"127.0.0.1",&saddr.sin_addr.s_addr);

    // 设置端口复用
    int optval = 1;
    setsockopt(lfd,SOL_SOCKET,SO_REUSEPORT,&optval,sizeof(optval));
    // setsockopt(lfd,SOL_SOCKET,SO_REUSEADDR,&optval,sizeof(optval));

    // 绑定端口
    int ret = bind(lfd,(struct sockaddr*)&saddr,sizeof(saddr));
    if(ret == -1) {
        perror("bind");
        exit(1);
    }    

    // 监听
    ret = listen(lfd,64);
    if(ret == -1) { 
        perror("listen");
        exit(1);
    }

    // 创建epoll 实例
    int epfd = epoll_create(1);
    if(epfd == -1) {
        perror("epoll_create");
        exit(-1);
    }
    struct epoll_event ev;
    ev.events = EPOLLIN;
    ev.data.fd = lfd;
    
    // 创建了epfd,设置lfd上需要检测事件并将lfd绑定到epfd
    ret = epoll_ctl(epfd,EPOLL_CTL_ADD,lfd,&ev);

    // epoll_ctl 调用成功返回0,调用失败返回-1,可以通过 errno 错误码获取具体的错误原因
    if(ret == -1) {
        perror("epoll_ctl");
        close(lfd);
        exit(1);
    }

    struct epoll_event evs[1024];
    int size = sizeof(evs)/sizeof(evs[0]);
    while (1) {
        // epoll_wait 检测事件
        int num = epoll_wait(epfd,evs,size,-1);
        if(num < 0) {
            // 被信号中断
            if(errno == EINTR) 
                continue;
            // 出错,退出
            break;
        } else if(num == 0) {
            // 超时,继续
            continue;
        }
        printf("num = %d\n",num);
        for(int i = 0;i < num;i++) {
            // ① 处理可读事件 
            if(evs[i].events & EPOLLIN) {
                // 判断是否是监听套接字
                int curfd = evs[i].data.fd;
                // 如果是监听套接字,则处理连接请求
                if(curfd == lfd) {
                    struct sockaddr_in caddr;
                    socklen_t len = sizeof(caddr);
                    int cfd = accept(lfd,(struct sockaddr*)&caddr,&len);
                    // 注意:传递给epoll_ctl之后,会做一个拷贝,其实可以不用再创建一个epoll_event ev
                    ev.events = EPOLLIN;
                    ev.data.fd = cfd;
                    epoll_ctl(epfd,EPOLL_CTL_ADD,cfd,&ev);
                    printf("accept a new client: %s:%d\n",inet_ntoa(caddr.sin_addr),ntohs(caddr.sin_port));
                } 
                else {
                    // 如果是连接套接字,则处理读写事件
                    char buf[5];
                    int len = recv(curfd,buf,sizeof(buf),0);
                    if(len == -1) {
                        perror("recv error");
                        exit(1);
                    } else if(len == 0) {
                        printf("客户端已经断开连接...\n");
                        // 先删除
                        epoll_ctl(epfd,EPOLL_CTL_DEL,curfd,NULL);
                        // 再关闭
                        /*
                            注意:如果咱先关闭这个通信的文件描述符,然后再对这个节点进行删除
                            这个epoll_ctl会返回-1,也就说删除失败
                        */
                       close(curfd);
                    }
                    printf("read buf = %s\n",buf);
                    // 小写转大写   
                    for(int i=0;i<len;i++) {
                        buf[i] = toupper(buf[i]);
                    }
                    printf("after buf = %s\n",buf);

                    // 大写发给客户端
                    ret = send(curfd,buf,strlen(buf)+1,0);
                    if(ret == -1) {
                        perror("send error");
                        exit(1);
                    }
                }
            }
        }
    }
    close(lfd);
    return 0;
}

ep_et.c

#include <stdio.h>
#include <ctype.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>
#include <arpa/inet.h>
#include <sys/epoll.h>
#include <errno.h>
#include <fcntl.h>

// server
int main(int argc,const char* argv[]) {
    // 创建监听的套接字
    int lfd = socket(AF_INET,SOCK_STREAM,0);
    if(lfd == -1) {
        perror("socket");
        exit(1);
    }

    // 绑定
    struct sockaddr_in saddr;
    memset(&saddr,0,sizeof(saddr));
    saddr.sin_family = AF_INET;
    saddr.sin_port = htons(9999);
    saddr.sin_addr.s_addr = htonl(INADDR_ANY);
    // inet_pton(AF_INET,"127.0.0.1",&saddr.sin_addr.s_addr);

    // 设置端口复用
    int optval = 1;
    setsockopt(lfd,SOL_SOCKET,SO_REUSEPORT,&optval,sizeof(optval));
    // setsockopt(lfd,SOL_SOCKET,SO_REUSEADDR,&optval,sizeof(optval));

    // 绑定端口
    int ret = bind(lfd,(struct sockaddr*)&saddr,sizeof(saddr));
    if(ret == -1) {
        perror("bind");
        exit(1);
    }    

    // 监听
    ret = listen(lfd,64);
    if(ret == -1) { 
        perror("listen");
        exit(1);
    }

    // 创建epoll 实例
    int epfd = epoll_create(1);
    if(epfd == -1) {
        perror("epoll_create");
        exit(-1);
    }
    struct epoll_event ev;
    ev.events = EPOLLIN;
    ev.data.fd = lfd;
    
    // 创建了epfd,设置lfd上需要检测事件并将lfd绑定到epfd
    ret = epoll_ctl(epfd,EPOLL_CTL_ADD,lfd,&ev);

    // epoll_ctl 调用成功返回0,调用失败返回-1,可以通过 errno 错误码获取具体的错误原因
    if(ret == -1) {
        perror("epoll_ctl");
        close(lfd);
        exit(1);
    }

    struct epoll_event evs[1024];
    int size = sizeof(evs)/sizeof(evs[0]);
    while (1) {
        // epoll_wait 检测事件
        int num = epoll_wait(epfd,evs,size,-1);
        if(num < 0) {
            // 被信号中断
            if(errno == EINTR) 
                continue;
            // 出错,退出
            break;
        } else if(num == 0) {
            // 超时,继续
            continue;
        }
        printf("num = %d\n",num);
        for(int i = 0;i < num;i++) {
            // ① 处理可读事件 
            if(evs[i].events & EPOLLIN) {
                // 判断是否是监听套接字
                int curfd = evs[i].data.fd;
                // 如果是监听套接字,则处理连接请求
                if(curfd == lfd) {
                    struct sockaddr_in caddr;
                    socklen_t len = sizeof(caddr);
                    int cfd = accept(lfd,(struct sockaddr*)&caddr,&len);
                    // 设置非阻塞属性
                    int flag = fcntl(cfd,F_GETFL);
                    flag |= O_NONBLOCK;
                    fcntl(cfd,F_SETFL,flag);

                    // 注意:传递给epoll_ctl之后,会做一个拷贝,其实可以不用再创建一个epoll_event ev
                    ev.events = EPOLLIN | EPOLLET;
                    ev.data.fd = cfd;
                    epoll_ctl(epfd,EPOLL_CTL_ADD,cfd,&ev);
                    printf("accept a new client: %s:%d\n",inet_ntoa(caddr.sin_addr),ntohs(caddr.sin_port));
                } 
                else {
                    // 如果是连接套接字,则处理读写事件
                    char buf[5];
                    while (1) {
                        int len = recv(curfd,buf,sizeof(buf),0);
                        if(len == -1) {
                            if(errno == EAGAIN) {
                                printf("数据已经接收完毕...\n");
                                break;
                            }else{
                                perror("recv error");
                                exit(1);
                            }
                        } else if(len == 0) {
                            printf("客户端已经断开连接...\n");
                            // 先删除
                            epoll_ctl(epfd,EPOLL_CTL_DEL,curfd,NULL);
                            // 再关闭
                            /*
                                注意:如果咱先关闭这个通信的文件描述符,然后再对这个节点进行删除
                                这个epoll_ctl会返回-1,也就说删除失败
                            */
                            close(curfd);
                            break;
                        }
                        printf("read buf = %s\n",buf);
                        // 小写转大写   
                        for(int i=0;i<len;i++) {
                            buf[i] = toupper(buf[i]);
                        }
                        printf("after buf = %s\n",buf);
                        write(STDERR_FILENO,buf,len);

                        // 大写发给客户端
                        ret = send(curfd,buf,strlen(buf)+1,0);
                        if(ret == -1) {
                            perror("send error");
                            exit(1);
                        }   
                    }
                }
            }
        }
    }
    close(lfd);
    return 0;
}

基于多线程的边沿非阻塞处理

thread_epoll_et.c

#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/epoll.h>
#include <iostream>
#include <string.h>
#include <errno.h>

int main(int argc,char* argv[]) {
    // 创建一个侦听 socket
    int lfd = socket(AF_INET,SOCK_STREAM,0);
    if(lfd == -1) {
        std::cout<<"create listen socket error"<<std::endl;
        return -1;
    }

    // 将侦听socket设置为非阻塞的
    int oldSocketFlag = fcntl(lfd,F_GETFL,0);
    int newSocketFlag = oldSocketFlag | O_NONBLOCK;

    int ret = fcntl(lfd,F_SETFL,newSocketFlag);
    if(ret == -1) {
        close(lfd);
        std::cout<<"set listen socket nonblock error"<<std::endl;
        return -1;
    }

    // 初始化服务器地址
    struct sockaddr_in saddr;
    saddr.sin_family = AF_INET;
    saddr.sin_port = htons(9999);
    saddr.sin_addr.s_addr = htonl(INADDR_ANY);
    
    ret = bind(lfd,(struct sockaddr*)&saddr,sizeof(saddr));
    if(ret == -1) {
        std::cout<<"bind error"<<std::endl;
        close(lfd);
        return -1;
    }
    
    // 启动侦听
    ret = listen(lfd,10);
    if(ret == -1) {
        std::cout<<"listen error"<<std::endl;
        close(lfd);
        return -1;
    }

    // 复用地址和端口号
    int optval = 1;
    setsockopt(lfd,SOL_SOCKET,SO_REUSEADDR,(char*)&optval,sizeof(optval));
    setsockopt(lfd,SOL_SOCKET,SO_REUSEPORT,(char*)&optval,sizeof(optval));

    // 创建epfd
    int epfd = epoll_create(10);
    if(epfd == -1) {
        std::cout<<"create epoll error"<<std::endl;
        close(lfd);
        return -1;
    }

    epoll_event ev;
    ev.events = EPOLLIN;
    ev.data.fd = lfd;

    // 将lfd添加到epfd中
    ret = epoll_ctl(epfd,EPOLL_CTL_ADD,lfd,&ev);
    if(ret == -1) {
        std::cout<<"epoll_ctl error"<<std::endl;
        close(lfd);
        return -1;
    }

    int n;
    while (true) {
        epoll_event evs[1024];
        n = epoll_wait(epfd,evs,1024,-1);
        if(n < 0) {
            // 被信号中断
            if(errno == EINTR) 
                continue;
            // 出错,退出
            break;
        } else if(n == 0) {
            // 超时,继续
            continue;
        }

        for(int i = 0; i < n; i++) {
            int curfd = evs[i].data.fd;
            // 事件可读
            if(evs[i].events & EPOLLIN) {
                if(curfd == lfd) {
                    // 侦听socket,接受新连接
                    struct sockaddr_in caddr;
                    socklen_t clen = sizeof(caddr);
                    // 接受客户端连接,并加入到fds集合中
                    int cfd = accept(lfd,(struct sockaddr*)&caddr,&clen);
                    if(cfd != -1) {
                        // 将客户端socket设置为非阻塞的
                        int oldSockFlag = fcntl(cfd,F_GETFL,0);
                        int newSockFlag = oldSockFlag | O_NONBLOCK;
                        ret = fcntl(cfd,F_SETFL,newSockFlag);
                        if(ret == -1) {
                            close(cfd);
                            std::cout<<"set cfd to nonblock error"<<std::endl;
                        } else {
                            // epoll_event ev;
                            ev.events = EPOLLIN;
                            ev.data.fd = cfd;
                            ret = epoll_ctl(epfd,EPOLL_CTL_ADD,cfd,&ev);
                            if(ret != -1) {
                                std::cout<<"new cfd:"<<cfd<<" add to epoll success"<<std::endl;
                            } else {
                                std::cout<<"add cfd to epoll error"<<std::endl;
                                close(cfd);
                            }
                        }
                    }
                } 
                else {
                    // 普通cfd,收取数据
                    char buf[64] = {0};
                    int m = recv(curfd,buf,64,0);
                    if(m == 0) {
                        // 对端关闭了连接,从epfd上移除cfd
                        ret = epoll_ctl(epfd,EPOLL_CTL_DEL,curfd,NULL);
                        if(ret == -1) {
                            std::cout<<"client disconnected,cfd: "<<curfd<<" remove from epoll error"<<std::endl;
                        }
                        close(curfd);
                    }
                    else if(m<0) {
                        // 出错,从epfd上移除cfd
                        if(errno!=EWOULDBLOCK && errno!=EINTR) {
                            ret = epoll_ctl(epfd,EPOLL_CTL_DEL,curfd,NULL);
                            if(ret == -1) {
                                std::cout<<"client disconnected,cfd: "<<curfd<<" remove from epoll error"<<std::endl;
                            }
                            close(curfd);
                        }
                    }
                    else {
                        // 正常收到数据
                        std::cout<<"recv from client: "<<buf<<",cfd: "<<curfd<<std::endl;
                    }
                }
            }
            else if(evs[i].events&EPOLLERR) {
                // TODO: 暂且不处理
            }
        }
    }
        
    // 关闭侦听 socket    
    close(lfd);
    return 0;
}

thread_client.c

#include <stdio.h>
#include <ctype.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>

// nestat -anp | grep 
int main(int argc,char* argv[]) {
    int fd = socket(AF_INET,SOCK_STREAM,0);
    if(fd == -1) {
        perror("socket");
        return -1;
    }

    struct sockaddr_in saddr;
    saddr.sin_family = AF_INET;
    saddr.sin_port = htons(9999);
    inet_pton(AF_INET,"127.0.0.1",&saddr.sin_addr.s_addr);

    // 连接服务器
    int ret = connect(fd,(struct sockaddr*)&saddr,sizeof(saddr));

    if(ret == -1) {
        perror("connect");
        return -1;
    }

    int num = 0;
    char buf[1024] = {0};
    while (num < 200) {
        
        sprintf(buf,"hello world %d\n...",num++);
        printf("%s\n",buf);
        write(fd,buf,strlen(buf) + 1);

        recv(fd,buf,sizeof(buf),0);
        printf("recv msg: %s\n",buf);
        usleep(100000);
    }
    
    close(fd);
    return 0;
}

实验效果(截取部分):

num = 2
打印tid:140537394865920
打印tid:140537394865920
communication tid: 140537394865920
HELLO WORLD 164
...数据已经接收完毕...
communication tid: 140537555547904
HELLO WORLD 121
...数据已经接收完毕...
num = 1
打印tid:140537555547904
communication tid: 140537555547904
HELLO WORLD 142
...数据已经接收完毕...
num = 2
打印tid:140537555547904
打印tid:140537555547904
communication tid: 140537555547904
HELLO WORLD 165
...communication tid: 140537394865920
HELLO WORLD 122
...数据已经接收完毕...
数据已经接收完毕...
num = 1
打印tid:140537394865920
communication tid: 140537555547904
HELLO WORLD 143
...数据已经接收完毕...
num = 2
打印tid:140537555547904
打印tid:140537555547904
communication tid: 140537555547904
HELLOcommunication tid: 140537394865920
 WORLHELLOD 166 WORLD 123
...
...数据已经接收完毕...
数据已经接收完毕...
num = 1
打印tid:140537394865920
communication tid: 140537555547904
HELLO WORLD 144
...数据已经接收完毕...
num = 2
打印tid:140537555547904
打印tid:140537555547904
communication tid: 140537555547904
HELLO WORLD 167
...数据已经接收完毕...
communication tid: 140537394865920
HELLO WORLD 124
...数据已经接收完毕...
num = 1
打印tid:140537394865920
communication tid: 140537394865920
HELLO WORLD 145
...数据已经接收完毕...
num = 2
打印tid:140537394865920
打印tid:140537394865920
communication tid: 140537394865920
HELLO WORLD 168
...数据已经接收完毕...
communication tid: 140537555547904
HELLO WORLD 125
...数据已经接收完毕...
num = 1
打印tid:140537555547904
communication tid: 140537555547904
HELLO WORLD 146
...数据已经接收完毕...
num = 2
打印tid:140537555547904
打印tid:140537555547904
communication tid: 140537394865920
HELLO WORLD 169
...communication tid: 140537555547904
HELLO WORL数据已经接收完毕...
D 126
...数据已经接收完毕...
num = 1
打印tid:140537394865920
communication tid: 140537555547904
HELLO WORLD 147
...数据已经接收完毕...
num = 2
打印tid:140537555547904
打印tid:140537555547904
communication tid: 140537555547904
HELLO WORLD 170
...数据已经接收完毕...
communication tid: 140537394865920
HELLO WORLD 127
...数据已经接收完毕...
num = 1
打印tid:140537394865920
communication tid: 140537555547904
HELLO WORLD 148
...数据已经接收完毕...
num = 2
打印tid:140537555547904
打印tid:140537555547904
communication tid: 140537555547904
HELLO WORLD 171
...数据已经接收完毕...
communication tid: 140537394865920
HELLO WORLD 128
...数据已经接收完毕...
num = 1
打印tid:140537394865920
communication tid: 140537394865920
HELLO WORLD 149
...数据已经接收完毕...
num = 2
打印tid:140537394865920
打印tid:140537394865920
communication tid: 140537555547904
HELLO WORLD 129
...数据已经接收完毕...
communication tid: 140537394865920
HELLO WORLD 172
...数据已经接收完毕...
num = 1
打印tid:140537555547904
communication tid: 140537394865920
HELLO WORLD 150
...数据已经接收完毕...
num = 2
打印tid:140537394865920
打印tid:140537394865920
communication tid: 140537394865920
HELLO WORLD 173
...数据已经接收完毕...
communication tid: 140537555547904
HELLO WORLD 130
...数据已经接收完毕...
num = 1
打印tid:140537555547904
communication tid: 140537555547904
HELLO WORLD 151
...数据已经接收完毕...
num = 2
打印tid:140537555547904
打印tid:140537555547904
communication tid: 140537555547904
HELLOcommunication tid: 140537394865920
 WORLHELLOD 174 WORL
...D 131数据已经接收完毕...

...数据已经接收完毕...
num = 1
打印tid:140537394865920
communication tid: 140537555547904
HELLO WORLD 152
...数据已经接收完毕...
num = 2
打印tid:140537555547904
打印tid:140537555547904
communication tid: 140537555547904
HELLO WORLD 175
...数据已经接收完毕...
communication tid: 140537394865920
HELLO WORLD 132
...数据已经接收完毕...
num = 1
打印tid:140537394865920
communication tid: 140537394865920
HELLO WORLD 153
...数据已经接收完毕...
num = 2
打印tid:140537394865920
打印tid:140537394865920
communication tid: 140537394865920
HELLO WORLD 133
...数据已经接收完毕...
communication tid: 140537555547904
HELLO WORLD 176
...数据已经接收完毕...
num = 1
打印tid:140537555547904
communication tid: 140537555547904
HELLO WORLD 154
...数据已经接收完毕...
num = 1
打印tid:140537555547904
num = 1
打印tid:140537555547904
communication tid: 140537394865920
HELLO WORLD 134
...数据已经接收完毕...
communication tid: 140537555547904
HELLO WORLD 177
...数据已经接收完毕...
num = 1
打印tid:140537394865920
communication tid: 140537555547904
HELLO WORLD 155
...数据已经接收完毕...
num = 2
打印tid:140537555547904
打印tid:140537555547904
communication tid: 140537555547904
HELLO WORLD 135
...数据已经接收完毕...
communication tid: 140537394865920
HELLO WORLD 178
...数据已经接收完毕...
num = 1
打印tid:140537394865920
communication tid: 140537394865920
HELLO WORLD 156
...数据已经接收完毕...
num = 2
打印tid:140537394865920
打印tid:140537394865920
communication tid: 140537394865920
HELLO WORLD 179
...数据已经接收完毕...
communication tid: 140537555547904
HELLO WORLD 136
...数据已经接收完毕...
num = 1
打印tid:140537555547904
communication tid: 140537555547904
HELLO WORLD 157
...数据已经接收完毕...
num = 2
打印tid:140537555547904
打印tid:140537555547904
communication tid: 140537555547904
HELLO WORLD 137
...数据已经接收完毕...
communication tid: 140537394865920
HELLO WORLD 180
...数据已经接收完毕...
num = 1
打印tid:140537394865920
communication tid: 140537394865920
HELLO WORLD 158
...数据已经接收完毕...
num = 2
打印tid:140537394865920
打印tid:140537394865920
communication tid: 140537555547904
communication tid: 140537394865920
HELLOHELLO WORL WORLD 181D 138
...
...数据已经接收完毕...
数据已经接收完毕...
num = 1
打印tid:140537555547904
communication tid: 140537394865920
HELLO WORLD 159
...数据已经接收完毕...
num = 1
打印tid:140537394865920
communication tid: 140537394865920
HELLO WORLD 182
...数据已经接收完毕...
num = 1
打印tid:140537394865920
communication tid: 140537394865920
HELLO WORLD 139
...数据已经接收完毕...
num = 1
打印tid:140537394865920
communication tid: 140537394865920
HELLO WORLD 160
...数据已经接收完毕...
num = 1
打印tid:140537394865920
num = 1
打印tid:140537394865920
communication tid: 140537394865920
HELLOcommunication tid: 140537555547904
HELLO WORL WORLD 183D 140
...
...数据已经接收完毕...
数据已经接收完毕...
num = 1
打印tid:140537555547904
communication tid: 140537394865920
HELLO WORLD 161
...数据已经接收完毕...
num = 2
打印tid:140537394865920
打印tid:140537394865920
communication tid: 140537394865920
HELLO WORLD 184
...数据已经接收完毕...
communication tid: 140537555547904
HELLO WORLD 141
...数据已经接收完毕...
num = 1
打印tid:140537555547904
communication tid: 140537555547904
HELLO WORLD 162
...数据已经接收完毕...
num = 2
打印tid:140537555547904
打印tid:140537555547904
communication tid: 140537555547904
HELLO WORLcommunication tid: 140537394865920
D 185HELLO
... WORL数据已经接收完毕...
D 142
...数据已经接收完毕...
num = 1
打印tid:140537394865920
communication tid: 140537394865920
HELLO WORLD 163
...数据已经接收完毕...
num = 2
打印tid:140537394865920
打印tid:140537394865920
communication tid: 140537394865920
HELLO WORLD 186
...数据已经接收完毕...
communication tid: 140537555547904
HELLO WORLD 143
...数据已经接收完毕...
num = 1
打印tid:140537555547904
communication tid: 140537555547904
HELLO WORLD 164
...数据已经接收完毕...
num = 2
打印tid:140537555547904
communication tid: 140537555547904
HELLO WORLD 187
...数据已经接收完毕...
打印tid:140537555547904
communication tid: 140537555547904
HELLO WORLD 144
...数据已经接收完毕...
num = 1
打印tid:140537555547904
communication tid: 140537555547904
HELLO WORLD 165
...数据已经接收完毕...
num = 1
打印tid:140537555547904
num = 1
打印tid:140537555547904
communication tid: 140537555547904
HELLO WORLD 188
...数据已经接收完毕...
communication tid: 140537394865920
HELLO WORLD 145
...数据已经接收完毕...
num = 1
打印tid:140537394865920
communication tid: 140537394865920
HELLO WORLD 166
...数据已经接收完毕...
num = 2
打印tid:140537394865920
打印tid:140537394865920
communication tid: 140537394865920
HELLO WORLD 146
...数据已经接收完毕...
communication tid: 140537555547904
HELLO WORLD 189
...数据已经接收完毕...
num = 1
打印tid:140537555547904
communication tid: 140537555547904
HELLO WORLD 167
...数据已经接收完毕...
num = 2
打印tid:140537555547904
打印tid:140537555547904
communication tid: 140537555547904
HELLO WORLD 190
...数据已经接收完毕...
communication tid: 140537394865920
HELLO WORLD 147
...数据已经接收完毕...
num = 1
打印tid:140537394865920
communication tid: 140537394865920
HELLO WORLD 168
...数据已经接收完毕...
num = 2
打印tid:140537394865920
打印tid:140537394865920
communication tid: 140537394865920
communication tid: 140537555547904
HELLO WORLD 191HELLO
...数据已经接收完毕...
 WORLD 148
...数据已经接收完毕...
num = 1
打印tid:140537555547904
communication tid: 140537555547904
HELLO WORLD 169
...数据已经接收完毕...
num = 2
打印tid:140537555547904
打印tid:140537555547904
communication tid: 140537555547904
HELLO WORLD 192
...数据已经接收完毕...
communication tid: 140537394865920
HELLO WORLD 149
...数据已经接收完毕...
num = 1
打印tid:140537394865920
communication tid: 140537394865920
HELLO WORLD 170
...数据已经接收完毕...
num = 2
打印tid:140537394865920
打印tid:140537394865920
communication tid: 140537394865920
HELLO WORLD 150
...communication tid: 140537555547904
HELLO WORLD 193
...数据已经接收完毕...
数据已经接收完毕...
num = 1
打印tid:140537555547904
communication tid: 140537394865920
HELLO WORLD 171
...数据已经接收完毕...
num = 2
打印tid:140537394865920
communication tid: 140537394865920
HELLO WORLD 194
...数据已经接收完毕...
打印tid:140537394865920
communication tid: 140537555547904
HELLO WORLD 151
...数据已经接收完毕...
num = 1
打印tid:140537555547904
communication tid: 140537555547904
HELLO WORLD 172
...数据已经接收完毕...
num = 1
打印tid:140537555547904
num = 1
打印tid:140537555547904
communication tid: 140537555547904
HELLO WORLD 195
...数据已经接收完毕...
communication tid: 140537394865920
HELLO WORLD 152
...数据已经接收完毕...
num = 1
打印tid:140537394865920
communication tid: 140537394865920
HELLO WORLD 173
...数据已经接收完毕...
num = 2
打印tid:140537394865920
打印tid:140537394865920
communication tid: 140537555547904
HELLO WORLD 196
...communication tid: 140537394865920
HELLO WORLD 153
...数据已经接收完毕...
数据已经接收完毕...
num = 1
打印tid:140537555547904
communication tid: 140537394865920
HELLO WORLD 174
...数据已经接收完毕...
num = 2
打印tid:140537394865920
打印tid:140537394865920
communication tid: 140537394865920
HELLO WORLD 197
...communication tid: 140537555547904
HELLO WORLD 154
...数据已经接收完毕...
数据已经接收完毕...
num = 1
打印tid:140537555547904
communication tid: 140537555547904
HELLO WORLD 175
...数据已经接收完毕...
num = 2
打印tid:140537555547904
打印tid:140537555547904
communication tid: 140537394865920
HELLO WORLD 155
...数据已经接收完毕...
communication tid: 140537555547904
HELLO WORLD 198
...数据已经接收完毕...
num = 1
打印tid:140537394865920
communication tid: 140537555547904
HELLO WORLD 176
...数据已经接收完毕...
num = 1
打印tid:140537555547904
communication tid: 140537555547904
HELLO WORLD 156
...数据已经接收完毕...
num = 1
打印tid:140537555547904
communication tid: 140537555547904
HELLO WORLD 199
...数据已经接收完毕...
num = 1
打印tid:140537555547904
communication tid: 140537555547904
HELLO WORLD 177
...数据已经接收完毕...
num = 2
打印tid:140537555547904
打印tid:140537555547904
communication tid: 140537394865920
HELLO WORLD 157
...数据已经接收完毕...
communication tid: 140537555547904
客户端已经断开连接...
num = 1
打印tid:140537394865920
communication tid: 140537555547904
HELLO WORLD 178
...数据已经接收完毕...
num = 1
打印tid:140537555547904
communication tid: 140537555547904
HELLO WORLD 158
...数据已经接收完毕...
num = 1
打印tid:140537555547904
communication tid: 140537555547904
HELLO WORLD 179
...数据已经接收完毕...
num = 1
打印tid:140537555547904
communication tid: 140537555547904
HELLO WORLD 159
...数据已经接收完毕...
num = 1
打印tid:140537555547904
communication tid: 140537555547904
HELLO WORLD 180
...数据已经接收完毕...
num = 1
打印tid:140537555547904
communication tid: 140537555547904
HELLO WORLD 160
...数据已经接收完毕...
num = 1
打印tid:140537555547904
communication tid: 140537555547904
HELLO WORLD 181
...数据已经接收完毕...
num = 1
打印tid:140537555547904
communication tid: 140537555547904
HELLO WORLD 161
...数据已经接收完毕...
num = 1
打印tid:140537555547904
communication tid: 140537555547904
HELLO WORLD 182
...数据已经接收完毕...
num = 1
打印tid:140537555547904
communication tid: 140537555547904
HELLO WORLD 162
...数据已经接收完毕...
num = 1
打印tid:140537555547904
communication tid: 140537555547904
HELLO WORLD 183
...数据已经接收完毕...
num = 1
打印tid:140537555547904
communication tid: 140537555547904
HELLO WORLD 163
...数据已经接收完毕...
num = 1
打印tid:140537555547904
communication tid: 140537555547904
HELLO WORLD 184
...数据已经接收完毕...
num = 1
打印tid:140537555547904
communication tid: 140537555547904
HELLO WORLD 164
...数据已经接收完毕...
num = 1
打印tid:140537555547904
communication tid: 140537555547904
HELLO WORLD 185
...数据已经接收完毕...
num = 1
打印tid:140537555547904
communication tid: 140537555547904
HELLO WORLD 165
...数据已经接收完毕...
num = 1
打印tid:140537555547904
communication tid: 140537555547904
HELLO WORLD 186
...数据已经接收完毕...
num = 1
打印tid:140537555547904
communication tid: 140537555547904
HELLO WORLD 166
...数据已经接收完毕...
num = 1
打印tid:140537555547904
communication tid: 140537555547904
HELLO WORLD 187
...数据已经接收完毕...
num = 1
打印tid:140537555547904
communication tid: 140537555547904
HELLO WORLD 167
...数据已经接收完毕...
num = 1
打印tid:140537555547904
communication tid: 140537555547904
HELLO WORLD 188
...数据已经接收完毕...
num = 1
打印tid:140537555547904
communication tid: 140537555547904
HELLO WORLD 168
...数据已经接收完毕...
num = 1
打印tid:140537555547904
communication tid: 140537555547904
HELLO WORLD 189
...数据已经接收完毕...
num = 1
打印tid:140537555547904
communication tid: 140537555547904
HELLO WORLD 169
...数据已经接收完毕...
num = 1
打印tid:140537555547904
communication tid: 140537555547904
HELLO WORLD 190
...数据已经接收完毕...
num = 1
打印tid:140537555547904
communication tid: 140537555547904
HELLO WORLD 170
...数据已经接收完毕...
num = 1
打印tid:140537555547904
communication tid: 140537555547904
HELLO WORLD 191
...数据已经接收完毕...
num = 1
打印tid:140537555547904
communication tid: 140537555547904
HELLO WORLD 171
...数据已经接收完毕...
num = 1
打印tid:140537555547904
communication tid: 140537555547904
HELLO WORLD 192
...数据已经接收完毕...
num = 1
打印tid:140537555547904
communication tid: 140537555547904
HELLO WORLD 172
...数据已经接收完毕...
num = 1
打印tid:140537555547904
communication tid: 140537555547904
HELLO WORLD 193
...数据已经接收完毕...
num = 1
打印tid:140537555547904
communication tid: 140537555547904
HELLO WORLD 173
...数据已经接收完毕...
num = 1
打印tid:140537555547904
communication tid: 140537555547904
HELLO WORLD 194
...数据已经接收完毕...
num = 1
打印tid:140537555547904
communication tid: 140537555547904
HELLO WORLD 174
...数据已经接收完毕...
num = 1
打印tid:140537555547904
communication tid: 140537555547904
HELLO WORLD 195
...数据已经接收完毕...
num = 1
打印tid:140537555547904
communication tid: 140537555547904
HELLO WORLD 175
...数据已经接收完毕...
num = 1
打印tid:140537555547904
communication tid: 140537555547904
HELLO WORLD 196
...数据已经接收完毕...
num = 1
打印tid:140537555547904
communication tid: 140537555547904
HELLO WORLD 176
...数据已经接收完毕...
num = 1
打印tid:140537555547904
communication tid: 140537555547904
HELLO WORLD 197
...数据已经接收完毕...
num = 1
打印tid:140537555547904
communication tid: 140537555547904
HELLO WORLD 177
...数据已经接收完毕...
num = 1
打印tid:140537555547904
communication tid: 140537555547904
HELLO WORLD 198
...数据已经接收完毕...
num = 1
打印tid:140537555547904
communication tid: 140537555547904
HELLO WORLD 178
...数据已经接收完毕...
num = 1
打印tid:140537555547904
communication tid: 140537555547904
HELLO WORLD 199
...数据已经接收完毕...
num = 1
打印tid:140537555547904
communication tid: 140537555547904
HELLO WORLD 179
...数据已经接收完毕...
num = 1
打印tid:140537555547904
communication tid: 140537555547904
客户端已经断开连接...
num = 1
打印tid:140537555547904
communication tid: 140537555547904
HELLO WORLD 180
...数据已经接收完毕...
num = 1
打印tid:140537555547904
communication tid: 140537555547904
HELLO WORLD 181
...数据已经接收完毕...
num = 1
打印tid:140537555547904
communication tid: 140537555547904
HELLO WORLD 182
...数据已经接收完毕...
num = 1
打印tid:140537555547904
communication tid: 140537555547904
HELLO WORLD 183
...数据已经接收完毕...
num = 1
打印tid:140537555547904
communication tid: 140537555547904
HELLO WORLD 184
...数据已经接收完毕...
num = 1
打印tid:140537555547904
communication tid: 140537555547904
HELLO WORLD 185
...数据已经接收完毕...
num = 1
打印tid:140537555547904
communication tid: 140537555547904
HELLO WORLD 186
...数据已经接收完毕...
num = 1
打印tid:140537555547904
communication tid: 140537555547904
HELLO WORLD 187
...数据已经接收完毕...
num = 1
打印tid:140537555547904
communication tid: 140537555547904
HELLO WORLD 188
...数据已经接收完毕...
num = 1
打印tid:140537555547904
communication tid: 140537555547904
HELLO WORLD 189
...数据已经接收完毕...
num = 1
打印tid:140537555547904
communication tid: 140537555547904
HELLO WORLD 190
...数据已经接收完毕...
num = 1
打印tid:140537555547904
communication tid: 140537555547904
HELLO WORLD 191
...数据已经接收完毕...
num = 1
打印tid:140537555547904
communication tid: 140537555547904
HELLO WORLD 192
...数据已经接收完毕...
num = 1
打印tid:140537555547904
communication tid: 140537555547904
HELLO WORLD 193
...数据已经接收完毕...
num = 1
打印tid:140537555547904
communication tid: 140537555547904
HELLO WORLD 194
...数据已经接收完毕...
num = 1
打印tid:140537555547904
communication tid: 140537555547904
HELLO WORLD 195
...数据已经接收完毕...
num = 1
打印tid:140537555547904
communication tid: 140537555547904
HELLO WORLD 196
...数据已经接收完毕...
num = 1
打印tid:140537555547904
communication tid: 140537555547904
HELLO WORLD 197
...数据已经接收完毕...
num = 1
打印tid:140537555547904
communication tid: 140537555547904
HELLO WORLD 198
...数据已经接收完毕...
num = 1
打印tid:140537555547904
communication tid: 140537555547904
HELLO WORLD 199
...数据已经接收完毕...
num = 1
打印tid:140537555547904
communication tid: 140537555547904
客户端已经断开连接...

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/942692.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python venv 打包,更换路径后,仍然读取到旧路径 ,最好别换路径,采用docker封装起来

机械盘路径 /home/yeqiang/code/xxx 移动到 /opt/xxx 编辑/opt/xxx/venv/bin/activate VIRTUAL_ENV"/home/yeqiang/code/xxx/venv" 改为 VIRTUAL_ENV"/opt/xxx/venv" 下面还有这么多&#xff0c;参考&#xff1a; (venv) yeqiangyeqiang-MS-7B23:/…

Kubernetes入门 十一、网络之Service

目录 概述Service 原理Service 四种类型创建 Service代理 k8s 外部服务反向代理外部域名 概述 在 Kubernetes 中&#xff0c;Pod 是应用程序的载体&#xff0c;我们可以通过 Pod 的 IP 来访问应用程序&#xff0c;但是 Pod 的 IP 地址不是固定的&#xff0c;这就意味着不方便直…

MyBatisPlus实现多租户功能

前言&#xff1a;多租户是一种软件架构技术&#xff0c;在多用户的环境下&#xff0c;共有同一套系统&#xff0c;并且要注意数据之间的隔离性。 一、SaaS多租户简介 1.1、SaaS多租户 SaaS&#xff0c;是Software-as-a-Service的缩写名称&#xff0c;意思为软件即服务&#x…

【电源专题】读一读单节锂电池保护IC规格书

在文章【电源专题】单节锂离子电池的保护的基本原理 中我们了解了电池包的过充、过放、过流、短路等保护功能。那么这些功能都会在电池保护IC规格书中体现吗?体现在哪些地方?哪些参数是我们应关注的呢? 对于手册中的电压检测,如放电过流、充电过流和负载短路等检测电压都代…

开源软件的国际化和本地化

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

centos7删除乱码文件

centos7删除乱码文件1. 小白教程&#xff0c;一看就会&#xff0c;一做就成。 1.解释 当文件名为乱码的时候&#xff0c;无法通过键盘输入文件名&#xff0c;所以在终端下就不能直接利用rm&#xff0c;mv等命令管理文件了。 但是每个文件都有一个i节点号&#xff0c;可以通过…

《Flink学习笔记》——第三章 Flink的部署模式

不同的应用场景&#xff0c;有时候对集群资源的分配和占用有不同的需求。所以Flink为各种场景提供了不同的部署模式。 3.1 部署模式&#xff08;作业角度/通用分类&#xff09; 根据集群的生命周期、资源的分配方式、main方法到底在哪里执行——客户端还是Client还是JobManage…

AIGC - 生成模型

AIGC - 生成模型 0. 前言1. 生成模型2. 生成模型与判别模型的区别2.1 模型对比2.2 条件生成模型2.3 生成模型的发展2.4 生成模型与人工智能 3. 生成模型示例3.1 简单示例3.2 生成模型框架 4. 表示学习5. 生成模型与概率论6. 生成模型分类小结 0. 前言 生成式人工智能 (Generat…

【最强最全】视频号下载助手(支持视频号视频, 直播,回放下载)

视频号下载助手支持视频号视频, 直播,回放的下载&#xff0c;本工具基于秦天sunny中间件编写&#xff0c;无需再使用其它抓包软件&#xff0c;无需再使用其它下载软件。 当然&#xff0c;你也可以右键复制抓取后的视频源再用其它下载软件下载。 使用说明 解压文件&#xff0c;…

CSS中如何实现弹性盒子布局(Flexbox)的换行和排序功能?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 换行&#xff08;Flexbox Wrapping&#xff09;⭐ 示例&#xff1a;实现换行⭐ 排序&#xff08;Flexbox Ordering&#xff09;⭐ 示例&#xff1a;实现排序⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得…

基于java swing和mysql实现的仓库商品管理系统(源码+数据库+运行指导视频)

一、项目简介 本项目是一套基于java swing和mysql实现的仓库商品管理系统&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。 包含&#xff1a;项目源码、项目文档、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经…

流媒体弱网优化之路(BBR应用)——GCC与BBR的算法思想分析

流媒体弱网优化之路(WebRTC)——GCC与BBR的算法思想分析 —— 我正在的github给大家开发一个用于做实验的项目 —— github.com/qw225967/Bifrost目标&#xff1a;可以让大家熟悉各类Qos能力、带宽估计能力&#xff0c;提供每个环节关键参数调节接口并实现一个json全配置&…

【洛谷算法题】P1001-A+B Problem【入门1顺序结构】

&#x1f468;‍&#x1f4bb;博客主页&#xff1a;花无缺 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P1001-AB Problem【入门1顺序结构】&#x1f30f;题目背景&#x1f30f;题目描述…

【Linux操作系统】Linux系统编程中条件变量实现生产者消费者模型

在Linux系统编程中&#xff0c;条件变量是一种用于线程间同步的机制&#xff0c;常用于实现生产者消费者模型。生产者消费者模型是一种常见的并发编程模型&#xff0c;用于解决多线程环境下的数据共享和同步问题。在该模型中&#xff0c;生产者负责生产数据&#xff0c;消费者负…

53 个 CSS 特效 3(完)

53 个 CSS 特效 3&#xff08;完&#xff09; 前两篇地址&#xff1a; 53 个 CSS 特效 153 个 CSS 特效 2 这里是第 33 到 53 个&#xff0c;很多内容都挺重复的&#xff0c;所以这里解释没之前的细&#xff0c;如果漏了一些之前的笔记会补一下&#xff0c;写过的就会跳过。…

【算法训练-模拟】模拟设计LRU缓存结构

废话不多说&#xff0c;喊一句号子鼓励自己&#xff1a;程序员永不失业&#xff0c;程序员走向架构&#xff01;本篇Blog的主题是LRU缓存结构设计&#xff0c;这类题目出现频率还是很高的&#xff0c;几乎所有大厂都常考。 当然面对这道题&#xff0c;首先要讲清楚LRU是干什么…

JavaScript—对象与构造方法

目录 json对象&#xff08;字面值&#xff09; js中对象是什么&#xff1f; 如何使用&#xff1f; 关联数组 js对象和C#对象有什么区别&#xff1f; 构造函数 什么是构造方法&#xff1f; 如何使用构造方法&#xff1f; 如何添加成员&#xff1f; 对象的动态成员 正则…

PageObject三层架构模式实现

1&#xff1a;PageObject三层架构分为&#xff1a; 接下来用163邮箱的登录功能来举例说明三层架构的使用。 1&#xff1a;先创建目录结构&#xff0c;如下图 2&#xff1a;在工具Util中&#xff0c;先封装查找元素定位的工具&#xff0c;创建一个find_ele.py文件。内容如下&am…

JavaScript—DOM(文档对象模型)

目录 DOM是什么&#xff1f; DOM有什么作用&#xff1f; 一、事件 理解事件 事件怎么写&#xff08;要做什么就写什么&#xff09;&#xff1f; 实战演练 1、页面加载完毕以后&#xff0c;打印一句话 2、如果有一个a标签&#xff0c;并给其添加一个点击事件 3、事件默…