WebServer二三事(一)Socket编程说起

Socket 通信机制详解 阅读详情


关于专栏----WebServer二三事
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HZqt0PnA-1604666118212)(https://img.shields.io/badge/LWebServer-%E5%89%8D%E8%A8%80-yellow.svg)]
  在现代网络应用程序所使用的两种主流的体系结构: 客户机/服务器体系结构(CS) 和 对等体系结构(P2P) 中, Web应用程序属于典型的CS架构。这个相信大家都了解,而平时我们进行的服务端编程,大多数程序员习惯于使用较高层次的组件,框架,中间件等,使用便捷,能快速的完成功能点开发效率高,这些框架的使用使我们的开发变得简单,我们只需专注于业务,毋庸置疑是事半功倍的做法。
  但是在学习计算机网络,操作系统等原理性课程时总感觉和在开发过程所学的框架知识总存在着飘忽不定的隔阂------ 连贯不起来!
  而这些问题的源头就是,框架/组件为我们"做"了太多事情,这不是不好,相反这大大解放了工作量,但是我们却也失去了对一些底层概念的理解, 网络通信原理或者是 IO交互过程等,
   如何连贯?,我认为理解通信原理很关键,所以我通过实现简单服务器,去了解通信细节,协议,高性能原理,而这些底层内容对于框架和语言来说是通用的,所以对我学习框架或者是语言也是降维打击。
  学习网络通信就不得不说到 Socket编程。


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fCByZAXm-1604666118213)(https://img.shields.io/badge/LWebServer-Socket-yellow.svg)]
  首先得了解网络应用程序进行通信的是进程而非程序,在TCP/IP参考模型中
在这里插入图片描述
不同的端系统上的进程通过跨越计算机网络交换报文(message)而实现相互通信。
而具体的跨越过程这里不做详细探讨,可以通过计算机网络至顶向下方法这本书进行详细了解。


客户机进程和服务器进程

  对于Web应用来说,进程间的通信存在于客户机和服务器之间,进程简单理解为运行在端系统的程序,而客户机进程比较常见的就是浏览器,而服务器进程为Web服务器,比如Apache,Nginx,Tomcat等,

那我们写的WebApp在这里面充当什么角色?
  这里就体现前面说的,我们写的Web程序是基于一些组件框架或者中间件上建立的,其中复杂的通信原理被Web服务器封装,拿Tomcat来说,作为Servlet和JSP的容器,它负责接收HTTP请求,并把请求转送给对应的Servlet,然后Servlet将处理好的结果(响应)传回Tomcat,由Tomcat响应到客户机。我们开发的时候不用关心浏览器是如何和我们的Web程序建立TCP连接,协议如何解析。Java Web之Servlet的创建和详细原理

  Web服务器通过对套接字(Socket) 的封装实现进程间的通信,使我们在应用程序编程时不感知套接字层。


  上图可以看出操作系统通过提供Socket来为进程提供通信能力,而大多数应用端程序是基于通用组件编程,Socket层相对来说是透明的,但是在构建高性能应用程序时我们不得不去设置组件参数,优化组件性能,甚至是实现某个满足我们需求的特定组件,这时对底层通信接口的理解就变得十分重要了。


进程与计算机网络间的接口 ----------------Socket

  网络通信是进程间报文传输的过程,从一个进程向另一个进程发送报文必须通过下面的网络,进程通过操作系统提供的称为套接字(Socket) 的软件接口在网络上接收和发送报文。其实是进程间通信的抽象机制,
这里暂时不讨论它在不同的操作系统的具体实现(在后续深入理解文件描述符时探讨)。
在这里插入图片描述
  如图所示,Socket是同一台主机内应用层与传输层之间的接口,也可以将Socket称为应用程序和网络之间的应用程序编程接口(API) ,应用程序开发者可以控制Socket在应用层端的所有东西,而对该Socket的传输层端的控制却仅限于:

  • 选择传输层协议;
  • 设定几个传输层参数,如最大缓存,最大报文长度MSS等。

Socket相关系统调用

  这里主要是记录Linux下的Socket的系统调用函数,各种OS下其实都大同小异,其实JDK中为我们提供的函数,也是基于这些系统调用(syscall)的封装。

  • socket()
      socket()用于创建一个socket描述符(socket descriptor),它唯一标识一个socket。这个socket描述字跟文件描述字一样,后续的操作都有用到它,把它作为参数,通过它来进行一些读写操作。</
什么是Socket? 一、什么是Socket? 在计算机通信领域,socket 被翻译为“套接字”(套接字=主机+端口号),它是计算机之间进行通信的一种约定或一种方式。通过 socket这种约定,一台计算机可以接收其他计算机的数据,也可以向其他计算机发送数据 socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read关闭close”模式来操作。 我的理解就是Socket就是该模式的一个实现,它只是提供了一个针对TCP或者UDP编程的接口:即so 阅读详情

相关推荐

基于Python+socket编程实现的简单的WebServer

基于Python+socket编程实现的简单的WebServer 通过解析客户端向服务端发送的请求数据: receiveMsg=self.__connection.recv(self.__bufferSize)。 来向客户端返回相应的请求数据 文件布局 pymsgi static(存放照片等文件) templates(存放html文件,下列为包含文件) error.html ind...

g1x2w3的博客 622

基于Python+socket(TCP)编程实现的简单的WebServer(WSGI)

2

weixin_44423698的博客 663

Ansys Lumerical 2023 R1.2新功能实战:薄膜铌酸锂调制器仿真全流程解析

本文详细解析了Ansys Lumerical 2023 R1.2在薄膜铌酸锂电光相位调制器仿真中的最新功能与应用。通过实战演示,展示了从电极配置、电场计算到模式分析的全流程,重点介绍了各向异性介电常数支持和多物理场耦合优化等关键技术,助力开发者高效设计高性能光通信器件。

weixin_28454475的博客 1207

2019年上交电院计算机直博保研经历

本人选报的是上交六月一日在武汉举办的直博选拔,五月三十一日到达酒店,地点在武汉大学旁边(PS:上交是不管住宿、来回车票的,~划重点~包括夏令营),入住后当然是紧张的准备英语面试等等内容了,当天我是排在了下午面试,感觉还很好,上午可以多睡一会,最好能够去踩踩点上午,然后下午面试一定要早去,说是一点开始,但是老师十二点半就开始让学生进去了,有一个同学排在第二个,但是当时叫到他时还不到一点,没到,最后据...

LifeMaker的博客 4892

Modkit

Nmod- 通过过滤器分类为具有指定碱基修饰的残基的调用数量。Ncanonical- 通过过滤器分类为未修饰的碱基的调用数量。确切的碱基必须通过修饰代码推断。例如,如果修饰代码是m(5mC),则未修饰的碱基是胞嘧啶。如果修饰代码是a,则未修饰的碱基是腺苷。Nother mod- 通过过滤器分类为修饰的调用数量,但修饰不同于列出的碱基(且相应的未修饰碱基相同)。例如,对于给定的胞嘧啶,可能有 3 个读取带有h调用,1 个带有未修饰调用,2 个带有m调用。在h的 bedMethyl 行中,N。

生物信息学 1264

Cadence Allegro 17.4学习记录开始00

Cadence Allegro 有三个版本,16.6,17.2,17.4。现在主要学习最新的版本17.4.原理图设计:OrCADPCB设计:Allegro主要用到的就下面三个图片软件:PCB Editor 17.4 是用来画PCB和元器件封装的;Padstack Editor 17.4 是用来画元器件焊盘的;Capture CIS 17.4 是用来画原理图和原理图库的。其实Cadence还有很多功能,现在计划先学习以上内容,后面熟悉了这个软件,还可以继续学习放仿真等功能。

qq_31444421的博客 7440

告别理论!手把手教你用Vivado 2020.2为ZYNQ PL端打造一个AXI4-Full读写DDR的IP核

本文详细介绍了如何使用Vivado 2020.2为ZYNQ PL端创建AXI4-Full主控IP核,实现高效读写DDR内存的实战指南。通过环境配置、IP核创建、系统集成到软件调试的全流程讲解,帮助开发者快速掌握AXI4-Full协议在ZYNQ平台上的应用,提升PL与PS协同工作的数据传输效率。

weixin_30300225的博客 467

landsat8数据下载教程

下载landsat数据教程

weixin_44001203的博客 1万+

全新RT-DETR 有效涨点改进目录 | 包含各种卷积、主干改进、各种注意力机制、Neck特征融合改进、损失函数、AIFI创新改进、独家创新、小目标检测、特殊场景检测等最全大论文及小论文必备创新改进点

《全新最全RT-DETR涨点改进专栏》提供500+种创新改进方案,涵盖卷积、注意力机制、主干网络等模块优化,适用于PCB检测、工业缺陷检测等场景。专栏包含顶会论文改进点、数据集增强方法、热力图可视化等实用功能,帮助科研人员快速提升模型性能。提供完整环境配置指南(Python3.10+Pytorch2.5.1)和训练教程,支持不同版本RT-DETR模型。定期更新涨点策略,配套QQ答疑群免费指导,适合从入门到发论文全流程需求,特别推荐给目标检测领域的研究生和工程师。

Ai缝合怪、助力小伙伴高效发论文 3398

爬虫:一文掌握网站加密和混淆以及浏览器调试的技巧

面对加密和混淆技术的网站,传统的爬虫方法可能难以奏效。通过结合浏览器调试工具(如Puppeteer、Playwright)、代理工具(如Burp Suite、Fiddler)以及动态和静态分析技巧,可以深入理解网站的运行机制,绕过加密和混淆,实现有效的数据抓取。同时,务必注意合法合规,尊重目标网站的规则和用户的隐私,确保爬虫行为的正当性和可持续性。

数据知道的博客 9888

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

上一篇: 关于专栏-------WebServer二三事
下一篇: WebServer二三事(二)五种网络I/O模式
define_YIDA
博客等级 码龄9年 323粉丝 62原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值