博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
简易web服务器
阅读量:5030 次
发布时间:2019-06-12

本文共 3566 字,大约阅读时间需要 11 分钟。

 

当通过Socket开发网络应用程序的时候,首先需要考虑所使用的网络类型,主要包括以下三个方面:

    1)Socket类型,使用网络协议的类别,如IPv4的类型为PF_INET。

    2)数据通信的类型,常见的数据报(SOCK_DGRAM)、数据流(SOCK_STREAM)。

    3)使用的网络协议,比如:TCP协议。

      在同一个网络地址上,为了区分使用相同协议的不同应用程序,可以为不同的应用程序分配一个数字编号,这个编号称为网络端口号(port)。端口号是一个两字节的证书,取值范围从0~65535。IANA(Internet Assigned Number Authority,互联网地址分配机构)维护了一个端口分配列表,这些端口分三类,第一类的范围是0~1023,称为众所周知的端口,由IANA进行控制和分配,由特定的网络程序使用,例如,TCP协议使用80号端口来完成HTTP协议的传输。第二类的范围是1024~49151,称为登记端口,这些端口不由IANA控制,但是IANA委会了一个登记的列表,如果没有在IANA登记的话,也不应该在程序中使用。但是大多数的系统中,在没有冲突的情况下,也可以有用户程序使用。第三类的范围是49152~65535,称为动态或者似有端口号,这些端口可以由普通用户程序使用。

      对于一个网络应用程序来说,通过地址、协议和端口号可以唯一地确定网络上的一个应用程序。其中地址和端口的组合称为端点(EndPoint)。每个Socket需要绑定到一个端点上与其他端点进行通信。

      在.NET中,System.Net命名空间提供了网络编程的大多数数据类型以及常用操作,其中常用的类型如下:

    1)IPAddress类用来表示一个IP地址。

    2)IPEndPoint类用来表示一个IP地址和一个端口号的组合,称为网络的端点。

    3)System.Net.Sockets命名空间中提供了基于Socket编程的数据类型。

    4)Socket类封装了Socket的操作。

      常用的操作如下:

    1)Listen:设置基于连接通信的Socket进入坚挺状态,并设置等待队列的长度。

    2)Accept:等待一个新的连接,当新连接到达的时候,返回一个指针对新连接的Socket对象。通过新的Socket对象,可以与新连接通信。

    3)Receive:通过Socket接受字节数据,保存到一个字节数组中,返回实际接受的字节数。

    4)Send:通过Socket发送预先保存在字节数组中得数据。

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net;// using System.Net.Sockets;//   namespace 基于Socket的最简单Web服务器 {     class Program     {         static void Main(string[] args)         {             IPAddress address = IPAddress.Loopback;//取得本机的loopback网络地址,即127.0.0.1             IPEndPoint endPoint = new IPEndPoint(address, 49152);//创建可访问的端点,49152表示端口号,如果设置为0,表示使用一个空闲的端口号             Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//创建socket,使用IPv4地址,数据通信类型为字节流,TCP协议             socket.Bind(endPoint);//将socket绑定到一个端点上             socket.Listen(10);//设置连接队列的长度             Console.WriteLine("开始监听,端口号:{0}",endPoint.Port );             while (true)             {                 Socket client = socket.Accept();//开始监听,这个方法会阻塞线程的执行,直到接受到一个客户端的请求连接                 Console.WriteLine(client.RemoteEndPoint);//输出客户端的地址                 byte[] buffer = new byte[4096];//准备读取客户端请求的数据,读取的数据将保存在一个数组中                 int length = client.Receive(buffer, 4096, SocketFlags.None);//接受数据                 //将请求数据翻译为UTF-8                 System.Text.Encoding utf8 = System.Text.Encoding.UTF8;                 string requestString = utf8.GetString(buffer, 0, length);                 Console.WriteLine(requestString);//显示请求                 //回应的状态行                 string statusLine = "HTTP/1.1 200 OK\r\n";                 byte[] statusLineBytes = utf8.GetBytes(statusLine);                 //准备发送回客户端的网页                 string responseBody = "From Socket Server

Hello world.

"; byte[] responseBodyBytes = utf8.GetBytes(responseBody); //回应的头部 string responseHeader = string.Format("Content-Type:text/html;charset=UTF-8\r\nContent-Length:{0}\r\n",responseBody.Length ); byte[] responseHeaderBytes = utf8.GetBytes(responseHeader); //向客户端发送状态信息 client.Send(statusLineBytes); //向客户端发送回应头 client.Send(responseHeaderBytes); //头部与内容的分隔行 client.Send(new byte[]{
13,10}); //向客户端发送内容部分 client.Send(responseBodyBytes); //断开与客户端的连接 client.Close(); if (Console.KeyAvailable) break; } socket.Close(); } } }

 

posted on
2013-06-21 11:36 阅读(
...) 评论(
...)

转载于:https://www.cnblogs.com/spider024/p/3147928.html

你可能感兴趣的文章
UpdatePanel 内控件 更新“外的”控件【转】
查看>>
[CF508E] Arthur and Brackets
查看>>
[CF1029E] Tree with Small Distances
查看>>
tp5.0中及其常用方法的一些函数方法(自己看)和技巧(不断添加中)
查看>>
美团推荐算法实践
查看>>
Netty官方示例
查看>>
[数分提高]2014-2015-2第4教学周第2次课
查看>>
ansible进阶小技巧--tags
查看>>
JSP页面跳转方式
查看>>
发布高性能迷你React框架anu
查看>>
Python中Gradient Boosting Machine(GBM)调参方法详解
查看>>
利用DDE通信将PLC数据传输到EXCEL
查看>>
Eclipse 实用快捷键大全
查看>>
与非门和或门实现异或门
查看>>
golang统计出其中英文字母、空格、数字和其它字符的个数
查看>>
poj 1782 Run Length Encoding
查看>>
《自我介绍》
查看>>
在线考试系统设计思路
查看>>
p1150[noip2013普及]表达式求值
查看>>
POST和GET有什么区别?
查看>>