• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C#教程 > C#创建一个小型Web Server(Socket实现)

C#创建一个小型Web Server(Socket实现)

作者:千一网络 字体:[增加 减小] 来源:互联网 时间:2017-05-28

千一网络 通过本文主要向大家介绍了马桶c的个人空间,c语言,欲情 c max,维生素c,crh2c等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

要实现了Web Server,通过以下几句代码浏览器访问就可以获得访问的数据。

Socket socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socketWatch.Bind(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 81));
socketWatch.Listen(20); // 参数表示最多可容纳的等待接受的传入连接数,不包含已经建立连接的。

Thread thread = new Thread(delegate(object obj)
{
 Socket socketListen = (Socket)obj;
 while (true)
 {
  Socket socket = socketListen.Accept();
  byte[] data = new byte[1024 * 1024 * 4]; // 浏览器发来的数据,限定为 4K。
  int length = socket.Receive(data, 0, data.Length, SocketFlags.None);
  socket.Send(Encoding.UTF8.GetBytes("欢迎访问 www.cftea.com\r\n" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")));
  socket.Shutdown(SocketShutdown.Both);
  socket.Close();
 }
});

thread.IsBackground = true;
thread.Start(socketWatch);
</div>

但以上只是原理,实际会很复杂,不过就算我们要做简单的 Web Server,还是需要解决两个问题:

一、输出 HTTP 头

byte[] body = Encoding.UTF8.GetBytes("欢迎访问 www.cftea.com\r\n" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"));
byte[] head = Encoding.UTF8.GetBytes(@"HTTP/1.1 200 OK
Content-Length: " + body.Length + @"
Content-Type: text/plain
Date: " + string.Format("{0:R}", DateTime.Now) + @"
Server: Cftea Web Server

");
socket.Send(head);
socket.Send(body);
</div>

只要有特定的格式,就会被浏览器当作 HTTP 头对待。HTTP 头的格式为:

  • 第一行:HTTP/1.x + 空格 + 状态码 + 空格 + 描述
  • 中间行:名称 + 冒号 + 空格(也可以省略) + 值
  • 最后行:空行

格式一定要正确,否则影响浏览器对 HTTP 头和 HTTP 体的识别。

二、请求 HTTP 头

到目前为止,我们还不知道浏览器中输入的 URL 是什么呢。请求的 HTTP 头也是有特定格式的,我们只需要将其获取出来,进行拆解,就可以获取 URL 了。

拆解不是难事,我们说一说如何获取吧。前面的 data、length 不是一直没用么?如下:

string requestText = Encoding.UTF8.GetString(data, 0, length);
</div>

完整代码

Socket socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socketWatch.Bind(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 81));
socketWatch.Listen(20); // 参数表示最多可容纳的等待接受的传入连接数,不包含已经建立连接的。

Thread thread = new Thread(delegate(object obj)
{
 Socket socketListen = (Socket)obj;
 while (true)
 {
  using (Socket socket = socketListen.Accept())
  {
   byte[] data = new byte[1024 * 1024 * 4]; // 浏览器发来的数据
   int length = socket.Receive(data, 0, data.Length, SocketFlags.None);
   if (length > 0)
   {
    string requestText = Encoding.UTF8.GetString(data, 0, length);

    byte[] body = Encoding.UTF8.GetBytes(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"));
    byte[] head = Encoding.UTF8.GetBytes(@"HTTP/1.1 200 OK
Content-Length: " + body.Length + @"
Content-Type: text/plain
Date: " + string.Format("{0:R}", DateTime.Now) + @"
Server: Cftea Web Server

");
    socket.Send(head);
    socket.Send(body);
   }

   socket.Shutdown(SocketShutdown.Both);
   socket.Close();
  }
 }
});

thread.IsBackground = true;
thread.Start(socketWatch);
</div>

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • C#利用ReportViewer生成报表
  • C#基于正则去掉注释的方法示例
  • C#中new的用法及与override的区别分析
  • C#实现两个richtextbox控件滚动条同步滚动的简单方法
  • C# for循环的经典案例集锦
  • C#操作word的方法示例
  • C#使用WebClient登录网站并抓取登录后的网页信息实现方法
  • C# WinForm制作异形窗体与控件的方法
  • C#实现Excel表数据导入Sql Server数据库中的方法
  • C#使用NPOI上传excel

相关文章

  • 2017-05-28C#实现根据给出的相对地址获取网站绝对地址的方法
  • 2017-05-28C#中尾递归的使用、优化及编译器优化
  • 2017-05-28C# Winform 调用系统接口操作 INI 配置文件的代码
  • 2017-05-28C# 多线程读取注册表,加载至TreeView
  • 2017-05-28C# winform点击生成二维码实例代码
  • 2017-05-28c#中DateTime.Now函数的使用详解
  • 2017-05-28关于C# TabPage如何隐藏的问题
  • 2017-05-28C#数据结构之队列(Quene)实例详解
  • 2017-05-28C#实现Excel动态生成PivotTable
  • 2017-05-28基于switch你可能不知道的一些用法

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • C# SqlHelper应用开发学习
    • C#编程自学之数据类型和变量三
    • C#隐式/显示实现接口方法详解
    • 使用XmlSerializer序列化List对象成XML格式(list对象序列化)
    • C#编程自学之流程控制语句
    • C#推送信息到APNs的方法
    • C#实现GridView导出Excel实例代码
    • C#日期格式化的几个要点小结
    • C#实现两个时间相减的方法
    • c#线程同步使用详解示例

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有