Socket类为网络通信提供了一套丰富的方法和属性,它主要用于管理连接,实现Berkeley通信端套接字接口。同时,它还定义了绑定、连接网络端点及传输数据所需的各种方法,提供处理端点连接传输等细节所需要的功能。WebRequest、TcpClient和UdpClient等类在内部使用该类。
Socket类的常用属性及说明如表1所示.
表1 Socket类的常用属性及说明
属性 | 说明 |
AddressFamily | 获取Socket的地址族 |
Available | 获取已经从网络接收且可供读取的数据量 |
Connected | 获取一个值,该值指示Socket是在上次Send还是Receive操作时连接到远程主机 |
Handle | 获取Socket的操作系统句柄 |
LocalEndPoint | 获取本地终结点 |
ProtocolType | 获取Socket的协议类型 |
RemoteEndPoint | 获取远程终结点 |
SendTimeout | 获取或设置一个值,该值指定之后同步Send调用将超过的时间长度 |
Socket类的常用方法及说明如表2所示。
表2 Socket类的常用方法及说明
方法 | 说明 |
Accept | 为新建连接创建新的Socket |
BeginAccept | 开始一个异步操作来接受一个传入的连接尝试 |
BeginConnect | 开始一个对远程主机连接的异步请求 |
BeginDisconnect | 开始异步请求从远程终结点断开连接 |
BeginReceive | 开始从连接的Socket中异步接收数据 |
BeginSend | 将数据异步发送到连接的Socket |
BeginSendFile | 将文件异步发送到连接的Socket对象 |
BeginSendTo | 向特定远程主机异步发送数据 |
Close | 关闭Socket连接并释放所有关联的资源 |
Connect | 建立与远程主机的连接 |
Disconnect | 关闭套接字连接并允许重用套接字 |
EndAccept | 异步接受传入的连接尝试 |
EndConnect | 结束挂起的异步连接请求 |
EndDisconnect | 结束挂起的异步断开连接请求 |
EndReceive | 结束挂起的异步读取 |
EndSend | 结束挂起的异步发送 |
EndSendFile | 结束文件的挂起异步发送 |
EndSendTo | 结束挂起的、向指定位置进行的异步发送 |
Listen | 将Socket置于侦听状态 |
Receive | 接收来自绑定的Socket的数据 |
Send | 将数据发送到连接的Socket |
SendFile | 将文件和可选数据异步发送到连接的Socket |
SendTo | 将数据发送到特定终结点 |
Shutdown | 禁用某Socket上的发送和接收 |
说明
如果当前使用的是面向连接的协议(如TCP),则服务器可以使用Listen方法侦听连接。如果当前使用的是无连接协议(如UDP),则根本不需要侦听连接。调用ReceiveFrom方法可接受任何传入的数据报。使用SendTo方法可将数据报发送到远程主机。
下面演示Socket类的使用方法。
【例】新建一个Windows应用程序,在窗体中添加两个TextBox控件和一个Button控件。其中,两个TextBox控件分别用来输入要连接的主机及端口号;Button控件用来连接远程主机,并获得其上的主页面内容。
代码如下:
private static Socket ConnectSocket(string server, int port)
{
Socket socket = null; //实例化Socket对象,并初始化为空
IPHostEntry iphostentry = null; //实例化IPHostEntry对象,并初始化为空
iphostentry = Dns.GetHostEntry(server); //获得主机信息
//循环遍历得到的IP地址列表
foreach (IPAddress address in iphostentry.AddressList)
{
//使用指定的IP地址和端口号实例化IPEndPoint对象
IPEndPoint IPEPoint = new IPEndPoint(address, port);
//使用Socket的构造函数实例化一个Socket对象,以便用来连接远程主机
Socket newSocket = new Socket(IPEPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
newSocket.Connect(IPEPoint); //调用Connect方法连接远程主机
if (newSocket.Connected) //判断远程连接是否连接
{
socket = newSocket;
break;
}
else
{
continue;
}
}
return socket;
}
//获取指定服务器的主页面内容
private static string SocketSendReceive(string server, int port)
{
string request = "GET/HTTP/1.1\n主机:" + server + "\n连接:关闭\n";
Byte[] btSend = Encoding.ASCII.GetBytes(request);
Byte[] btReceived = new Byte[256];
//调用自定义方法ConnectSocket,使用指定的服务器名和端口号实例化一个Socket对象
Socket socket = ConnectSocket(server, port);
if (socket == null)
return ("连接失败!");
//将请求发送到连接的服务器
socket.Send(btSend, btSend.Length, 0);
int intContent = 0;
string strContent = server + "上的默认页面内容:\n";
do
{
//从绑定的Socket接收数据
intContent = socket.Receive(btReceived, btReceived.Length, 0);
//将接收到的数据转换为字符串类型
strContent += Encoding.ASCII.GetString(btReceived, 0, intContent);
}
while (intContent > 0);
return strContent;
}
private void button1_Click(object sender, EventArgs e)
{
string server = textBox1.Text; //指定主机名
int port = Convert.ToInt32(textBox2.Text); //指定端口号
//调用自定义方法SocketSendReceive获取指定主机的主页面内容
string strContent = SocketSendReceive(server, port);
MessageBox.Show(strContent);
}
程序的运行结果如图1和图2所示。
图1 Socket类的使用
图2 详细信息