实现 Berkeley 套接字接口。
public class Socket : IDisposable
Socket 类为网络通信而提供了丰富的方法和属性。Socket 类允许你使用 ProtocolType 枚举中被列出的任何通信协议来完成同步数据传送和异步数据传送。Socket 还遵循了 .NET Framework 的异步方法命名模式;例如,同步的 Receive 方法就对应于异步的 BeginReceive 和 EndReceive 方法。
如果你的应用程序在执行的期间只能够请求到一个线程,就可以使用下列方法,这些方法是为了同步操作模式而设计的。
如果要在执行的期间使用单独的线程来处理通信,就可以使用下列方法,这些方法是为了异步操作模式而设计的。
如果你在一个套接字上完成了多个异步操作,那么这些操作的完成顺序就不会与它们开始的时候完全一样。
在你完成发送和接收数据的时候,应该使用 Shutdown 方法来关闭 Socket。并且在调用 Shutdown 之后,调用 Close 方法来释放所有与该 Socket 相关的资源。
Socket 类允许你使用 SetSoekctOption 方法来配置你的 Socket。你还可以使用 GetSocketOption 方法来获取这些设定。
提示:如果你编写了一种相对简单的应用程序并且不需要考虑性能的最大化,就可以考虑使用 TcpClient、TcpListener,和 UdpClient。因为这些类为 Socket 的通信而提供了一种更加简单并且更加友好的接口。
Pocket PC 的 Windows Mobile、Smartphone 的 Windows Mobile,和 Windows CE Platform 的用户提示:并不是所有的设备操作系统都能够支持所有的套接字选项。
下列代码说明了 Socket 类如何才能够用来把数据发送到 HTTP 服务器并且接收回应。并且这个范例在整个页面被接收完毕之前都是被阻塞的。
using System; using System.Text; using System.IO; using System.Net; using System.Net.Sockets; public class GetSocket { private static Socket ConnectSocket(string server, int port) { Socket s = null; IPHostEntry hostEntry = null; // 获取与终端相关的信息。 hostEntry = Dns.GetHostEntry(server); // 通过 AddressList 的循环来获取被支持的 AddressFamily。 // 这样避免了在主机的 IPAddress 与地址家族(比如 IPv6)不兼容的时候会产生异常。 foreach(IPAddress address in hostEntry.AddressList) { IPEndPoint ipe = new IPEndPoint(address, port); Socket tempSocket = new Socket(ipe.AddressFamily, SocketType.Stream, ProtocolType.Tcp); tempSocket.Connect(ipe); if(tempSocket.Connected) { s = tempSocket; break; } else { continue; } } return s; } // 这个方法会请求指定服务器的主页内容。 private static string SocketSendReceive(string server, int port) { string request = "GET / HTTP/1.1\r\nHost: " + server + "\r\nConnection: Close\r\n\r\n"; Byte[] bytesSent = Encoding.ASCII.GetBytes(request); Byte[] bytesReceived = new Byte[256]; // 创建指定服务器和端口的套接字连接。 Socket s = ConnectSocket(server, port); if (s == null) return ("Connection failed"); // 发送请求到服务器。 s.Send(bytesSent, bytesSent.Length, 0); // 接收服务器的主页内容。 int bytes = 0; string page = "Default HTML page on " + server + ":\r\n"; // 下列代码直到页面被传送完毕之前都是被阻塞的。 do { bytes = s.Receive(bytesReceived, bytesReceived.Length, 0); page = page + Encoding.ASCII.GetString(bytesReceived, 0, bytes); } while (bytes > 0); return page; } public static void Main(string[] args) { string host; int port = 80; if (args.Length == 0) // 如果没有服务器名称被传递成该程序的参数, // 就使用当前主机名称来作为默认值。 host = Dns.GetHostName(); else host = args[0]; string result = SocketSendReceive(host, port); Console.WriteLine(result); } }
System.Object System.Net.Sockets.Socket