1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > C#成魔之路14 网络编程技术(2 )System.Net.Sockets命名空间

C#成魔之路14 网络编程技术(2 )System.Net.Sockets命名空间

时间:2021-10-07 02:47:00

相关推荐

C#成魔之路14 网络编程技术(2 )System.Net.Sockets命名空间

.Sockets命名空间主要是提供制作Sockets网络应用程序的相关类,其中Socket类,TcpClient类、TcpListener类、UdpClient类较为常用,下面对其进行介绍

1、Socket类

Socket类为网络通信提供了一套丰富的方法和属性,主要用于管理连接,实现Berkelery通信段套接字接口,同时,还定义了绑定、连接网络端点以及传输数据所需的各种方法,并且提供处理断点连接传输等细节所需要的功能。Socket类通常属性如下:

Socket

AddressFamily:获取Socket的地址族。

Connected:获取一个值,这个值指示Socket是在上次Send还是Receive操作时连接到远程主机。

Handle:获取Socket的操作系统句柄。

LocalEndPoint:获取本地终结点。

ProtocolType:获取Socket的协议类型。

RemoteEndPoint:获取远程终结点。

SendTimeout:获取或设置一个值,该值指定之后同步Send调用将超时的时间长度。

Socket 类的常用方法:

Accept:为新建连接创建新的Socket。

Close:关闭Socket连接并且释放关联的资源。

Connect:建立和远程主机的连接。

Disconnect:关闭套接字连接并允许重用套接字。

Listen:将Socket置于侦听状态。

Receive:接受来自绑定的Socket数据。

Send:将数据发送到连接的Socket。

SendTo:将数据发送到特定终结点。

Shutdown:禁用某Socket上的发送和接受。

注意:如果现在使用的是面向连接的协议(如TCP),则服务器可以使用Listen方法侦听连接;如果当前使用的是无连接协议(UDP),则根本不需要侦听连接。

示例程序:

