您的位置:首页 > 其它

讲解最简单的Web服务器事例知识分享

2012-07-03 08:55 218 查看
本案例中应用到得一些类和方法先一一列出来

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

1.1 IPAddress.Parse("192.168.43.104") 将一串ip地址字符串转换为IP地址

1.2 IPAddress.Loopback 获得本机回环地址 即:127.0.0.1

2.IPEndPoint类(端点) 说白了就是ip地址和端口的组合(IP:Point) 他能唯一确定网络中的一台电脑的某一个应用程序

IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse("192.168.43.104"), 8080); //创建了一个ip地址为192.168.43.104端口号位8080的网络端点

2.1.1 Address 获取或设置终结点的 IP 地址 ex:endPoint.Address //192.168.43.104

2.1.2 AddressFamily 获得网络协议 ex:endPoint.AddressFamily //http

2.1.3 AddressPoint 获得端口号信息 ex:endPoint.Point //8080

3.Socket类 位于System.Net.Socket命名空间中 其封装了Socket(套接字)的操作。

3.1 Listen 设置基于连接通信的socket进入监听状态,并设置等待队列的长度。 ex:socket.Listen(10) //只允许10个客户端同时发生请求

3.2 Accept 等待一个新的连接,当新的连接到达的时候,返回一个针对新连接的Socket对象。即每个建立连接的客户端都对应有一个Socket对象在服务器端,客户端通过这个对象就可以和服务端进行连接通信了。 ex: Socket client = socket.Accept();

3.3 Receive 通过Socket接受字节数据,保存到一个字节数据中,返回一个int型的数据(实际接收的字节数)。

ex://新建一个缓冲区

byte[] buffer = new byte[2048];

//接受数据

int length = client.Receive(buffer,buffer.Length,SocketFlags.None);

更多http://www.cnblogs.com/poilsinai/

3.4 Send 故名思议 就是发送数据吧 没错 send通过Socket发送预先保存在字节数组中的数据。

下面是完整的事例代码:

//----------------------------------------------------------------------------------------

IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse("192.168.43.104"), 8080);

//创建socket,使用ipv4地址,传输协议为tcp,双向、可靠、基于连接的字节流

Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

//将其绑定到一个端点上

socket.Bind(endPoint);

//设置连接队列的长度

socket.Listen(10);

Console.WriteLine("开始监听,端口号:{0}",endPoint.Port);

while (true)

{

//开始监听。这个方法阻塞线程执行,直到接受到一个客户端的连接请求

Socket client = socket.Accept();

//输出客户端地址

Console.WriteLine("客户端地址:{0}",client.RemoteEndPoint);

//新建一个缓冲区

byte[] buffer = new byte[2048];

//接受数据

int length = client.Receive(buffer,buffer.Length,SocketFlags.None);

//将请求的数据转换为utf-8

//Encoding utf8 = Encoding.UTF8;

string requestString = Encoding.UTF8.GetString(buffer, 0, length);

//显示请求的消息

Console.WriteLine(requestString);

//回应的状态行

string statusLine = "HTTP/1.1 200 OK\r\n";

byte[] statusLineBytes = Encoding.UTF8.GetBytes(statusLine);

//准备发送到客户端的网页

string responseBody = "<html><head><title>hello world</title></head><body><h2>Hello World</h2></body></html>";

byte[] responseBodyBytes = Encoding.UTF8.GetBytes(responseBody);

//回应的头部

string responseHeader = string.Format("Content-type:text/html;charset=UTF-8\r\nContent-Length:{0}\r\n", responseBody.Length);

byte[] responseHeaderBytes = Encoding.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();

因为http协议是无状态连接,所以每完成一次或多次请求服务器会自动与客户端断开连接,保持服务器的资源
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: