一、Socket编程实现一个简单的Web服务器
Socket这个概念是在Unix系统中提出来的。在Unix的时代,为了解决传输层的编程问题,Unix提供了类似于文件操作的网络操作方式——Socket,通过Socket,我们就可以像操作文件一样通过打开、写入、读取、关闭等操作完成网络编程,这样就使得网络编程可以统一到文件操作方面,这样就使我们更容易地编写网络应用程序。需要注意的是,应用层的协议需要网络程序专门处理,Socket不负责应用层协议,仅仅负责传输层的协议。
现在介绍下网络端口号(port)的概念,在同一个网络地址中,为了区分使用相同协议的不同应用程序,为不同的应用程序分配一个数字编号,我们把这个编号就成为网络端口号(就是区分同一个网络地址中不同的进程)。端口号是由一个两个字节的整数,所以取值范围为0~65535,这些端口号又分为三类:
1.第一类的范围是0~1023,称为众所周知的端口,这些端口号由特定的网络程序使用,例如,TCP协议使用80端口来完成Http协议的传输。
2.第二类的范围是1024~49151,称为登记端口,一般情况下不应该在程序中使用。
3.第三类的范围是49152~65535,称为私有端口, 这些端口可以由普通用户程序使用。
在我们用Socket开发网络应用程序中,还有一个就是端点的概念,在网络中,通过IP地址,协议和端口号可以唯一地确定网络上的一个应用程序,其中把IP地址和端口的组合叫做端点(EndPoint)。每个Socket需要绑定到一个端点上与其他端点进行通信。
介绍完基本的一些概念后,下面演示通过Socket编程实现一个简单的Web服务器,此实例中就是简单向浏览器返回一个固定的静态页面,实现代码如下:
- usingSystem;
-
usingSystem.Net;
-
usingSystem.Net.Sockets;
-
usingSystem.Text;
-
namespaceWebServer
- {
-
-
-
-
-
classProgram
- {
-
staticvoidMain(string[]args)
- {
-
- IPAddresslocaladdress=IPAddress.Loopback;
-
-
-
IPEndPointendpoint=newIPEndPoint(localaddress,49155);
-
-
Socketsocket=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
-
-
- socket.Bind(endpoint);
-
- socket.Listen(10);
-
while(true)
- {
-
Console.WriteLine("WaitanconnectRequest...");
-
- Socketclientsocket=socket.Accept();
-
-
-
Console.WriteLine("ClientAddressis:{0}",clientsocket.RemoteEndPoint);
-
-
byte[]buffer=newbyte[2048];
-
intreceivelength=clientsocket.Receive(buffer,2048,SocketFlags.None);
-
stringrequeststring=Encoding.UTF8.GetString(buffer,0,receivelength);
-
-
- Console.WriteLine(requeststring);
-
-
-
stringstatusLine="HTTP/1.1200OK\r\n";
-
byte[]responseStatusLineBytes=Encoding.UTF8.GetBytes(statusLine);
-
stringresponseBody="<html><head><title>DefaultPage</title></head><body><pstyle='font:bold;font-size:24pt'>Welcomeyou</p></body></html>";
-
stringresponseHeader=
-
string.Format(
-
"Content-Type:text/html;charset=UTf-8\r\nContent-Length:{0}\r\n",responseBody.Length);
-
byte[]responseHeaderBytes=Encoding.UTF8.GetBytes(responseHeader);
-
byte[]responseBodyBytes=Encoding.UTF8.GetBytes(responseBody);
-
- clientsocket.Send(responseStatusLineBytes);
-
- clientsocket.Send(responseHeaderBytes);
-
-
clientsocket.Send(newbyte[]{13,10});
-
- clientsocket.Send(responseBodyBytes);
-
- clientsocket.Close();
-
Console.ReadKey();break;
- }
-
- socket.Close();
- }
- }
- }
运行结果:
首先运行服务端后的界面:
在浏览器中输入http://localhost:49155/则浏览器可以看到如下的所示的结果:
此时在服务器端显示的输出为:
这里只是简单实现了一个web服务器的功能,当然实际的Web服务器通过用户的发来的Http请求中获得请求文件类型,请求文件名以及请求目录等信息,然后Web服务器根据这些请求信息从服务器的物理目录中寻找请求的文件,如果在服务器中找到请求的文件,然后服务器把响应内容发送给客户端。这里只是通过这个简单的Web服务器让大家理解请求/响应模型以及Web服务器的工作原理,一些复杂的Web服务器也是在此基础进行一些其他功能的扩展。
二、基于TcpListener的Web服务器
在.net平台下, 为了简化网络编程,.net对套接字又进行了一次封装,封装后的类是在System.Net.Sockets命名空间下的TcpListener类和TcpClient类,使用TcpListener类用来监听和接收传入的连接请求,在该类的构造函数中只需要传递一组网络端点信息就可以准备好监听参数,而不需要设置使用的网络协议等细节,调用Start方法后,监听工作就开始(间接调用了Socket.Listen方法),AcceptTcpClient方法将阻塞进程,直到一个客户端发来连接请求为止,这个方法返回一个
封装了Socket的TcpClient对象,同时从传入的连接队列中删除该客户端的连接请求。此时通过这个TcpClient对象与客户端进行通信。
下面是基于TcpListener和TcpClient的一个简单的Web服务器的代码:
- usingSystem;
-
usingSystem.Net;
-
usingSystem.Net.Sockets;
-
usingSystem.Text;
-
namespaceTcpWebserver
- {
-
classProgram
- {
-
staticvoidMain(string[]args)
- {
-
- IPAddresslocaladdress=IPAddress.Loopback;
-
-
IPEndPointendpoint=newIPEndPoint(localaddress,49155);
-
-
TcpListenertcpListener=newTcpListener(endpoint);
-
- tcpListener.Start();
-
Console.WriteLine("WaitanconnectRequest...");
-
while(true)
- {
-
- TcpClientclient=tcpListener.AcceptTcpClient();
-
if(client.Connected==true)
- {
-
-
Console.WriteLine("Createdconnection");
- }
-
-
-
-
- NetworkStreamnetstream=client.GetStream();
-
-
byte[]buffer=newbyte[2048];
-
intreceivelength=netstream.Read(buffer,0,2048);
-
stringrequeststring=Encoding.UTF8.GetString(buffer,0,receivelength);
-
- Console.WriteLine(requeststring);
-
-
-
stringstatusLine="HTTP/1.1200OK\r\n";
-
byte[]responseStatusLineBytes=Encoding.UTF8.GetBytes(statusLine);
-
stringresponseBody="<html><head><title>DefaultPage</title></head><body><pstyle='font:bold;font-size:24pt'>Welcomeyou</p></body></html>";
-
stringresponseHeader=
-
string.Format(
-
"Content-Type:text/html;charset=UTf-8\r\nContent-Length:{0}\r\n",responseBody.Length);
-
byte[]responseHeaderBytes=Encoding.UTF8.GetBytes(responseHeader);
-
byte[]responseBodyBytes=Encoding.UTF8.GetBytes(responseBody);
-
-
- netstream.Write(responseStatusLineBytes,0,responseStatusLineBytes.Length);
-
- netstream.Write(responseHeaderBytes,0,responseHeaderBytes.Length);
-
-
netstream.Write(newbyte[]{13,10},0,2);
-
- netstream.Write(responseBodyBytes,0,responseBodyBytes.Length);
-
- client.Close();
- Console.ReadKey();
-
break;
- }
-
- tcpListener.Stop();
- }
- }
- }
程序的输出结果和前面的用Socket实现的效果相同,这里就不再贴图了,这里实现的Web服务器都是建立控制台的应用程序来实现的,感兴趣的朋友也可以用Windows窗体进行实现,同时这里也只是简单列出了采用同步的方式进行实现的,同时TcpListener类和TcpClient类同时支持异步操作的方法,下面列出这个两个类中异步操作的方法如下表:
分享到:
相关推荐
自定义web服务器目录结构参考tomcat的目录结果,其中可以设置端口号,项目可以部署在webapps目录下,开始页参考iis。通过该程序对于服务器技术、http协议及浏览器原理的理解都会有帮助。
完整版Java web开发教程PPT课件 Java开发进阶教程 第04章 自定义web服务器(共14页).pptx 完整版Java web开发教程PPT课件 Java开发进阶教程 第06章 SERVLET(共15页).pptx 完整版Java web开发教程PPT课件 Java开发...
课程报告web服务器的安装介绍,适合课程设计
主要介绍了ASP.NET自定义Web服务器控件之Button控件,详细讲述了Button控件的实现代码、前台页面的调用以及对应的事件响应代码,具有很好的参考借鉴价值,需要的朋友可以参考下
这是《计算机网络》的课程设计--多线程的Web服务器(带有课程设计报告),里面为Eclipse3.5的工程。支持HTTP1.1(但是不完善),支持多线程(采用的线程池),支持简单CGI(仅PHP的CGI模块通过测试),支持配置文件...
nginx不仅可以隐藏版本信息,还支持自定义web服务器信息 先看看最终的隐藏结果吧 具体怎么实现呢,其实也很简单,请往下看 1 官网下载最新稳定版 wget http://nginx.org/download/nginx-1.14.1.tar.gz 2 解压 tar...
Web服务器,实现自定义的Web服务器(C#)
2、可以自定义WEB服务器端口。 3、可以自定义默认服务器主目录。 4、可以定义默认网页 5、兼容ASP和HTML。 6、速度比IIS快,程序比IIS小。产且无需安装任何附加程序,就一个EXE文件。 主要功能:建立WEB服务器 ...
完整版Java web开发教程PPT课件 Java开发进阶教程 第04章 自定义web服务器(共14页).pptx 完整版Java web开发教程PPT课件 Java开发进阶教程 第06章 SERVLET(共15页).pptx 完整版Java web开发教程PPT课件 Java开发...
完整版Java web开发教程PPT课件 Java开发进阶教程 第04章 自定义web服务器(共14页).pptx 完整版Java web开发教程PPT课件 Java开发进阶教程 第06章 SERVLET(共15页).pptx 完整版Java web开发教程PPT课件 Java开发...
完整版Java web开发教程PPT课件 Java开发进阶教程 第04章 自定义web服务器(共14页).pptx 完整版Java web开发教程PPT课件 Java开发进阶教程 第06章 SERVLET(共15页).pptx 完整版Java web开发教程PPT课件 Java开发...
可脚本化/可自定义的Web服务器,用于使用OAuth2 / OpenID Connect或依赖于运行中的OAuth2服务器的应用程序测试HTTP客户端(即,要求已知发行者签名JWT的API)。 服务器还提供用于令牌验证的必要端点(JWKS的端点)和...
是一个使用Node.js和React轻松创建Web应用程序的框架。 它提供了用于样式,路由,处理服务器端处理等的内置解决方案。 对于复杂的网站,您通常希望将其与(通常使用编写)一起使用。 Next-Express是一个很小的库,这...
完整版Java web开发教程PPT课件 Java开发进阶教程 第04章 自定义web服务器(共14页).pptx 完整版Java web开发教程PPT课件 Java开发进阶教程 第06章 SERVLET(共15页).pptx 完整版Java web开发教程PPT课件 Java开发...
完整版Java web开发教程PPT课件 Java开发进阶教程 第04章 自定义web服务器(共14页).pptx 完整版Java web开发教程PPT课件 Java开发进阶教程 第06章 SERVLET(共15页).pptx 完整版Java web开发教程PPT课件 Java开发...
完整版Java web开发教程PPT课件 Java开发进阶教程 第04章 自定义web服务器(共14页).pptx 完整版Java web开发教程PPT课件 Java开发进阶教程 第06章 SERVLET(共15页).pptx 完整版Java web开发教程PPT课件 Java开发...
完整版Java web开发教程PPT课件 Java开发进阶教程 第04章 自定义web服务器(共14页).pptx 完整版Java web开发教程PPT课件 Java开发进阶教程 第06章 SERVLET(共15页).pptx 完整版Java web开发教程PPT课件 Java开发...
完整版Java web开发教程PPT课件 Java开发进阶教程 第04章 自定义web服务器(共14页).pptx 完整版Java web开发教程PPT课件 Java开发进阶教程 第06章 SERVLET(共15页).pptx 完整版Java web开发教程PPT课件 Java开发...
完整版Java web开发教程PPT课件 Java开发进阶教程 第04章 自定义web服务器(共14页).pptx 完整版Java web开发教程PPT课件 Java开发进阶教程 第06章 SERVLET(共15页).pptx 完整版Java web开发教程PPT课件 Java开发...