public partial class Form1 : Form{public Form1(){InitializeComponent();}private static Socket ConnectSocket(string strServer,int intPort){Socket s = null;//实例化对象IPHostEntry iph = null;//实例化对象iph = Dns.GetHostEntry(strServer);//获得主机信息foreach (IPAddress address in iph.AddressList){IPEndPoint IPEPort = new IPEndPoint(address,intPort);Socket newSocket = new Socket(IPEPort.AddressFamily,SocketType.Stream,ProtocolType.Tcp);newSocket.Connect(IPEPort);//连接远程主机if (newSocket.Connected){s = newSocket;//创建一个对象break;}else{continue;}}return s;}private static string SocketSendReceive(string strServer, int intPort){string req = "GET/HTTP/1.1\n 主机"+strServer+"\n连接:关闭\n";Byte[] bts = Encoding.ASCII.GetBytes(req);Byte[] btr=new Byte[256];//调用自定义方法,使用指定的服务器名称和端口号实例化一个对象Socket s = ConnectSocket(strServer,intPort);if (s == null){ return("连接失败");}s.Send(bts,bts.Length,0);int intContent = 0;string strContent = strServer + "上的默认页面内容: \n";do{intContent = s.Receive(btr,btr.Length,0);strContent += Encoding.ASCII.GetString(btr,0,intContent);}while(intContent>0);return strContent;}private void button1_Click(object sender, EventArgs e){if (string.IsNullOrEmpty(textBox1.Text.Trim()) || string.IsNullOrEmpty(textBox2.Text.Trim())){MessageBox.Show("不能为空");return;}string strServer = textBox1.Text;int intPort = Convert.ToInt32(textBox2.Text);string strConetent = SocketSendReceive(strServer,intPort);MessageBox.Show(strConetent);}}

2、TcpClient类和TcpListener类

TcpClient类用于在同步阻止模式下通过网络来连接、发送和接受数据流数据。为了使得TcpClient实例连接并能够交换数据,创建TcpListener类实例或Socket实例之后,必须侦听是否有传入的连接请求,具体可以使用下面两种方法之一连接到该侦听器。

(1)创建一个TcpClient,并且调用3个可用的Connect方法之一。

(2)使用远程主机的主机名称和端口号创建TcpClient,此构造函数将自动尝试一个连接。

TcpListener类用于在阻止同步模式下侦听和接受传入的连接请求。可以使用TcpClient类或者Socket类来连接TcpListener,并且可以使用IPEndPoint、本地IP地址及端口号或者仅使用端口号来创建TcpListener实例。

TcpClient类的常用属性、方法以及说明如下:

Client属性:获取或者设置基础Socket。

Connection属性:获取一个值,该值指示TepClient的基础Socket是否已经连接到远程主机。

ReceiveBufferSize属性:获取或者设置发送缓冲区的大小。

SendBufferSize属性:获取或设置发送缓冲区的大小。

Close方法:释放此TepClient实例,而不关闭基础连接。

Connect方法:使用指定的主机名称和端口号将客户端连接到TCP主机。

GetStream方法:返回用于发送和接受数据的NetworkStream。

TcpListener类的常用属性、方法及说明如下所示:

LocalEndPoint属性:获取当前TcpListener类的基础EndPoint。

Server属性:获取基础网络Socket。

AcceptSocket/AcceptTepClient方法:接受挂起的连接请求。

Start方法:开始侦听传入的连接请求。

Stop方法:关闭侦听器。

注意:如果要关闭TcpListener可以调用Stop,注意和释放TcpClient资源的区别。

示例程序:

public partial class Form1 : Form{public Form1(){InitializeComponent();}private void button1_Click(object sender, EventArgs e){TcpListener t1 = null;IPAddress address = IPAddress.Parse(textBox1.Text);int port = Convert.ToInt32(textBox2.Text);t1 = new TcpListener(address ,port);t1.Start();richTextBox1.Text = "等待连接……\n";TcpClient tc = null;if (t1.Pending()){tc = t1.AcceptTcpClient();}else{tc = new TcpClient(textBox1.Text,port);}richTextBox1.Text += "连接成功!\n";tc.Close(); //关闭TcpClient连接t1.Stop(); //停止TcpListener侦听}}

3、UdpClient类

UdpClient类用于在阻止同步模式下发送和接受无连接UDP数据报。因为UDP是无连接传输协议,所以不需要在发送和接受数据前建立远程主机连接。但是可以使用下面两种方法之一来建立默认远程主机:

使用远程主机名和端口号作为参数创建UdpClient类的实例。

创建UdpClient类的实例,然后调用Connect方法。

UdpClient类的常用属性和方法:

Client属性:获取或设置基础网络Socket。

Close 方法:关闭UDP连接。

Connect方法:建立默认远程主机。

Receive 方法:返回已由远程主机发送的UDP数据报。

Send方法:将UDP数据报发送到远程主机。

注意:如果已经指定了默认远程主机,则不要使用主机名称或者IPEndPoint调用Send方法,否则将会引发异常。

示例程序:

textebox控件分别是输入远程主机名称,端口号以及要发送的信息。

richtextbox用来显示收到的信息。

public partial class Form1 : Form{public Form1(){InitializeComponent();}private void button1_Click(object sender, EventArgs e){richTextBox1.Text = string.Empty;UdpClient udp = new UdpClient(Convert.ToInt32(textBox2.Text));//实例化udp.Connect(textBox1.Text,Convert.ToInt32(textBox2.Text));//调用对象的Connect对象的Connect建立默认远程主机Byte[] bytes = Encoding.Default.GetBytes(textBox3.Text);//定义一个字节数组,用来存放发送到远程主机的信息udp.Send(bytes,bytes.Length);//调用Send方法将UPD数据报发送到远程主机。IPEndPoint ipep = new IPEndPoint(IPAddress.Any,0);//实例化一个对象,用来相应主机的标识Byte[] rbytes = udp.Receive(ref ipep);//调用UdpClient 方法获取从远程主机返回的UDP数据报string str = Encoding.Default.GetString(rbytes);//将获得的数据报转化为string形式richTextBox1.Text = "接受到的消息: " + str.ToString();richTextBox1.Text = "\n这条消息来自: " + ipep.Address.ToString()+ "上的" + ipep.Port.ToString() + "端口";udp.Close();}}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。