网络知识 - 简易的自定义Web服务器
简易的自定义Web服务器
基于浏览器向服务端发起请求
两台主机各自的进程之间相互通信,需要协议、IP地址和端口号,IP表示了主机的网络地址,而端口号则表示了主机上的某个进程的地址,IP加Port统称为端点(EndPoint),在网络编程的世界里,.NET提供了Socket(套接字)类,此类处于传输层之中,Socket使开发人员可以以编程的方式侦听远程主机向本机发送的数据,并对到达传输层的数据包做出处理,同时它还可以向远程发送数据包。也即,Socket用于处理传输的数据。
);];, , len );, };
clientSocket.Send( HttpDataLineByte );
clientSocket.Send( HttpHeaderByte );
clientSocket.Send( HttpNullLineByte );
clientSocket.Send( HttpBodyByte );
//断开连接
clientSocket.Close( );
}
}
}
}
在浏览器输入端点进行访问,因为浏览器实已经实现了Http协议,浏览器处于应用层,封装好请求后会往下传递给传输层,封装TCP端口再传递给网络层直到请求发送至服务端,所以可以直接看到服务端返回的结果:
TcpListener封装了Socket,所以也可以使用TcpListener来监听请求
}
//断开连接
clientTcp.Close( );
}
}
}
}
基于windows窗体实现双方发送即时通信
分别创建两个windows窗体项目,命名为TCPServer和TCPClient。两个项目的窗体控件的名称是一样的,如下:
服务端通过TcpListener开启监听,然后通过开启新的线程并使用TcpListener的AcceptTcpClient方法去监听客户端的请求,而客户端则开启新线程并通过TcpClient发起远程连接请求。这样双方就可以建立一个连接。接着,服务端的AcceptTcpClient方法会阻塞线程直到接受到一个请求为止,此时它会返回一个NetworkStream实例,此类提供了读取远程数据、发送数据的方法,此后,双方的互动都是通过这个唯一的NetworkStream实例的方法(Read、Write)来完成,发送数据和接收数据时都使用新线程来处理,并且应将发送数据和接收数据的逻辑都放入try块,这样一旦互动过程出现异常则可以关闭当前的Tcp连接、清空NetworkStream资源,然后服务端重新开启新线程继续监听客户端的连接请求,而客户端则重新发送远程连接的请求即可。
服务端源码
using System.Net;
using System.Net.Sockets;
using System.IO;
);
); //模拟发送延时
writer.Flush( );
statusStrip.Invoke( showStatusMessage, "消息发送成功……" );
ShowMessageBox.Invoke( showGetOrSendMessage, senMsg );//在创建"公共消息框控件"的线程上调用showGetOrSendMessage委托来显示消息
}
catch
{
//如果出现异常则需要关闭现有连接,清除所有资源后重新开始
statusStrip.Invoke( showStatusMessage, "消息发送失败……" );
if (client != null) client.Close( );
if (reader != null) reader.Close( );
if (writer != null) writer.Close( );
//重新开启新线程来接收请求
Thread thread = new Thread( Request );
thread.Start( );
}
} );
proxyThread.Start( );
}
//关闭监听
private void CloseTcpListen_Click( object sender, EventArgs e )
{
if (client != null) client.Close( );
if (reader != null) reader.Close( );
if (writer != null) writer.Close( );
lister.Stop( );
statusStrip.Invoke( showStatusMessage, "监听已经关闭……" );
}
//断开连接
private void NoConnect_Click( object sender, EventArgs e )
{
if (client != null) client.Close( );
if (reader != null) reader.Close( );
if (writer != null) writer.Close( );
statusStrip.Invoke( showStatusMessage, "连接已断开……" );
}
//清空消息
private void ClearMessage_Click( object sender, EventArgs e )
{
ShowMessageBox.Clear( );
}
//点击关闭窗口按钮时,关闭TCP侦听,否则它会一直开启
private void Server_FormClosing( object sender, FormClosingEventArgs e )
{
lister.Stop( );
}
}
}
客户端源码
ShowMessageBox.Invoke( showGetOrSendMessage, sendMsg );
statusStrip.Invoke( showStatusMessage, "消息发送成功……" );
}
catch
{
//如果出现异常则关闭现有连接,清除所有资源
statusStrip.Invoke( showStatusMessage, "消息发送失败……" );
if (server != null) server.Close( );
if (reader != null) reader.Close( );
if (writer != null) writer.Close( );
statusStrip.Invoke( showStatusMessage, "连接已经断开,请重新点击'连接服务器'按钮……" );
}
} );
proxyThread.Start( );
}
//断开连接
private void NoConnect_Click( object sender, EventArgs e )
{
if (server != null) server.Close( );
if (reader != null) reader.Close( );
if (writer != null) writer.Close( );
statusStrip.Invoke( showStatusMessage, "连接已断开……" );
}
//清空消息
private void ClearMessage_Click( object sender, EventArgs e )
{
ShowMessageBox.Clear( );
}
//关闭窗口
private void CloseWin_Click( object sender, EventArgs e )
{
this.Close( );
}
}
}
参考资料
msdn:基于TCP协议的简单通信程序
网络知识 - 简易的自定义Web服务器的更多相关文章
- C# 编写简易 ASP.NET Web 服务器
C# 编写简易 ASP.NET Web 服务器 你是否有过这样的需求——想运行 ASP.NET 程序,又不想安装 IIS 或者 Visual Studio?我想如果你经常编写 ASP.NET 程序的话 ...
- atitit.跨架构 bs cs解决方案. 自定义web服务器的实现方案 java .net jetty HttpListener
atitit.跨架构 bs cs解决方案. 自定义web服务器的实现方案 java .net jetty HttpListener 1. 自定义web服务器的实现方案,基于原始socket vs ...
- 自定义web服务器(四)
关于HTTP协议的具体内容,前面章节已经有所讲解,相信读者已有所了解,在此不在累述,本章节讲解自定义web服务器. 一,.net提供自定义Web服务器的类 以下只是写主要的类 1.HTTPListe ...
- [C# 网络编程系列]专题三:自定义Web服务器
转自:http://www.cnblogs.com/zhili/archive/2012/08/23/2652460.html 前言: 经过前面的专题中对网络层协议和HTTP协议的简单介绍相信大家对网 ...
- 使用 C# 编写简易 ASP.NET Web 服务器
原文 http://www.cnblogs.com/lcomplete/p/use-csharp-write-aspnet-web-server.html 如果你想获得更好的阅读体验,可以前往我在 g ...
- 转:【专题三】自定义Web服务器
前言: 经过前面的专题中对网络层协议和HTTP协议的简单介绍相信大家对网络中的协议有了大致的了解的, 本专题将针对HTTP协议定义一个Web服务器,我们平常浏览网页通过在浏览器中输入一个网址就可以看到 ...
- 使用 C# 编写简易 ASP.NET Web 服务器 ---- 模拟IIS的处理过程
如果你想获得更好的阅读体验,可以前往我在 github 上的博客进行阅读,http://lcomplete.github.io/blog/2013/07/16/use-csharp-write-asp ...
- Servlet学习笔记【1】--- 背景和基础知识(CGI、Web服务器发展史、Servlet简介、任务、继承结构)
本文主要讲Servlet的基础知识和背景知识. 1 CGI简介 CGI(Common Gateway Interface 公共网关接口)是WWW技术中最重要的技术之一,有着不可替代的重要地位.CGI是 ...
- 专题三:自定义Web服务器
前言: 经过前面的专题中对网络层协议和HTTP协议的简单介绍相信大家对网络中的协议有了大致的了解的, 本专题将针对HTTP协议定义一个Web服务器,我们平常浏览网页通过在浏览器中输入一个网址就可以看到 ...
随机推荐
- Python排序算法——冒泡排序
有趣的事,Python永远不会缺席! 如需转发,请注明出处:小婷儿的python https://www.cnblogs.com/xxtalhr/p/10786904.html 一.冒泡排序(Bubb ...
- Linux内存管理 (9)mmap(补充)
之前写过一篇简单的介绍mmap()/munmap()的文章<Linux内存管理 (9)mmap>,比较单薄,这里详细的梳理一下. 从常用的使用者角度介绍两个函数的使用:然后重点是分析内核的 ...
- Golang 入门 : 字符串
在 Golang 中,字符串是一种基本类型,这一点和 C 语言不同.C 语言没有原生的字符串类型,而是使用字符数组来表示字符串,并以字符指针来传递字符串.Golang 中的字符串是一个不可改变的 UT ...
- vue webpack打包
webpack构建流程 从启动webpack构建到输出结果经历了一系列过程,它们是: 解析webpack配置参数,合并从shell传入和webpack.config.js文件里配置的参数,生产最后的配 ...
- go语言之行--golang操作redis、mysql大全
一.redis 简介 redis(REmote DIctionary Server)是一个由Salvatore Sanfilippo写key-value存储系统,它由C语言编写.遵守BSD协议.支持网 ...
- Flask —— 信号(5)
Flask框架中的信号基于blinker,其主要就是让开发者可是在flask请求过程中定制一些用户行为. pip3 install blinker 1. 内置信号 request_started = ...
- Kafka-python 客户端导致的 cpu 使用过高,且无法消费消息的问题
今天遇到一个情况使用了 Kafka-python 1.3.3 来操作读取 broker 1.0.1 版本的 kafka.出现了 rebalance 之后分配到了客户端,但是 cpu 利用率很高且无法消 ...
- ABP中的拦截器之EntityHistoryInterceptor
今天我们接着之前的系列接着来写另外一种拦截器EntityHistoryInterceptor,这个拦截器到底是做什么的呢?这个从字面上理解是实体历史?这个到底是什么意思?带着这个问题我们来一步步去分析 ...
- Jekins相关笔记
Jekins忘记密码操作 https://blog.csdn.net/intelrain/article/details/78749635 Jekins重启 https://www.cnblogs.c ...
- 使用@property
@property装饰器就是负责把一个方法变成属性调用的,既能检查参数,又可以用类似属性这样简单的方式来访问类的变量 class Student(object): @property def scor ...