




已阅读5页,还剩6页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C#网络通信1. 网络通信的方式1) 同步方式同步方式是指当发送方发送一个数据包以后,一直等到接收方响应后,才可以发送下一个数据包。(串行运行)2) 异步方式异步方式是指发送方发送数据包以后,不等接收方响应,就接着发送下一个数据包。(并行运行)3) 阻塞套接字阻塞套接字是指在执行此套接字的网络调用时,直到调用成功才返回,否则此套接字就一直阻塞在网络调用上。4) 非阻塞套接字非阻塞套接字是指在执行此套接字的网络调用时,不管是否执行成功,都立即返回。2. Dns类、IPAddress类、IPEndPoint类和IPHostEntry类1) Dns类Dns类是一个静态类,它从 Internet 域名系统 (DNS) 检索关于特定主机的信息。在 IPHostEntry 类的实例中返回来自 DNS 查询的主机信息。 如果指定的主机在 DNS 数据库中有多个入口,则 IPHostEntry 包含多个 IP 地址和别名。常用方法说明方 法 名 称说 明BeginGetHostAddresses异步返回指定主机的Internet协议(IP)地址BeginGetHostEntry已重载。将主机名或IP地址异步解析为IPHostEntry实例EndGetHostAddresses结束对DNS信息的异步请求EndGetHostEntry结束对DNS信息的异步请求GetHostAddresses返回指定主机的Internet协议(IP)地址GetHostByAddress已重载。获取IP地址的DNS主机信息GetHostName获取本地计算机的主机名GetType获取当前实例的类型GetHostEntry将主机名或IP地址解析为IPHostEntry实例2) IPAddress类IPAddress类提供了对IP地址的转换、处理等功能。其Parse方法可将IP地址字符串转换为IPAddress实例。如:IPAddress ip = IPAddress.Parse(“”); 3) IPEndPoint类IPEndPoint类包含了应用程序连接到主机上的服务所需的IP地址和端口信息。 4) IPHostEntry类IPHostEntry类将一个域名系统 (DNS) 主机名与一组别名和一组匹配的 IP 地址关联。常用属性有:AddressList属性和HostName属性。AddressList属性作用:获取或设置与主机关联的IP地址列表,是一个IPAddress类型的数组,包含了指定主机的所有IP地址;HostName属性则包含了服务器的主机名。在Dns类中,有一个专门获取IPHostEntry对象的方法,通过IPHostEntry对象,可以获取本地或远程主机的相关IP地址。例子:设计WinForm应用程序用于获取指定主机名的IP地址。 设计步骤如下:新建WinForm项目新建WinForm项目并命名为“ParseDNS”。添加控件并设置属性在Form1的设计视图中将此窗体调整到适当的大小并将 “Text”属性设置为“获取主机IP地址”。从工具箱中拖曳1个Button、2个Label和2个TextBox控件到窗体中,如图10.1所示布局控件。将label1、label2和button1的Text属性值分别设置为“主机名”、“IP地址:”和“获取”。添加命名空间所要添加的命名空间为“using System.Net;”。添加事件及代码双击“获取”按钮,其事件代码如下所示:private void button1_Click(object sender, EventArgs e) textBox2.Text = ; try IPHostEntry hostInfo = Dns.GetHostEntry(textBox1.Text.Trim(); textBox2.Text = 主机名: + Dns.GetHostName() + rn; foreach(IPAddress ipadd in hostInfo.AddressList) textBox2.Text += ipadd.ToString() + rn; catch(Exception ex) MessageBox.Show(ex.Message.ToString(); 运行程序按“Ctrl+F5”组合键运行程序,分别输入“”和“”,单击“获取”按钮,结果如图1和图2所示。 图1 图22. System.Net.Socket命名空间 TCP/IP的Socket则提供3种类型的套接字。该接口允许对较低层协议,如IP、ICMP直接访问。常用于检验新的协议实现或访问现有服务中配置的新设备。套接字处理数据两种基本模式:同步套接字和异步套接字。同步套接字 其特点是在通过Socket进行连接、接收、发送操作时,客户机或服务器在接收到对方响应前会处于阻塞状态。它适用于数据处理不太多的场合。异步套接字在通过Socket进行连接、接收、发送操作时,客户机或服务器不会处于阻塞方式,而是利用callback机制进行连接、接收和发送处理,这样就可以在调用发送或接收的方法后直接返回,并继续执行下面的程序。IP连接领域有两种通信类型:面向连接的(connection-oriented) (TCP)在面向连接的套接字中,使用TCP协议来建立两个IP地址端点之间的会话。一旦建立了这种连接,就可以在设备之间可靠的传输数据。无连接的(connectionless) (UDP)为了建立面向连接的套接字,服务器和客户端必须分别进行编程。 对于服务器端程序,建立的套接字必须绑定到用于TCP通信的本地IP地址和端口上。网络流流(stream)是对串行传输的数据的一种抽象表示,底层的设备可以是文件、外部设备、主存、网络套接字等。C#在System.Net.Sockets名称空间中提供了一个专门的NetworkStream类,用于通过网络套接字发送和接收数据。NetworkStream类支持对网络数据的同步或异步访问,它可被视为在数据来源端和接收端之间架设了一个数据通道。1) Socket类.NET框架的System.NET.Sockets命名空间为需要严密控制网络访问的开发人员提供了WinSock接口的托管实现。Socket类用于实现Berkeley套接字接口。Socket类的构造函数Socket类的构造函数原型如下:public Socket( AddressFamily addressFamily, SocketType socketType, ProtocolType protocolType);构造函数使用3个参数来定义创建的Socket实例。AddressFamily用来指定网络类型;SocketType用来指定套接字类型(即数据连接方式);ProtocolType用来指定网络协议。3个参数均是在命名空间System.Net.Sockets中定义的枚举类型。但它们并不能任意组合,不当的组合反而会导致无效套接字。如对于常规的IP通信网络,AddressFamily只能使用AddressFamily.InterNetwork,此时可用的SocketType、ProtocolType组合如表1所示。SocketType值ProtocolType值描 述StreamTcp面向连接套接字DgramUdp无连接套接字RawIcmp网际消息控制协议套接字RawRaw基础传输协议套接字表12) TcpClient类TcpClient类为TCP网络服务提供客户端连接,它构建于Socket类之上,以提供较高级别的TCP服务,即提供了通过网络连接、发送和接收数据的简单方法。用于在同步阻止模式下通过网络来连接、发送和接收流数据。另外,通过与NetworkStream对象的关联,使得用户可以通过流操作方式实现对网络连接状态下数据的发送和接收。 通过TcpClient类实现与TCP主机的通信流程如图3所示。图3 TcpClient类与TCP主机的通信流程1创建TcpClient实例TcpClient类有4种构造函数的重载形式,分别对应4种创建实例的方法。TcpClient(),这种不带任何参数的构造函数将使用本机默认的IP地址并将使用默认的通信端口号0。当然,如果本机不止一个IP地址时将无法选择使用。TcpClient(AddressFamily),使用指定的地址族初始化TcpClient类的新实例。TcpClient(IPEndPoint),即使用本机IPEndPoint创建TcpClient的实例。其中IPEndPoint将网络端点表示为IP地址和端口号,用于指定在建立远程主机连接时所使用的本地网络接口IP地址和端口号。TcpClient (String, Int32),初始化 TcpClient 类的新实例并连接到指定主机上的指定端口。因此,在TcpClient的构造函数中,如果没有指定远程主机名和端口号,它只是用来实例化TcpClient,同时实现与本地IP地址和Port端口的绑定。2与远程主机建立连接如果在TcpClient的实例化过程中没有实现与远程主机的连接,则可以通过Connect方法来实现与指定远程主机的连接。Connect方法使用指定的主机名和端口号将客户端连接到远程主机,其使用方法如下。Connect(IPEndPoint),使用指定的远程网络终结点将客户端连接到远程TCP主机。 Connect(IPAddress),使用指定的IP地址和端口号将客户端连接到远程TCP主机。 Connect (IPAddress,Int32),使用指定的IP地址和端口号将客户端连接到远程TCP主机。Connect(String, Int32),使用指定的主机名和端口号将客户端连接到指定主机上的指定端口。如下代码段描述了TcpClient实例的创建以及与指定远程主机的连接过程。m_client = new TcpClient();m_client.Connect(m_servername, m_port);3利用NetworkStream实例发送和接收数据TcpClient类创建在Socket之上,提供了更高层次的TCP服务抽象,特别是在网络数据的发送和接收方面,TcpClient使用标准的Stream流处理技术,通过使用NetworkStream实例的读写操作来实现网络数据的接收和发送,因此更加方便直观。但NetworkStream与普通流Stream有所不同,NetworkStream没有当前位置的概念,不支持查找和对数据流的随机访问。该方法首先通过TcpClient.GetStream来返回NetworkStream实例,进而利用所获取的NetworkStream实例的读写方法Write和Read来发送和接收数据,其实现代码如下所示。 rs = new StreamReader(m_client.GetStream();/获取接收数据的网络流实例ws = m_client.GetStream(); /获取发送数据的网络流实例m_returnData = rs.ReadLine(); /接收网络数据Console.WriteLine(m_returnData); ws.Write(data, 0, data.Length); /向网络发送数据4关闭TCP套接字在与服务器完成通信后,应该调用Close()方法释放所有的资源。 m_client.Close();3) TcpListener类TcpClient类实现了客户端编程抽象,因此构建客户端网络应用程序便可以直接使用TcpClient取代Socket,更加方便易用。同样,对于服务器端应用程序的构建,C#提供了TcpListener类。该类也是构建于Socket之上,提供了更高抽象级别的TCP服务,使得程序员能更方便地编写服务器端应用程序。通常情况下,服务器端应用程序在启动时将首先绑定本地网络接口的IP地址和端口号,然后进入侦听客户请求的状态,以便于客户端应用程序提出显式请求。一旦侦听到有客户端应用程序请求连接侦听端口,服务器端应用将接受请求,并建立一个负责与客户端应用程序通信的信道,即通过创建连接套接字与客户端应用程序建立连接,由连接套接字完成与客户端应用程序的数据传送操作,服务器端应用程序继续侦听更多的客户端连接请求。TcpListener通过实例创建过程完成与本地网络接口的绑定,并由所创建的实例调用Start方法启动侦听;当侦听到客户端应用程序的连接请求后,根据客户端应用程序的不同请求方式,可以通过AcceptTcpClient方法接受传入的连接请求并创建TcpClient实例以处理请求,或者通过AcceptSocket方法接受传入的连接请求并创建Socket实例以处理请求,并由所创建的TcpClient实例或Socket实例完成与客户端应用程序的网络数据传输。最后,需要使用Stop关闭用于侦听传入连接的Socket,同时也必须关闭从AcceptSocket或AcceptTcpClient返回的任何实例,以释放相关资源。其实现流程如右图4所示。图4 TcpListener类与客户机的通信流程1创建TcpListener实例TcpListener类提供了3种构造函数的重载形式来创建TcpListener实例。TcpListener(port); /指定本机端口 public TcpListener(IPEndPoint) /指定本机终结点 public TcpListener(IPAddress,port) /指定本机IP地址及端口 分别根据指定的侦听端口、IPEndPoint对象(包含了IP地址和端口号)、IPAddress对象和端口号来创建TcpListener实例,并且实现与默认端口或指定IP地址和端口的绑定,如: m_host = IPAddress.Parse(m_serverIP);m_Listener = new TcpListener(m_host, m_port);2侦听创建TcpListener实例后,便可以调用Start方法启动侦听,即该方法将调用TcpListener实例的基础Socket上的Listen方法,开始侦听客户的连接请求,如:m_Listener.Start();3接收连接请求当侦听到有客户连接请求时,可以使用AcceptSocket或AcceptTcpClient接收任何当前在队列中挂起的连接请求。这两种方法分别返回一个Socket或TcpClient实例以接受客户的连接请求,如:TcpClient m_client = m_Listener.AcceptTcpClient();通过返回的Socket或TcpClient实例来实现与提出连接请求的客户的单独网络数据传输。4收发数据如果接收连接请求时返回的是Socket实例,则可以用Send和Receive方法实现与客户的通信。如果返回的是TcpClient实例,则可以通过对NetworkStream的读写来实现与客户的数据通信。由于服务器可以同时与多个客户建立连接并进行数据通信,因此往往会引入多线程技术,为每个客户的连接建立一个线程,在该线程中实现与客户的数据通信。如下代码所示。/为每个客户连接创建并启动一个线程TcpClient m_client = m_Listener.AcceptTcpClient();ClientHandle m_handle = new ClientHandle();m_handle.ClientSocket = m_client;Thread m_clientthread = new Thread(new ThreadStart(m_handle.ResponseClient);m_cl
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 【正版授权】 ISO 14246:2022/Amd 1:2025 EN Gas cylinders - Cylinder valves - Manufacturing tests and examinations - Amendment 1
- 全国销量最好的数学试卷
- 桥面钢丝支撑施工方案(3篇)
- 钢架拱门施工方案(3篇)
- 航天考试题库及答案
- 村医考试题库及答案
- 安徽省宣城市宣州区2023-2024学年高三下学期高考第三次模拟考试语文题库及答案
- 产品质量问题追溯体系缺陷产品管理工具
- 热血战士出发1000字7篇
- 广告行业方案书及演示模板通版
- T-NAHIEM 121-2024 创伤中心建设与设备配置规范
- 《磁感应强度-磁通量》课件
- 人教版九年级下册数学教学计划(及进度表)
- 业务协同与合并抵销报表方案汇报v1.9
- 标准预防及安全注射
- 儿童体适能教学 课件 (20期)
- 本质安全的概念和意义
- 2025-2030年中国少儿英语培训市场发展状况及投资前景规划研究报告
- 常用公文写作规范培训
- 《玉米病虫害及防治》课件
- 临床医疗胃食管反流病指南
评论
0/150
提交评论