简单的web服务器源代码
- 格式:docx
- 大小:33.36 KB
- 文档页数:24
一、Tomcat Tomcat 服务器是一个免费的开放源代码的Web 应用服务器 它是Apache 软件基金会 Apache Software Foundation 的Jakarta 项目中的一个核心项目 由Apache、Sun 和其他一些公司及个人共同开发而成。
由于有了Sun 的参与和支持 最新的Servlet 和JSP 规范总是能在Tomcat 中得到体现 Tomcat 5 支持最新的Servlet 2.4 和JSP 2.0 规范。
因为Tomcat 技术先进、性能稳定 而且免费 因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可 成为目前比较流行的Web 应用服务器。
Tomcat 很受广大程序员的喜欢 因为它运行时占用的系统资源小 扩展性好 支持负载平衡与邮件服务等开发应用系统常用的功能 而且它还在不断的改进和完善中 任何一个感兴趣的程序员都可以更改它或在其中加入新的功能。
Tomcat 是一个小型的轻量级应用服务器 在中小型系统和并发访问用户不是很多的场合下被普遍使用 是开发和调试JSP 程序的首选。
对于一个初学者来说 可以这样认为 当在一台机器上配置好Apache 服务器 可利用它响应对HTML 页面的访问请求。
实际上Tomcat 部分是Apache 服务器的扩展 但它是独立运行的 所以当你运行tomcat 时 它实际上作为一个与Apache 独立的进程单独运行的。
这里的诀窍是 当配置正确时 Apache 为HTML页面服务 而Tomcat 实际上运行JSP 页面和Servlet。
另外 Tomcat和IIS、Apache等Web服务器一样 具有处理HTML页面的功能 另外它还是一个Servlet和JSP容器 独立的Servlet容器是Tomcat的默认模式。
不过 Tomcat处理静态HTML的能力不如Apache 服务器。
Tomcat 最新版本是4.0x.4.0x与3.x的架构不同 而是重新设计的。
用vfp制作WEB网页(二)实例教程概览这是一个计算机中级考试的成绩查询系统,可以通过姓名或者准考证号码查询出考试成绩,查询界面是这样的:如果有结果返回,返回的结果将这样显示:如果没有记录被查到,将显示这个页面:代码分析Index.htm这是客户端浏览器上的查询界面,负责向 WEB 服务器发送请求。
关键代码是:<FORM name=search onsubmit="return validate_form()" action=search.asp method=post>表示用 POST 方法调用名称为 search.asp 的ASP 页面。
这里提交请求时,它会将客户端控件 cxxx 和 cxnr 的值一并传递到 WEB 服务器。
其中 cxxx 表示查询的关键字:是按照姓名查询还是按照准考证查询;cxnr 表示查询内容,就是具体姓名或者准考证号码。
Search.asp接着就是search.asp了,刚才客户端指明 WEB 服务器用 search.asp 来对应客户端的请求。
所有代码,如下:<%set ox=server.createobject("putertest")response.write ox.search(CBool(request("cxxx")),CStr(request("cxnr")))set ox=nothing%>这是用 VB Script 编写的 ASP 脚本程序,很简单。
先是创建 COM 对象实例,这和 Visual FoxPro 里的 CreateObject() 是很像的:set ox=server.createobject("putertest")创建了 COM 对象实例以后,就要调用它了。
这时通过 ASP 的 Request 对象取得查询参数 cxxx 和 cxnr ,由于 VB Script 里仅有一种数据类型就是 Variant,为了保证 COM 通讯时,参数的数据类型不出错误,我们进行强制类型转换;调用 search 函数,并等待 search 函数返回 HTML 代码。
12种最常⽤的⽹页编程语⾔简介(值得收藏)如今,随着⽹站的越来越普及,与Web相关的开发技术持续热门,从前端到后端,从标记语⾔到开发语⾔,各种技术交相辉映,沉沉浮浮,从开始简单的html到复杂的web开发语⾔asp、、php、jsp等等,在此,我就借助SEO马龙博客的平台跟⼤家简单的介绍⼀下常见的12种⽹页编程语⾔1、PHPPHP是⼀个嵌套的缩写名称,是英⽂“超级⽂本预处理语⾔”(PHP:Hypertext Preprocessor)的缩写。
PHP是⼀种HTML内嵌式的语⾔,与微软的ASP颇有⼏分相似,都是⼀种在服务器端执⾏的“嵌⼊HTML⽂档的脚本语⾔”,语⾔的风格有类似于C语⾔,现在被很多的⽹站编程⼈员⼴泛的运⽤。
PHP独特的语法混合了C、Java、Perl以及PHP⾃创新的语法。
它可以⽐CGI或者Perl更快速的执⾏动态⽹页。
⽤PHP做出的动态页⾯与其他的编程语⾔相⽐,PHP是将程序嵌⼊到HTML⽂档中去执⾏,执⾏效率⽐完全⽣成HTML标记的CGI要⾼许多;与同样是嵌⼊HTML⽂档的脚本语⾔相⽐,PHP在服务器端执⾏,成分利⽤了服务器的性能;PHP执⾏引擎还会将⽤户经常访问的PHP程序驻留在内存中,其他⽤户在⼀次访问这个程序时就不需要诚信编译程序了,只要直接执⾏内存中的代码就可以了,这也是PHP⾼效率的体现之⼀。
PHP具有⾮常强⼤的功能,所有的CGI或者的功能PHP都能实现,⽽且⽀持⼏乎所有流⾏的数据库以及操作系统。
2、JavaJava是⼀个由Sun公司开发⽽成的新⼀代编程语⾔。
是近年来很流⾏的⼀种⽹络编程语⾔,它由C语⾔发展⽽来,是完全⾯向对象的语⾔。
在与⽹络的融合中,已显现出它的强⼤⽣命⼒和⼴阔的前景。
Java的语法简练,学习和掌握⽐较容易,使⽤它可在各式各样不同种机器、不同种操作平台的⽹络环境中开发软件。
Java正在逐步成为Internet应⽤的主要开发语⾔。
它彻底改变了应⽤软件的开发模式,带来了⾃PC机以来⼜⼀次技术⾰命,为迅速发展的信息世界增添了新的活⼒。
thingsgateway源码讲解全文共四篇示例,供读者参考第一篇示例:一、ThingsGateway 的架构ThingsGateway 的架构基于两个主要组件:Web 服务器和设备管理器。
Web 服务器是用于提供用户界面和Web 服务的服务端应用程序,而设备管理器则是用于管理和控制物联网设备的客户端应用程序。
Web 服务器采用Node.js 技术栈开发,借助Express 框架实现简单的Web 服务接口。
它提供了一个RESTful API,允许开发者通过HTTP 请求来访问和管理物联网设备。
它还集成了WebSocket 技术,实现了实时数据推送功能,使用户能够实时获取设备状态和控制设备。
设备管理器是一个客户端应用程序,可安装在各种物联网设备上,用于提供设备管理和控制功能。
它使用MQTT 协议与Web 服务器进行通信,实现设备状态同步和控制命令传输。
设备管理器还提供了一个简单的Web 服务器,用于让用户可以直接通过浏览器来管理和控制设备。
二、ThingsGateway 的源码讲解ThingsGateway 的源码是按照模块化的方式组织的,分为Web 服务器模块、设备管理器模块和通信协议模块。
下面将逐一介绍这些模块的主要功能和实现。
1. Web 服务器模块Web 服务器模块主要负责提供用户界面和Web 服务,其源码位于server 目录下。
index.js 是Web 服务器的入口文件,定义了Express 应用程序和路由处理逻辑。
config.js 定义了服务器的配置参数,如端口号和数据库连接信息。
在routes 目录下,包含了不同的路由处理文件,如device.js和user.js。
这些文件定义了RESTful API 的路由和处理逻辑,用于获取和操作设备数据。
public 目录下存放了静态资源文件,如HTML、CSS 和JavaScript 文件,用于构建用户界面。
2. 设备管理器模块设备管理器模块主要负责管理和控制物联网设备,其源码位于devices 目录下。
Web程序员常用的15个源代码编辑器作者:顾伟来源:《计算机与网络》2020年第12期根据最近的计算和统计,截至2019年,仅在美国就有2 300万名Web开发人员。
但是,由于仍有很多人对这份工作充满热情,因此一定会有技术上的进步。
效率的提高和发展使Web 开发人员的工作相对容易,并且更有价值。
无论您需要HTML IDE还是使用JavaScript,仅了解Web开发IDE都是不够的,您需要使学习与更新的策略保持一致,并与一些最佳的源代码编辑器一起工作以获得最佳结果。
以下是一些用于HTML和Java的Web开发中最受好评和最常用的IDE源代码程序。
1. Visual Studio CodeVisual Studio Code是最好的JavaScript IDE之一,可与所有Windows,Mac,Linux一起使用。
它甚至支持Node.js和TypeScript。
它带有一整套环境,具有扩展范围,涵盖了其他语言,例如C ++,C#,Python,PHP等。
与其他语言相比,它在语法上具有更为重要的意义,它使用IntelliSense根据变量类型功能定义和导入的模块自动完成。
甚至还可以调试代码并启动或附加到正在运行的应用程序,包括断点、调用堆栈和引人入胜的控制台。
另外,它是免费使用的。
2. Brackets如果您正在寻找一个能够理解Web设计核心的编辑器,那么就不要再犹豫了,因为Brackets是这方面最好的IDE,它带有一组有价值的工具,同时具有视觉和预处理支持。
设计师主要是为Web设计创建它的,除了功能強大以外,最好的部分是它完全开源,并且可以免费使用。
3. Atom每个Web开发人员都有自己的一系列需求。
Github的Atom满足了获得可定制且易于使用的东西的要求,它是Java的顶级编辑器之一,它带有内置的软件包管理器,用来安装新的软件包,并帮助您在此强大工具下创建自己的软件包管理器。
它有预安装的8种主题及各种颜色,包括4个UI可供选择。
Tomcat服务器是一个免费的开放源代码的Web应用服务器。
因为Tomcat技术先进、性能稳定且免费,所以深受Java爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web应用服务器。
一、Tomcat与应用服务器到目前为止,Tomcat一直被认为是Servlet/JSP API的执行器,也就所谓的Servlet容器。
然而,Tomcat并不仅仅如此,它还提供了JNDI和JMX API的实现机制。
尽管如此,Tomcat仍然还不能算是应用服务器,因为它不提供大多数J2EE API 的支持。
很有意思的是,目前许多的应用服务器通常把Tomcat作为它们Servlet和JSP API的容器。
由于Tomcat允许开发者只需通过加入一行致谢,就可以把Tomcat嵌入到它们的应用中。
遗憾的是,许多商业应用服务器并没有遵守此规则。
对于开发者来说,如果是为了寻找利用Servlet、JSP、JNDI和JMX技术来生成Java Web应用的话,选择Tomcat是一个优秀的解决方案;但是为了寻找支持其他的J2EE API,那么寻找一个应用服务器或者把Tomcat作为应用服务器的辅助,将是一个不错的解决方案;第三种方式是找到独立的J2EE API实现,然后把它们跟Tomcat结合起来使用。
虽然整合会带来相关的问题,但是这种方式是最为有效的。
二、Tomcat与Web服务器Tomcat是提供一个支持Servlet和JSP运行的容器。
Servlet和JSP能根据实时需要,产生动态网页内容。
而对于Web服务器来说,Apache仅仅支持静态网页,对于支持动态网页就会显得无能为力;Tomcat则既能为动态网页服务,同时也能为静态网页提供支持。
尽管它没有通常的Web服务器快、功能也不如Web服务器丰富,但是Tomcat逐渐为支持静态内容不断扩充。
大多数的Web服务器都是用底层语言编写如C,利用了相应平台的特征,因此用纯Java编写的Tomcat执行速度不可能与它们相提并论。
Tomcat服务器⼊门超详细教程⽬录⼀,Tomcat的⼀些概念–1,服务器–2,web服务器–3,Tomcat服务器⼆,使⽤Tomcat–1,下载安装–2,启动&关闭–3,测试三,Tomcat⽬录结构–1,核⼼⽬录–2,修改默认端⼝号8080四,访问⾃⼰的项⽬资源–1,在webapps中添加⾃⼰简单的项⽬–2,测试–3,⼀个完整的web应⽤结构五,在IDEA中整合Tomcat–1,操作如下图–2,测试⼀,Tomcat的⼀些概念–1,服务器服务器:分为服务器硬件和服务器软件。
在硬件服务器(其实就是⼀台计算机)上安装了服务器软件,才可以对外提供服务。
1,硬件: 通常是指在互联⽹上具有独⽴IP的计算机,通常配置⽐较⾼。
⽐如我们⾃⼰的计算机也可以作为服务器使⽤(只不过配置较低)2,软件:就是⼀个计算机程序,⽐如MySQL服务器软件,tomcat服务器软件。
服务器软件分为很多类型,⽐如:ftp服务器,数据库服务器,邮件服务器,web服务器软件等–2,web服务器通过浏览器访问的⼀段计算机程序,服务器收到你的访问请求时,进⾏处理,并做出响应。
–3,Tomcat服务器Tomcat是Apache 软件基⾦会(Apache Software Foundation)的Jakarta 项⽬中的⼀个核⼼项⽬,因为Tomcat 技术先进、性能稳定,⽽且免费,因⽽深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为⽐较流⾏的Web 应⽤服务器.Tomcat 服务器是⼀个免费的开放源代码的Web 应⽤服务器,属于轻量级应⽤服务器,在中⼩型系统和并发访问⽤户不是很多的场合下被普遍使⽤,是开发和调试JSP 程序的⾸选。
对于⼀个初学者来说,可以这样认为,当在⼀台机器上配置好Apache 服务器,可利⽤它响应HTML(标准通⽤标记语⾔下的⼀个应⽤)页⾯的访问请求。
实际上Tomcat是Apache 服务器的扩展,但运⾏时它是独⽴运⾏的,所以当你运⾏tomcat 时,它实际上作为⼀个与Apache 独⽴的进程单独运⾏的。
tomcat通俗易懂的说法Tomcat是Apache软件基金会开发的一款免费开放源代码的Web应用服务器,它可以运行大多数的JSP和Servlet容器。
Tomcat有不同版本,但是其主要功能都是相同的,即在一个Web服务器上运行Java应用程序。
Tomcat是一款用于支持Java Servlet和JavaServer Pages (JSP)的开源Web服务器,它是Apache Software Foundation的一部分。
因此,它通常称为Apache Tomcat。
Apache Tomcat也可以作为HTTP代理服务器或反向代理服务器使用,但它主要是作为Web应用服务器而被广泛使用。
Tomcat的基本功能是提供一个Servlet容器来支持Java Web应用程序,包括JavaServer Pages(JSPs)和Web服务。
它可以被看作是一个Web应用服务器的运行时环境,它提供了用于运行Web应用程序的所有工具和类库。
Tomcat有两种部署方式,即独立和集成模式。
在独立模式下,Tomcat服务器是一个单独的应用程序,它可以运行在任何Java Web容器上。
在集成模式下,Tomcat服务器将与另一个Web服务器,如Apache HTTP服务器,一起运行,以使用Tomcat容器处理Servlet和JSP请求。
Tomcat支持多种流行的Java应用程序技术,包括Servlet、JavaServer Pages、Java Expression Language 和WebSocket。
它还支持多个Web应用程序框架,如Struts、Spring MVC和JSF,以及其他一些功能强大的Web 应用程序技术。
Tomcat的特性和功能特别强大,它可以实现应用程序的负载均衡、安全性控制和容错性,并且可以被部署在多个平台上,包括Windows、Linux和Mac OS X。
总的来说,Tomcat是一款用于支持Java Servlet和JSP的开源Web服务器,它可以提供许多强大的功能,支持多个平台,提供应用程序的负载均衡、安全性控制和容错性,是一款非常实用的Web服务器。
学习使用PHP进行Web开发的入门教程第一章:介绍PHP,全称是Hypertext Preprocessor,是一种脚本语言,与HTML结合使用,用于服务器端开发。
它具有简单易学、跨平台、开放源代码等特点,因此受到了广泛的应用。
本章将介绍PHP的特点、用途以及基本语法。
第二章:安装环境在学习PHP之前,首先需要安装PHP的开发环境。
本章将指导读者如何在Windows、Linux和Mac上安装PHP,并介绍如何配置PHP的运行环境。
第三章:基本语法PHP的基本语法与C语言和JavaScript相似,包括变量、数据类型、运算符、流程控制语句等。
本章将详细介绍PHP的基本语法,并通过示例代码来帮助读者理解。
第四章:数组与字符串处理数组在PHP中是一个非常重要的数据结构,可以用于存储和操作一组数据。
本章将介绍PHP中数组的创建、访问和操作方法,以及字符串的处理方法,例如字符串连接、分割、替换等。
第五章:函数与类函数是一个独立的代码块,可以实现特定的功能,并在需要时进行调用。
类是面向对象编程的基本概念,可以封装数据和功能。
本章将介绍PHP中函数和类的定义、调用和使用方法。
第六章:文件操作PHP提供了丰富的文件操作函数,可以用于读取和写入文件,以及文件和目录的管理。
本章将介绍PHP中常用的文件操作函数,并通过示例代码来演示它们的用法。
第七章:数据库操作PHP可以与各种类型的数据库进行交互,包括MySQL、Oracle、MongoDB等。
本章将介绍PHP中数据库操作的基本概念和技巧,包括连接数据库、执行SQL语句、获取查询结果等。
第八章:Web开发实例通过前面的章节学习,读者已经具备了基本的PHP编程能力。
本章将通过一个实例来演示如何使用PHP进行Web开发,包括表单处理、会话管理、文件上传等常见功能。
第九章:性能优化与安全防护Web开发不仅要关注功能的实现,还需要考虑性能和安全问题。
本章将介绍PHP中常用的性能优化和安全防护技巧,例如缓存、代码优化、输入验证等。
#include "stdafx.h"#include "Websys.h"#include "WebsysDlg.h"#include <afxsock.h>#include <winsock.h>#include <string.h>#include <stdio.h>#include <stdlib.h>#include <io.h>#include<fcntl.h>#include<afxwin.h>#include<windows.h>#include<afxmt.h>#define Lnumber 5 //监听队列长度#define max1 1024#define max2 1024*1024#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif//全局变量unsigned long IP;//用于存储IP地址int port; //用于存储接口号char mainfile[128]; //用于存储主目录int Tnumber=0; //列表控件序号int tnumber; //每次开启服务器的进程数int stop; //服务器状态,0表示关闭状态,1表示开启状态CString mm_error;SOCKET Lsock; //监听socketCCriticalSection slock;//线程互斥信号//全局函数static UINT listen_sock(LPVOID n);//创建监听的sockstatic UINT get_sock(LPVOID n);//建立连接,进行报文和文件的传输class websock{public:CWebsysDlg *dlg1;};class saddr{public:SOCKET sockr;sockaddr_in *addr;};websock ws;//全局主窗口类型变量// 帮助对话框的类的定义及封装函数class CAboutDlg : public CDialog{public:CAboutDlg();// Dialog Data//{{AFX_DATA(CAboutDlg)enum { IDD = IDD_ABOUTBOX };//}}AFX_DATA// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CAboutDlg)protected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL// Implementationprotected://{{AFX_MSG(CAboutDlg)//}}AFX_MSGDECLARE_MESSAGE_MAP()};CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD){//{{AFX_DATA_INIT(CAboutDlg)//}}AFX_DATA_INIT}void CAboutDlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CAboutDlg)//}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)//{{AFX_MSG_MAP(CAboutDlg)// No message handlers//}}AFX_MSG_MAPEND_MESSAGE_MAP()// 主对话框类初构造函数CWebsysDlg::CWebsysDlg(CWnd* pParent /*=NULL*/): CDialog(CWebsysDlg::IDD, pParent){//{{AFX_DATA_INIT(CWebsysDlg)m_menu = _T("");m_port = _T("");//}}AFX_DATA_INIT// Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);}void CWebsysDlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CWebsysDlg)DDX_Control(pDX, IDC_EDIT_STATUS, m_status);DDX_Control(pDX, IDC_EDIT_ERROR, m_error);DDX_Control(pDX, IDC_LIST, m_listcrl);DDX_Control(pDX, IDC_EDIT_IP, m_edit_ip);DDX_Text(pDX, IDC_EDIT_MENU, m_menu);DDX_Text(pDX, IDC_EDIT_PORT, m_port);//}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CWebsysDlg, CDialog)//{{AFX_MSG_MAP(CWebsysDlg)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_COMMAND(ID_ABOUT, OnAbout)ON_COMMAND(ID_RUN, OnRun)ON_COMMAND(ID_CLOSE, OnClose)ON_COMMAND(ID_EXIT, OnExit)ON_BN_CLICKED(IDC_BUTTON_RUN, OnButtonRun)ON_BN_CLICKED(IDC_BUTTON_EXIT, OnButtonExit)ON_BN_CLICKED(IDC_BUTTON_CLOSE, OnButtonClose) ON_BN_CLICKED(IDC_SET_MENU, OnSetMenu)ON_WM_TIMER()//}}AFX_MSG_MAPEND_MESSAGE_MAP()// 主对话框初始化函数BOOL CWebsysDlg::OnInitDialog(){CDialog::OnInitDialog();// Add "About..." menu item to system menu.// IDM_ABOUTBOX must be in the system command range.ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != NULL){CString strAboutMenu;strAboutMenu.LoadString(IDS_ABOUTBOX);if (!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);}}// Set the icon for this dialog. The framework does this automatically// when the application's main window is not a dialogSetIcon(m_hIcon, TRUE); // Set big iconSetIcon(m_hIcon, FALSE); // Set small icon// TODO: Add extra initialization hereIP=inet_addr("96.103.20.222");//对ip进行初始换m_edit_ip.SetAddress(IP);//将初始换的IP地址在IP控件中显示出来m_port="5000";//初始化端口地址m_menu="E:/web";//初始化主目录//对列表控件进行初始化m_listcrl.SetExtendedStyle(LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT|LVS_EX_FLATSB);m_listcrl.InsertColumn(0,"序号",LVCFMT_CENTER,50);m_listcrl.InsertColumn(1,"IP",LVCFMT_CENTER,120);m_listcrl.InsertColumn(2,"端口号",LVCFMT_CENTER,70);m_listcrl.InsertColumn(3,"请求命令",LVCFMT_CENTER,180);m_listcrl.InsertColumn(4,"处理结果",LVCFMT_CENTER,80);m_listcrl.InsertColumn(5,"时间",LVCFMT_CENTER,80);UpdateData(false);//更新图形界面中的控件数据return TRUE; // return TRUE unless you set the focus to a control}//命令相应函数void CWebsysDlg::OnSysCommand(UINT nID, LPARAM lParam){if ((nID & 0xFFF0) == IDM_ABOUTBOX){CAboutDlg dlgAbout;dlgAbout.DoModal();}else{CDialog::OnSysCommand(nID, lParam);}}void CWebsysDlg::OnPaint(){if (IsIconic()){CPaintDC dc(this); // device context for paintingSendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);// Center icon in client rectangleint cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;// Draw the icondc.DrawIcon(x, y, m_hIcon);}else{CDialog::OnPaint();}}HCURSOR CWebsysDlg::OnQueryDragIcon(){return (HCURSOR) m_hIcon;}//帮助菜单相应函数void CWebsysDlg::OnAbout(){// TODO: Add your command handler code hereCAboutDlg dlgAbout;dlgAbout.DoModal();//弹出帮助对话框}//运行菜单相应函数void CWebsysDlg::OnRun(){int k;CString s;CTime time=CTime::GetCurrentTime();//获取本机时间s=time.Format("%I:%M %p");//将获取的时间转换为字符串格式this->m_status.SetWindowText("服务器已开启\r\n"+s);//显示服务器状态信息this->m_error.SetWindowText("\r\n");stop=0;CWinThread *pThread;pThread = AfxBeginThread(listen_sock,(LPVOID)this,0,0,0);//创建服务器监听线程//如果线程创建失败,返回错误提示if(pThread==NULL){k=GetLastError();s.Format("%d",k);s="服务器开启失败\r\n错误代码为:"+s;this->m_error.SetWindowText(s);}}//关闭服务器菜单相应函数void CWebsysDlg::OnClose(){// TODO: Add your command handler code herestop=1;CString s;s.Format("%d",tnumber);mm_error+="\r\n";mm_error+="总进程数:"+s;this->m_error.SetWindowText(mm_error);//显示相关信息提示closesocket(Lsock);CTime time=CTime::GetCurrentTime();//获取本机时间CString sTime=time.Format("%I:%M %p");this->m_status.SetWindowText("服务器已关闭\r\n"+sTime);//显示服务器状态信息}//退出菜单相应函数void CWebsysDlg::OnExit(){// TODO: Add your command handler code hereOnOK();}//运行按钮相应函数void CWebsysDlg::OnButtonRun(){// TODO: Add your control notification handler code hereOnRun();}//退出按钮相应函数void CWebsysDlg::OnButtonExit()// TODO: Add your control notification handler code hereOnExit();}//关闭服务器按钮相应函数void CWebsysDlg::OnButtonClose(){// TODO: Add your control notification handler code hereOnClose();}//设置IP、端口号、主目录按钮相应函数void CWebsysDlg::OnSetMenu(){// TODO: Add your control notification handler code hereUpdateData();CString IPS;BYTE p1,p2,p3,p4;m_edit_ip.GetAddress(p1,p2,p3,p4);//获取IP空间中的IP地址IPS.Format("%d.%d.%d.%d",p1,p2,p3,p4);//将IP地址装换为字符串类型IP=inet_addr(IPS);//将获取的IP地址赋给全局IP变量port=_ttoi(m_port);//将获取的端口号赋给全局port变量AfxMessageBox("主机IP、端口及主目录修改成功!");}//监听socket创建函数static UINT listen_sock(LPVOID n){CWebsysDlg *dlgthis;saddr sd;dlgthis=(CWebsysDlg*)n;//将传递过来的参数转换为主对话框类的类型变量WSADATA wsaData;SOCKET wsock; //接收socketsockaddr_in addr;sockaddr_in addr_c;int addr_len;int serror;CString vertion;tnumber=0;//用于记录创建的线程中暑ws.dlg1=dlgthis;mm_error.Empty(); //情况信息提示显示框中的数据int nRc = WSAStartup(0x0101, & wsaData);//对winsock进行初始换if(nRc){//Winsock 初始化错误mm_error+="Winsock 初始化错误";dlgthis->m_error.SetWindowText(mm_error);return 0;}if(wsaData.wVersion != 0x0101){//版本支持不够//报告错误给用户,清除Winsock,返回vertion.Format("%u",wsaData.wVersion);mm_error+=vertion;dlgthis->m_error.SetWindowText(mm_error);WSACleanup();return 0;}//记录winsock的版本信息vertion.Format("%d",wsaData.wVersion);mm_error+="Do WSAStarrup "+vertion;//创建监听sockLsock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);//判断socket是否创建成功,记录相关信息if(serror=WSAGetLastError()){mm_error+="\r\nsocket创建失败";dlgthis->m_error.SetWindowText(mm_error);closesocket(Lsock);return 0;}elsemm_error+="\r\nsocket创建成功";//获取主机IP、端口和主目录strcpy(mainfile,dlgthis->m_menu);memset(&addr,0,sizeof(addr));addr.sin_family=AF_INET;addr.sin_port=htons(port);addr.sin_addr.S_un.S_addr=IP;//将创建的socket和主机地址绑定bind(Lsock,(LPSOCKADDR)&addr,sizeof(addr));//获取错误代码serror=WSAGetLastError();vertion.Format("%d",serror);//根据错误代码对绑定是否成功进行判断,记录绑定信息if(serror){mm_error+="\r\nsocket绑定失败"+vertion;dlgthis->m_error.SetWindowText(mm_error);return 0;}elsemm_error+="\r\nsocket绑定成功";//将绑定的socket设置为监听的状态if(listen(Lsock,Lnumber)==SOCKET_ERROR){//监听状态设置失败,返回错误代码serror=WSAGetLastError();vertion.Format("%d",serror);mm_error+="\r\nsocket监听失败"+vertion;dlgthis->m_error.SetWindowText(mm_error);closesocket(Lsock);return 0;}elsemm_error+="\r\nsocket监听成功";addr_len=sizeof(addr_c);int k=0;while(1){//等待连接请求,如果有连接请求则新建一个socketwsock=accept(Lsock,(LPSOCKADDR)&addr_c,&addr_len);if(wsock==INVALID_SOCKET){//有连接请求,但创建失败serror=WSAGetLastError();vertion.Format("%d",serror);mm_error+="\r\nsocket连接失败"+vertion;closesocket(wsock);return 0;}//判断服务器是否关闭,关闭则跳出循环if(stop)break;Sleep(1000);sd.addr=&addr_c;sd.sockr=wsock;//针对每个连接请求创建线程,完成报文和文件数据的传输CWinThread *pThread;pThread = AfxBeginThread(get_sock,(LPVOID)&sd,0,0,0);if(pThread==NULL){//线程创建失败,返回错误代码k=GetLastError();break;}}vertion.Format("%d",k);mm_error+="\r\n";mm_error+="返回错误代码:"+vertion;closesocket(wsock);//关闭接收socketclosesocket(Lsock);//关闭监听socketWSACleanup( );//清楚winsock的初始化return 0;}static UINT get_sock(LPVOID n){char rbuf[max1];char *sbuf;char request[64];char filename[64];char httpvertion[16];FILE *fd;char *content;char statu[64];char code[16];int filesize=0;CString message;int serror;SOCKET Wsock;sockaddr_in *addr_c;saddr *sd;sd=(saddr*)n;Wsock=sd->sockr;addr_c=sd->addr;//接受请求报文if(recv(Wsock,rbuf,max1,0)==SOCKET_ERROR){//请求报文接受失败,返回错误代码serror=WSAGetLastError();message.Format("%d",serror);//AfxMessageBox("\r\nsocket数据接收失败"+message);return 0;}//获取请求命令行if(strlen(rbuf)){char *a=strtok(rbuf," ");strcpy(request,a);//获取请求命令a=strtok(NULL," ");strcpy(filename,a);//获取请求文件a=strtok(NULL,"\r");strcpy(httpvertion,a);//获取HTTP协议版本}sprintf(request,"%s %s %s",request,filename,httpvertion); char type[128];//判断请求文件类型if(!strncmp(strrev(filename),"gpj.",4))strcpy(type,"image/jpg\r\nAccept-Ranges:bytes");else if(!strncmp(filename,"oci.",4)){closesocket(Wsock);return 0;}elsestrcpy(type,"text/html");char filename1[128];strcpy(filename1,mainfile);strrev(filename);strcat(filename1,filename);content=new char[max2];//以二进制形式打开请求文件fd=fopen(filename1,"rb");if(fd==NULL){//打开失败,文件不错在或者已经损坏strcpy(statu,"Not Found");//设置响应报文状态字strcpy(content,"404 Not Found!\r\n找不到文件");//设置响应报文实体}else{//文件打开成功,读取文件内容存入申请的缓冲区filesize=fread(content,1,max2,fd);content[filesize]='\0';if(filesize<=0)//判断文件读取是否成功{strcpy(content,"Not Found");strcpy(statu,"Not Found");}strcpy(statu,"OK");fclose(fd);//关闭文件句柄}//设置响应报文状态编号if(!strcmp(statu,"OK"))strcpy(code,"200");elsestrcpy(code,"404");//响应报文初始状态行char s[128];sbuf=new char[max1+max2];//memset(sbuf,0,max2+max1);sprintf(s,"%s %s %s\r\n",httpvertion,code,statu); strcpy(sbuf,s);//响应报文首部strcat(sbuf,"Server:zhuang\r\n");sprintf(s,"%s %d\r\n","Content-Length:",filesize); strcat(sbuf,s);sprintf(s,"%s %s\r\n","Content-Type:",type); strcat(sbuf,s);//首部结束-空行strcat(sbuf,"\r\n");//实体主体int i,j;for(i=0,j=strlen(sbuf);i<filesize;i++,j++)sbuf[j]=content[i];sbuf[j]='\0';//发送报文if(send(Wsock,sbuf,max1+max2,0)==SOCKET_ERROR){serror=WSAGetLastError();message.Format("%d",serror);AfxMessageBox("\r\nsocket数据发送失败"+message);return 0;}//获取本机时间并转换为字符格式CTime time=CTime::GetCurrentTime();CString st=time.Format("%I:%M %p");//获取请求的IP,端口号,请求命令行CString mport,mip,s2,t;mport.Format("%hu",addr_c->sin_port);mip.Format("%d.%d.",addr_c->sin_addr.S_un.S_un_b.s_b1,addr_c->sin_addr.S_un.S_un_b.s_b2); s2.Format("%d.%d",addr_c->sin_addr.S_un.S_un_b.s_b3,addr_c->sin_addr.S_un.S_un_b.s_b4); mip+=s2;t.Format("%d",Tnumber+1);slock.Lock();//线程互斥信号//对图形界面,列表控件中显示的信息进行更新ws.dlg1->m_listcrl.InsertItem(Tnumber,t);//请求序号ws.dlg1->m_listcrl.SetItemText(Tnumber,1,mip);//请求ipws.dlg1->m_listcrl.SetItemText(Tnumber,2,mport);//请求端口号ws.dlg1->m_listcrl.SetItemText(Tnumber,3,request);//请求命令行ws.dlg1->m_listcrl.SetItemText(Tnumber,4,statu);//请求结果ws.dlg1->m_listcrl.SetItemText(Tnumber,5,st);//请求结果状态编号Tnumber++;tnumber++;slock.Unlock();//线程互斥资源解锁信号//关闭连接的socketclosesocket(Wsock);return 0;}。