在.Net中,System.Net命名空间提供了网络编程的大多数据类型以及常用操作,其中常用的类型如下:
IPAddress类表示一个IP地址。
IPEndPoint类表示一个IP地址和一个端口好的组合。
System.Net.Socket命名空间中提供了基于Stocket编程的数据类型。
Socket类封装了Socket的操作。
常用操作如下:
Listen:设置连接队列的长度。
Accept:等待一个新的连接,当通讯到达时候,返回一个针对行连接的Stocket对象。
Receive:通过Stock接收直接数据,保存到一个字节数组中,返回实际接收的字节数。
Send:通过Stocket发送预先保留在字节数组中的数据。
示例代码:
static void Main(string[] args) { //获取本机的Loopback网络地址 IPAddress address = IPAddress.Loopback; //创建可访问的端点 IPEndPoint endPoint = new IPEndPoint(address, 9494); //创建Socket,使用IPv4地址,传输控制协议TCP,双向、可靠、基于连接的字节流 Socket socket = new Socket( AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //讲Socket绑定到端点上 socket.Bind(endPoint); //设置连接队列的长度 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 = "<html><head><title>From Socket Server</title></head><body><h1>Hello World</h1></body></html>"; 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(); }
运行后,在浏览器中输入http://localhost:9494/,这会出现如下图效果
在命令窗口可以看到路下图说输出效果
时间: 2024-10-08 12:24:04