先看我的测试结果:
最最low的服务器:
功能:监听新用户
   监听注册描述符的EPOLLIN和EPOLLOUT。
   触发EPOLLIN的话,打印缓冲区
   触发EPOLLOUT,发送固定字符串
代码:

/*************************************************************************> File Name: 1.cpp> Author: 朱紫钰> Mail: zhuziyu1157817544@gmail.com> Created Time: 2017年08月01日 星期二 12时54分24秒************************************************************************/#include<iostream>
#include<sys/types.h>
#include<arpa/inet.h>
#include<netinet/in.h>
#include<unistd.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<string.h>
#include<stdlib.h>
#include<sys/socket.h>
#include<sys/epoll.h>
#include<errno.h>
#include<stdio.h>
#include"server_epoll.h"
#define server_port 20000
using namespace std;int main(int argc,char *argv[])
{struct sockaddr_in address;bzero(&address,sizeof(address));address.sin_family = AF_INET;address.sin_port = htons(server_port);address.sin_addr.s_addr = htonl(INADDR_ANY);epoll_class epoll_object(5);//int epollfd = epoll_create(5);//struct epoll_event events[65535];int listenfd = socket(PF_INET,SOCK_STREAM,0);bind(listenfd,(struct sockaddr*)&address,sizeof(address));listen(listenfd,5);epoll_object.server_addfd(listenfd);while(1){int ret = epoll_object.server_epoll_wait();if((ret < 0) && (errno != EINTR)){perror("errno : ");break;}cout << "ret = " << ret << endl;for(int i = 0;i < ret;i++){int sockfd = epoll_object.events[i].data.fd;if( listenfd == sockfd){cout << "有新客户连接了!" << endl;struct sockaddr_in client_address;socklen_t client_length = sizeof(client_address);int connfd = accept(listenfd,(struct sockaddr*)&client_address,&client_length);cout << "所创建的客户套接字是: "<< connfd << endl;if(connfd < 0) {perror("errno : ");continue;}epoll_object.server_addfd(connfd);continue;}else if(epoll_object.events[i].events & EPOLLIN){char buf[4096];memset(buf,0,4096);int ret2 = recv(sockfd,buf,4095,0);if(ret2 == 0){close(sockfd);printf("套接字为%d的客户端要关闭了!\n",sockfd);epoll_object.server_delfd(sockfd);continue;}cout << "buf :" << buf << endl;cout << "以上就是来自套接字" << sockfd << "发来的信息,处理信息中..." << endl;epoll_object.server_modfd(sockfd,EPOLLOUT);cout << "可以向描述符是"<< sockfd << "的客户端发送数据"<< endl;}else if(epoll_object.events[i].events & EPOLLOUT){cout << "已经触发写事件,正在写入请稍候..." << endl;char buf[4096];char buf2[65535];char readbuf[4096];int filefd = open("../servermanage/index.html",O_RDONLY);read(filefd,readbuf,4096);strcpy(buf2,readbuf);memset(buf,0,4096);strcat(buf,"HTTP/1.1 200 OK\r\n");strcat(buf,"Host: 127.0.0.1\r\n");strcat(buf,"Connection: keep-alive\r\n\n");//strcat(buf,buf2);send(sockfd,buf,strlen(buf),0);cout << "写入成功!\n" << endl;cout << endl << endl;epoll_object.server_modfd(sockfd,EPOLLIN);} }}}

再看最low的客户端:
功能:
   主线程和服务器三次握手建立连接,主线程和子线程都往相同的connfd中send和recv,且是阻塞型。
代码:

/*************************************************************************> File Name: 1.c> Author: 朱紫钰> Mail: zhuziyu1157817544@gmail.com> Created Time: 2017年08月03日 星期四 15时22分28秒************************************************************************/#include<stdio.h>
#include<arpa/inet.h>
#include<netinet/in.h>
#include<unistd.h>
#include<pthread.h>
#include<sys/types.h>
#include<sys/socket.h>
void *pthread_work(void* sockfd)
{int connfd = *(int*)sockfd;while(1){send(connfd,"这是来自客户端子线程请求",64,0);sleep(1);char buf[1024] = {0};recv(connfd,buf,1024,0);printf("这是客户端%d的子线程接收到的请求!\n",connfd);printf("%s\n\n",buf);sleep(4);}
}
int main()
{struct sockaddr_in client_address;client_address.sin_family = AF_INET;client_address.sin_port = htons(20000);inet_aton("127.0.0.1",&client_address.sin_addr);int connfd = socket(AF_INET,SOCK_STREAM,0);connect(connfd,(struct sockaddr*)&client_address,sizeof(client_address));pthread_t pthread;pthread_create(&pthread,NULL,(void*)pthread_work,(void*)&connfd);while(1){send(connfd,"这是来自客户端的消息\n",32,0);sleep(1);char buf[1024] = {0};recv(connfd,buf,1024,0);printf("这是客户端%d受到的来自服务器的消息:",connfd);printf("%s\n\n",buf);sleep(4);}return 0;
}

运行结果和分析:
服务器结果:

可以看到,子线程和主线程共用sockfd = 5.这是因为我的客户端设置主线程子线程共用sockfd = 5。

客户端结果:

以上是客户端接收到的结果。

这只是我用自己写的客户端测试了我自己写的low服务器,根据结果,发现一旦建立客户端和服务器建立了链接,除非客户端自己关闭,否则,服务器不会主动从epoll去除这个套接字描述符。如果客户端不主动关闭,那么这个通信的道路仍然是完好可通信的!

那么,如果真正应用过程中,客户端变成高达上的浏览器会怎么样?

我们知道,谷歌一个标签开一个进程,以下是我让浏览器去请求我写的low服务器的运行结果。谷歌浏览器要根据服务器返回的index.html去请求后续资源。资源有:index.html , in.php , zhuziyu.html , 还有一系列图片。

原服务器代码中注释了 :
//strcat(buf,buf2);是为了给我写的客户端发送更为简单的内容进行测试。现在我把这个注释拿掉.
index.html代码:

<html>
<head>
<meta http-equiv = "Content-Type" content = "text/html ; charset = utf-8">
<style>
.block{text-align:center;
}
.size{font-size:24px;font-color:##660099;
}
body{background: url("http://127.0.0.1:20000/home/zhuziyu/server/servermanage/朝阳.jpg")no-repeat center bottom; background-size: cover; background-attachment:fixed;}
</style>
</head>
<body class = "block">
<form action="in.php" method = "post">
Name:<br>
<input type="text" name="name" >
<br>
Password:<br>
<input type="password" name="password">
<br><br>
<input type="submit" value="Submit">
</form> <p  class = "size"><strong>If you submit right,you will get the secret!<strong></p>
</body>
</html>

in.php代码:

<?php
$name =  $_POST["name"];
$password =  $_POST["password"];
?><?php
if($password == "123456"){header("Location: http://127.0.0.1/home/zhuziyu/server/servermanege/zhuziyu.html");
}
else{header("Location: http://127.0.0.1/home/zhuziyu/server/servermanege");
}?>

zhuziyu.html代码:

<html>
<head>
<meta http-equiv = "Content-Type" content = "text/html ; charset = utf-8">
<title> secret </title>
<style>
body{background: url("http://127.0.0.1:20000/home/zhuziyu/server/servermanege/橙色.jpg")no-repeat center bottom; background-size: cover; background-attachment:fixed;
}
.day{text-align:center;
}
.pic1{width:200px;height:200px;position: absolute;top:100px;left:450px;background: url("http://127.0.0.1:20000/home/zhuziyu/server/servermanege/Butteri1.jpg");}
.pic2{width:200px;height:200px; position: absolute;top:100px;left:700px; background: url("http://127.0.0.1:20000/home/zhuziyu/server/servermanege/butter.jpg");}
.pic3{width:200px;height:200px; position: absolute;top:350px;left:450px; background: url("http://127.0.0.1:20000/home/zhuziyu/server/servermanege/i.jpg");}
.pic4{width:200px;height:200px; position: absolute;top:350px;left:700px; background: url("http://127.0.0.1/home:20000/zhuziyu/server/servermanege/butteri2.jpg");}
.text{
text-align:center;
}
</style>
</head>
<body>
<div class  = "text" style= "FONT-SIZE: 26pt; FILTER: wave(add=0,lightstrength=50,strength=3,freq=2,phrase=10); WIDTH: 100%; COLOR: #CC3300; LINE-HEIGHT: 100%; FONT-FAMILY: 华文行楷" ><strong>Hope Butter and Laura are together forever!Everyday is made of happiness!</strong></div>
<div class = "pic1" ></div>
<div class = "pic2" ></div>
<div class = "pic3" ></div>
<div class = "pic4" ></div></body>
</html>

现在用浏览器充当客户端,我们来看结果:
结果1:

可以在终端下看到,连接的套接字描述符是5,请求的url是/,我默认服务器响应返回index.html。

结果2:

可以看到,相同的标签,因为原index.html包括了一个叫http://127.0.0.1:20000/home/zhuziyu/server/servermanage/橙色.jpg的资源,因此浏览器向服务器请求该资源。从图片终端下可以看到浏览器已经把请求该资源的http请求包发给了服务器。

但是

这个有关图片url的请求包竟然被当作了一个新的客户端处理,即套接字描述符是7。我测试过,如果有很多url请求包,每一个url都包含一个要申请的资源,那么服务器都会把它当作新的客户端处理,也就是说,当一个index.html包含了多个url需要向服务器请求资源时候,有多少个资源请求,则在服务器对应多少各用户套接字描述符,如果在大胆猜测一下,那就是这个标签开了多个线程,每一个线程负责请求一个资源。

而且

看第三张图片:

当我关闭这个标签时候,才会显示套接字5和7关闭了.也就是说,我打开一个标签,标签内部,大胆猜测一下昂,至少是线程级别,一个线程维护一个资源请求和响应的通路。因此,我认为一个线程会创建一个套接字,然后就有很多的套接字,不同的套接字来合作对应同一个标签界面的组合搭建。又或许,多个线程请求的资源通过通信的方式,被同一个线程组合起来,最终构成了我们看到的界面,里面有php , css , jpg , png 等等。

而我之前写的那个很low的客户端,表明主线程和子线程可以共用一个套接字,因此,我认为,是浏览器自己的选择,导致一个标签创建了很多套接字,我认为我的服务器中有关epoll的系统调用正确。

但是说了这么半天,我觉得我需要用命令去验证这个想法。
 pstree -p 指定进程 :查看指定进程的线程
 
于是我运行我的服务器,还有谷歌浏览器(只打开了127.0.0.1:20000这一个标签页)。经验证,30646和30661中30661是标签:
30661下面是多线程的。
 

但是我没有办法验证验证,在这30661下的线程中,有多个线程共同合作完成同一个标签界面的组合。悲伤…

有一解答,感觉解了我一半的问题,但是线程之间的工作问题,还不清楚:
http://www.ha97.com/2908.html

有关谷歌浏览器的一个问题相关推荐

  1. 分享谷歌浏览器的一个插件-OneTab,非常赞

    首先来看下这个插件是什么样的,在谷歌商店里搜索onetab,看到如下,工具介绍能节省95%的内存,看着是不是相当诱人. 举个我自己的实际场景,在查资料的过程中,会打开很多网页标签,而没打开一个标签就相 ...

  2. f12 卡 谷歌浏览器_干货分享。关于谷歌浏览器的使用技巧,不需要插件

    之前关于分享了谷歌浏览器的一些插件使用.一些插件还是很不错的.所以最近也在整理这些东西.把不错的插件整合分享给大家. 这次介绍的是一些谷歌浏览器的操作上的东西. 1.页面自动滚动的操作 相信不少小伙伴 ...

  3. 解决谷歌浏览器跨域问题

    桃李春风一杯酒,江湖夜雨十年灯 序 今天在使用谷歌浏览器调用一个接口时,出现了跨域的问题.如下图所示: 解决方法 再复制一个浏览器的快捷方式: 右键刚复制出来的快捷方式,点属性,在目标的后面追加:-- ...

  4. 绿色便携版谷歌浏览器制作流程

    谷歌浏览器是一个很简约的浏览器,很多人都喜欢,我之前一直在想,如果要是能把谷歌浏览器制作成绿色版的就好了,可是最开始的时候没有任何进展,最开始的时候遇见几个问题: 一.大家也发现了,谷歌浏览器安装的时 ...

  5. 谷歌浏览器设置默认搜索引擎

    谷歌浏览器是一个比较好用的浏览器,但是默认使用goole搜索很麻烦,需要将其改成百度的 记录如下: 在地址栏右键: 点击修改搜索引擎: 将百度设置为默认(点击右边三个点的图标) 如果这里面没有百度,可 ...

  6. 谷歌浏览器占CPU非常高的解决办法

    谷歌Chrome浏览器是一款热门的浏览器,但是有用户在发现每次打开谷歌浏览器占用CPU非常高,其中还有个software reporter tool都会跟随谷歌浏览器的打开占用越来越高的CPU,有什么 ...

  7. 【教程】谷歌浏览器移到其他盘之后,本地网页代码无法用谷歌浏览器打开的解决办法

    前几天写了一篇教程,教大家将谷歌浏览器安装到其他盘,还没有看的可以戳链接: [教程]谷歌浏览器只能安装在C盘,教大家如何设置才能装在D盘, 但是,将默认安装在C盘的谷歌浏览器移到其他盘之后,好多默认的 ...

  8. 自己写一个代理绕过公司网络限制,听歌、看电影,实际上就是所有代理的原理,不仅仅是这些功能

    文章目录 1.能实现的功能和目的 2.整个代理思路(一次理顺) 3.详细实现过程(带截图) 3.1.首先,需要安装谷歌浏览器,网站是在谷歌浏览器上打开. 3.2.下载SwitchyOmega插件,然后 ...

  9. 近日,Edge和谷歌浏览器均已放弃支持Windows 7

    2022年12月开始,谷歌浏览器和Edge浏览器都放出了提示,不再为Windows 7提供任何更新,停止了对Windows 7的支持. 这意味着浏览器在win7上的bug不会得到任何修复,电脑的安全性 ...

最新文章

  1. bzoj 2109: [Noi2010]Plane 航空管制
  2. linux获取文件引用计数,linux-2.6内核模块引用计数的实现
  3. 星外php使用教程_星外PHP5.2.17自动配置一键安装包 防phpdos v1.4
  4. 群里别人问的杂七杂八的问题
  5. 【Vue】 element ui 引入第三方图标
  6. Android平台和java平台 DES加密解密互通程序及其不能互通的原因
  7. VUE自学日志03-模板语法
  8. Flask使用ajax进行前后端交互
  9. 哪些人适合做前端开发?HTML5前端发展前景怎么样?
  10. Vue复刻华为官网(三)
  11. 2022-03-25 Python作业3
  12. matlab怎样编程形成软件_Matlab编程笔记之GUI程序转exe
  13. Xshell SSH免密登录
  14. 大多数日志文件的后缀名是_log4j(添加日志)
  15. 搭建在线网校要注意的一些事项
  16. RGB显示屏的辐射超标问题点及解决方案
  17. MyBatis快速入门(10)全局配置--settings
  18. pyqtgraph Scrolling Plots 曲线的滚动播放;
  19. 华为二合一笔记本用鸿蒙,华为MatePad Pro2入网,预装鸿蒙OS、搭载麒麟9000
  20. 2020-2021期末考试总结

热门文章

  1. mysql c 连接 ssl_注意!MySQL SSL/TLS连接存在安全漏洞
  2. ESP32学习笔记(39)——播放MP3文件(内部DAC方式)
  3. strcmp函数的使用
  4. 【笔记】4. 离散傅里叶变换及其性质
  5. Spring Cloud Alibaba系列博客汇总整理
  6. 咖啡——驻足、关注和聆听
  7. Python 环境变量配置详解
  8. 深夜看了张一鸣的微博,让我越想越后怕…
  9. 突破小米悬浮窗权限控制--不需要权限的悬浮窗
  10. 【nowcoder 225278】牛牛嚯可乐(dfs)