毕业论文

打赏
当前位置: 毕业论文 > 计算机论文 >

Windows环境下轻量级Web服务器设计多线程编程(4)

时间:2022-07-02 21:19来源:毕业论文
详细的技术原理将分为几部分进行阐述,如下: 2。1 网络编程 首先来讲述下网络编程的基本原理,客户端和服务器作为通讯的双方,经过套接字来进行数

详细的技术原理将分为几部分进行阐述,如下:

2。1 网络编程

    首先来讲述下网络编程的基本原理,客户端和服务器作为通讯的双方,经过套接字来进行数据传输。首先服务器端通过调用WSAStartup函数加载Winsock DLL,然后调用socket函数创建一个用于绑定(使用bind函数)自身的IP和端口号的socket对象,调用socket的构造函数对其进行初始化。创建成功后会返回该socket的文件描述符以作标识。

    接着服务器端会使用listen函数使socket变为listen状态。此时我们再反观客户端,它也是一样,在开始的时候需要以调用函数的方式加载Winsock的动态链接库,然后调用socket函数创建用于建立连接的套接字,通过bind函数绑定客户机的IP。套接字绑定之后,客户端会调用函数connect发送通信connect请求。此时服务器端的socket监听到连接请求后会先检查请求的正确性,若是正确的,将会使用accept函数进行接收,若是错误的则会拒绝并返回HTTP的错误码,例如400,代表的就是请求有错误。若是请求正确,那么服务器会创建线程来接收,之所以创建线程,是因为若是不采用多线程技术,会由于accept操作的阻塞性导致需要处理完本客户端的请求之后再重新对其他客户端的请求进行监听,是串行操作,无法满足多线程的要求。被accept之后,服务器端会创建另一个套接字用于进行数据通信,这个套接字会随机指定一个空闲的端口用于和客户端进行文件传输操作,双方通过将数据写入到socket中,然后也是通过从socket中读出的方式来进行信息传输的,当然在进行数据传输的时候也是创建了多个线程,为防止阻塞性以满足对多个文件的访问请求(例如代码中对html页面和favicon的访问)。当数据传输进行完毕之后服务器端会关闭进行数据传输的socket,当关闭浏览器时客户端相当于也关闭了自身的socket,最后服务器端关闭最初用于接收连接的socket,至此通信结束。[1]

上述的通信过程,可以看成是:一个个的客户端,通过指定的URL来获取服务器上的资源,而服务器的本质是一个不断执行着的进程在等待着连接请求。信息交互的整体过程可以概括性地看成是一端send信息,而另一端进行recv,recv后该端send信息,对应的那端再recv这样一个循环往复的过程,当然双方也可以同时send,同时recv。

关于socket,主要分为两类:一种是流式socket,另一种是数据报socket,流式socket需要客户端和服务器间建立连接后才能传输,虽然建立过程稍微繁复些,但是可保证准确、有序、去重等特性,比较适合数据量较大的传输;相反,数据报socket的传输则具有无序、不去除重复、准确性低等特性,但是其传输速度是较快的,比较适合于数据量较小的传输。其实两者特性的比较和TCP、UDP特性上的比较在一定程度上是相似的。[2]

2。2 多线程编程

   本项目实质是多线程结构下的网络编程,由于网络编程自身的一些局限性故需要使用到多线程技术,例如服务器的accept操作在等待客户端的connect请求时会一直处于阻塞等待状态,而在信息收发过程中客户端和服务器端各自的recv操作也是需要阻塞等待的,若是没有发生响应会一直等待下去,这样会浪费大量的系统资源,使其他客户端的请求得不到及时的响应。基于此特性,网络编程需要使用多线程编程技术,给以上操作分别创建线程,让他们分别进行而不阻塞主进程,实现同时可以处理多个客户端请求的效果。来;自]优Y尔E论L文W网www.youerw.com +QQ752018766-

    线程和进程往往总是被同时提起,其间有着千丝万缕的关系,那为什么在该项目中使用线程而不使用进程呢?线程有着其独有的优点,例如占用系统资源较少、启动较为迅速、使多CPU系统更善于处理高并发请求、提高程序的响应特性等,可以极大地改善性能。而进程就显得很繁复,在创建的时候就需要为其分配内存、需要进行初始化总之需要做很多繁杂的操作,对系统资源的消耗比较大。线程可以看成是一个程序中的执行流,是可以独立运行的,系统为进程分配资源且为每一个进程生成主线程,然后主线程再生成线程,有利于提高多任务处理能力。同一个进程下的线程共享该进程的虚拟地址空间和资源空间,为了确保线程之间的协调运行,需要进行同步与互斥,以保证数据的完整性和程序正确有序地执行。在创建线程成功后返回的是该线程的文件句柄handle,其可以被看成是线程的ID,即身份号码一样的东西,确保线程可以被独一无二地标识出来。在使用完后进行关闭时,直接关闭其句柄就意味着关闭线程自身。 Windows环境下轻量级Web服务器设计多线程编程(4):http://www.youerw.com/jisuanji/lunwen_95830.html

------分隔线----------------------------
推荐内容