网络知识 - 简易的自定义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服务器,我们平常浏览网页通过在浏览器中输入一个网址就可以看到 ...
随机推荐
- php常用数组array函数实例总结【赋值,拆分,合并,计算,添加,删除,查询,判断,排序】
本文实例总结了php常用数组array函数.分享给大家供大家参考,具体如下: array_combine 功能:用一个数组的值作为新数组的键名,另一个数组的值作为新数组的值 案例: <?php ...
- sub2ind函数
sub2ind函数是MATLAB中对矩阵索引号检索的函数,用法如下: >> A=rand(5) A = 0.6850 0.0867 0.2290 0.1006 0. ...
- 判断语句之if..else if...else
判断语句之if..else if...else if语句第三种格式:if..else if...else 格式: 执行流程 首先判断关系表达式1看其结果是true还是false 如果是true就执行语 ...
- Binary Search(Java)(递归)
public static int rank(int[] array, int k, int front, int rear) { if(front > rear) return -1; int ...
- es6可变参数-扩展运算符
es5中参数不确定个数的情况下: //求参数和 function f(){ var a = Array.prototype.slice.call(arguments); var sum = 0; a. ...
- Routing 为 Magento 2 一个重要的部分,本文介绍基本应用
Routing 为 Magento 2 一个重要的部分,本文介绍基本应用 Magento 2请求的流程 在Magento 2中,请求URL将如下所示: http://example.com/index ...
- 平衡树splay学习笔记#1
这一篇博客只讲splay的前一部分的操作(rotate和splay),后面的一段博客咕咕一段时间 后一半的博客地址:[传送门] 前言骚话 为了学lct我也是拼了,看了十几篇博客,学了将近有一周,才A掉 ...
- 初识 go 语言
目录 go简介 安装 hello world 函数 变量 常量 可见性规则 结束 前言: 最近组内要试水区块链,初步方案定为使用fabirc来弄,而fabric的智能合约就是用go写的,借此机会正好学 ...
- BZOJ 1671: [Usaco2005 Dec]Knights of Ni 骑士 (bfs)
题目: https://www.lydsy.com/JudgeOnline/problem.php?id=1671 题解: 按题意分别从贝茜和骑士bfs然后meet_in_middle.. 把一个逗号 ...
- Codeforces 1037C Equalize
原题 题目大意: 给你两个长度都为\(n\)的的\(01\)串\(a,b\),现在你可以对\(a\)串进行如下两种操作: 1.交换位置\(i\)和位置\(j\),代价为\(|i-j|\) 2.反转位置 ...