![第04章 套接字及数据流_第1页](http://file3.renrendoc.com/fileroot_temp3/2022-1/12/ccc2a826-de1a-4c1f-ab55-fd72e5106576/ccc2a826-de1a-4c1f-ab55-fd72e51065761.gif)
![第04章 套接字及数据流_第2页](http://file3.renrendoc.com/fileroot_temp3/2022-1/12/ccc2a826-de1a-4c1f-ab55-fd72e5106576/ccc2a826-de1a-4c1f-ab55-fd72e51065762.gif)
![第04章 套接字及数据流_第3页](http://file3.renrendoc.com/fileroot_temp3/2022-1/12/ccc2a826-de1a-4c1f-ab55-fd72e5106576/ccc2a826-de1a-4c1f-ab55-fd72e51065763.gif)
![第04章 套接字及数据流_第4页](http://file3.renrendoc.com/fileroot_temp3/2022-1/12/ccc2a826-de1a-4c1f-ab55-fd72e5106576/ccc2a826-de1a-4c1f-ab55-fd72e51065764.gif)
![第04章 套接字及数据流_第5页](http://file3.renrendoc.com/fileroot_temp3/2022-1/12/ccc2a826-de1a-4c1f-ab55-fd72e5106576/ccc2a826-de1a-4c1f-ab55-fd72e51065765.gif)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1 1第第4章章 套接字与数据流套接字与数据流4.1 套接字套接字4.1.1 .1.1 面向连接的套接字面向连接的套接字 4.1.2 4.1.2 无连接的套接字无连接的套接字4 4.2 .2 数据流数据流4.2.1 4.2.1 文件流文件流4.2.2 4.2.2 内存流内存流4.2.3 4.2.3 网络流网络流4.2.4 StreamWriter4.2.4 StreamWriter与与StreamReaderStreamReader类类4.2.5 BinaryReader4.2.5 BinaryReader与与BinaryWriterBinaryWriter类类2 2 本章教学目的本章教学目的
2、学习学习套接字套接字编程的基本方法,以及数据流相关类的用法。编程的基本方法,以及数据流相关类的用法。 本章教学要求本章教学要求(1)掌握套接字的概念及)掌握套接字的概念及Socket类用法;类用法;(2)掌握面向连接套接字编程、无连接套接字编程基本步骤)掌握面向连接套接字编程、无连接套接字编程基本步骤(3)掌握)掌握FileStream、MemoryStream、NetworkStream类类的用法;的用法;(4)掌握)掌握StreamReader、StreamWriter、BinaryReader、 BinaryWriter类的基本用法。类的基本用法。本章重点本章重点3 3C#套接字 什么是
3、套接字什么是套接字 ? 所谓套接字(所谓套接字(Socket),是一种独立于协议的),是一种独立于协议的网络编程接口,在网络编程接口,在OSI模型中,它主要集中在会话模型中,它主要集中在会话层和传输层。在层和传输层。在Microsoft.NET FrameWork SDK上,上,Socket类提供了对套接字的支持,该类类提供了对套接字的支持,该类位于名位于名称空间称空间System.Net.Sockets之中之中。Socket类提供类提供了一整套属性和方法实现了对端口绑定、监听以及了一整套属性和方法实现了对端口绑定、监听以及连接、数据传输等服务。连接、数据传输等服务。 套接字是套接字是TCP/
4、IP网络通信的基石,是支持网络通信的基石,是支持TCP/IP的网络通信的基本操作单元。的网络通信的基本操作单元。4 4C#套接字 套接字编程原理:套接字编程原理: 1)面向连接的套接字编程原理:套接字之间的连)面向连接的套接字编程原理:套接字之间的连接过程可以分为四个步骤:服务器监听,客户端请接过程可以分为四个步骤:服务器监听,客户端请求,连接确认,数据传输。求,连接确认,数据传输。 2)无连接的套接字编程原理:创建一个)无连接的套接字编程原理:创建一个Socket对对象,将创建的象,将创建的Socket对象与本地对象与本地IPEndPoint进行进行绑定。然后就可以接收流入的绑定。然后就可以
5、接收流入的UDP数据包,或者将数据包,或者将流出的流出的UDP数据包发送到网络中任意其它设备上数据包发送到网络中任意其它设备上 5 5 C#套接字 与套接字相关的类:与套接字相关的类:1)在名称空间)在名称空间System.Net.Sockets之中,之中,Socket类提类提供了对套接字的支持。供了对套接字的支持。C#语言简洁的语法和强大的功语言简洁的语法和强大的功能使套接字网络编程变得十分简单。能使套接字网络编程变得十分简单。u常用方法:常用方法: Bind() 、Listen() 、Accept() 、Connect() 、BeginConnect()、Close() 、Send() 、
6、Receive() 、ToString() 、SendTo() 、ReceiveFrom() 面向连接的套接字面向连接的套接字 面向无连接的面向无连接的Socket()Bind()Listen()Accept()Receive()Send()Close()Socket()Connect()Send()Receive()Close()Socket()Bind()ReceiveFrom()SendTo()Close()Socket()Bind()SendTo()ReceiveFrom()Close()7 74.1 套接字套接字 一个连接由它的两个端点标识,这样的端点称为套接字。一个连接由它的两个端
7、点标识,这样的端点称为套接字。8 84.1 套接字(续套接字(续) 套接字是支持套接字是支持TCP/IP协议的网络通信的基本操作单元。可协议的网络通信的基本操作单元。可以将套接字看作以将套接字看作不同主机间的进程进行双向通信的端点不同主机间的进程进行双向通信的端点。 上图连接上图连接1的一对套接字为:的一对套接字为: (3,5000)和()和(22,8888) 上图连接上图连接2的一对套接字为:的一对套接字为: (3,5001)和()和(22,8888) 对于对于UDP协议尽管两个进程之间没有建立连接,但是
8、也同协议尽管两个进程之间没有建立连接,但是也同样存在发送端点,和接收端点,也同样使用套接字的概念。样存在发送端点,和接收端点,也同样使用套接字的概念。9 9System.Net System.Net 命名空间中包含多种网络编程常用的类。命名空间中包含多种网络编程常用的类。IPAddressIPAddress类封装了类封装了IPIP地址;地址; IPEndPointIPEndPoint封装了封装了IPIP地址和端口号,表示一个套接字通信端点;地址和端口号,表示一个套接字通信端点;IPHostEntryIPHostEntry类关联了主机名、别名组和对应的类关联了主机名、别名组和对应的IPIP地址组
9、;地址组;DnsDns类提供了域名解析功能。类提供了域名解析功能。SocketSocket类包含在类包含在System.Net.SocketsSystem.Net.Sockets命名空间中,是命名空间中,是.NET .NET 套接字套接字编程的核心类。编程的核心类。除了除了SocketSocket类,根据需要,还可以使用已经封装好的类,根据需要,还可以使用已经封装好的TcpListenerTcpListener和和TcpClientTcpClient类,以及类,以及UdpClientUdpClient类收发数据。类收发数据。进行流式套接字的数据读写,可以使用进行流式套接字的数据读写,可以使用S
10、ystem.NET.SocketsSystem.NET.Sockets命名命名空间的空间的NetworkStreamNetworkStream类,该类提供了关于数据读写的更多控制。类,该类提供了关于数据读写的更多控制。.NET中的套接字支持中的套接字支持10104.1 套接字(续套接字(续) 套接字的类型有:套接字的类型有:u 流式流式套接字:提供了面向连接的、可靠的、数据无错并且套接字:提供了面向连接的、可靠的、数据无错并且无重复的数据发送服务,而且接收数据的顺序和发送数据无重复的数据发送服务,而且接收数据的顺序和发送数据的顺序是相同的。的顺序是相同的。 u 数据报数据报套接字:提供了面向无
11、连接的服务套接字:提供了面向无连接的服务,它以独立的数它以独立的数据包形式发送数据据包形式发送数据(数据包长度不能大于数据包长度不能大于32KB),不提供,不提供正确性检查,也不保证各数据包的发送顺序和接收顺序相正确性检查,也不保证各数据包的发送顺序和接收顺序相同同 ,因此,可能出现数据的重发、丢失等现象。,因此,可能出现数据的重发、丢失等现象。 1. 原始原始套接字:用于直接访问协议的较低层。常用于检验新套接字:用于直接访问协议的较低层。常用于检验新的协议实现或访问现有服务中配置的新设备,一般不提倡的协议实现或访问现有服务中配置的新设备,一般不提倡直接使用原始套接字。直接使用原始套接字。 1
12、1114.1 套接字(续套接字(续) Socket类包含在类包含在System.Net.Sockets命名空间中。命名空间中。 一个一个Socket实例包含了一个本地或者一个远程端点的套接实例包含了一个本地或者一个远程端点的套接字信息。字信息。 使用使用Socket类编程,由于很多细节都需要自己考虑,相对类编程,由于很多细节都需要自己考虑,相对来说复杂一些,易出错。来说复杂一些,易出错。一般对套接字编程比较熟悉的人,一般对套接字编程比较熟悉的人,或者使用非标准协议(自定义的新协议)进行编程的时候,或者使用非标准协议(自定义的新协议)进行编程的时候,才使用才使用Socket类。类。 Socket
13、类的构造函数为:类的构造函数为: public Socket( AddressFamily addressFamily, /网络类型网络类型 SocketType socketType, /套接字类型套接字类型 ProtocolType protocolType); /使用的协议使用的协议 12124.1 套接字(续套接字(续)参数含义:参数含义:(1)addressFamily addressFamily表示网络类型,该参数使用表示网络类型,该参数使用AddressFamily枚举指定枚举指定Socket使用的寻址方案使用的寻址方案例如例如AddressFamily.InterNetwork
14、表示表示IPV4的地址。的地址。13134.1 套接字(续套接字(续)14144.1 套接字(续套接字(续)(2)socketTypesocketTyp指定指定Socket的类型,该参数使用的类型,该参数使用SocketType枚举指定使用哪种套接字。例如枚举指定使用哪种套接字。例如:SocketType.Stream表明连接是基于流套接字的表明连接是基于流套接字的SocketType.Dgram表示连接是基于数据报套接字表示连接是基于数据报套接字SocketType.Raw表示连接基于原始套接字;表示连接基于原始套接字; 详细见课本表详细见课本表4-215154.1 套接字(续套接字(续)(
15、3)protocolTypeprotocolType指定指定Socket使用的协议,该参数使用使用的协议,该参数使用ProtocolType枚举指定使用哪种协议。例如枚举指定使用哪种协议。例如:uProtocolType.Tcp表明连接协议是表明连接协议是TCPuProtocolType.Udp表明连接协议是表明连接协议是UDPu详细见课本表详细见课本表4-316164.1 套接字(续套接字(续) Socket构造函数的三个参数中,对于网络上的构造函数的三个参数中,对于网络上的IP通信来说,通信来说,AddressFamily总是使用总是使用AddressFamily.InterNetwork
16、枚举值。枚举值。而而SocketType参数则与参数则与ProtocolType参数配合使用参数配合使用,不允许其他的匹配,不允许其他的匹配形式,也不允许混淆匹配。下表列出了可用于形式,也不允许混淆匹配。下表列出了可用于IP通信的组合。通信的组合。 SocketTypeProtocolType说明说明DgramUdp无连接通信无连接通信StreamTcp面向连接的通信面向连接的通信RawIcmpInternet控制报文协议控制报文协议RawRaw简单简单IP包通信包通信1717Socket类类 创建流式套接字创建流式套接字Socket s = new Socket (AddressFamily
17、.InterNetwork , SocketType.Stream , ProtocolType.Tcp ) 创建数据报套接字创建数据报套接字Socket s = new Socket (AddressFamily.InterNetwork , SocketType.Dgram , ProtocolType.Udp)18184.1.1 面向连接的套接字面向连接的套接字 同步同步TCP编写编写服务器端程序服务器端程序的一般步骤为:的一般步骤为: 1) 创建一个包含采用的网络类型、数据传输类型和协议类型创建一个包含采用的网络类型、数据传输类型和协议类型的本地套接字对象,并将其与服务器的的本地套接字
18、对象,并将其与服务器的IP地址和端口号绑地址和端口号绑定。这个过程可以通过定。这个过程可以通过Socket类。类。 2) 在指定的端口进行监听,以便接受客户端连接请求。在指定的端口进行监听,以便接受客户端连接请求。 3) 一旦接受了客户端的连接请求,就根据客户端发送的连接一旦接受了客户端的连接请求,就根据客户端发送的连接信息创建与该客户端对应的信息创建与该客户端对应的Socket对象。对象。 4) 根据创建的根据创建的Socket对象,分别与每个连接的客户进行数对象,分别与每个连接的客户进行数据传输。据传输。 5) 根据传送信息情况确定是否关闭与对方的连接。根据传送信息情况确定是否关闭与对方的
19、连接。19194.1.1 面向连接的套接字面向连接的套接字 使用同步使用同步TCP编写编写客户端程序客户端程序的一般步骤为:的一般步骤为: 1) 创建一个包含传输过程中采用的网络类型、数据传创建一个包含传输过程中采用的网络类型、数据传输类型和协议类型的输类型和协议类型的Socket对象。对象。 2) 与远程服务器建立连接。与远程服务器建立连接。 3) 与服务器进行数据传输。与服务器进行数据传输。 4) 完成工作后,向服务器发送关闭信息,并关闭与服完成工作后,向服务器发送关闭信息,并关闭与服务器的连接。务器的连接。20204.1.1 面向连接的套接字面向连接的套接字Socket()Bind()L
20、isten()Accept()Receive()Send()Close()Socket()Connect()Send()Receive()Close()服务器端 客户端面向连接的套接字编程2121Connect:建立与远程主机的连接。参数为:建立与远程主机的连接。参数为IPEndPoint。Disconnect:关闭套接字连接并允许重用套接字。:关闭套接字连接并允许重用套接字。Close:关闭:关闭Socket连接并释放所有关联的资源。连接并释放所有关联的资源。 Bind:使:使Socket与一个本地通信端点相关联。与一个本地通信端点相关联。Listen:将:将Socket置于侦听状态。可以让
21、一个面向连接的置于侦听状态。可以让一个面向连接的 Socket 侦听传入的连接尝试。侦听传入的连接尝试。 原型:原型:public void Listen(int backlog)。)。backlog 参数指定队列中最参数指定队列中最多可容纳的等待接受的传入连接数。多可容纳的等待接受的传入连接数。 Accept :为新建连接创建新的:为新建连接创建新的Socket。 原型:原型:public Socket Accept ()。 返回值:新建连接的返回值:新建连接的Socket。Receive:接受来自:接受来自Socket的数据。的数据。 原型:原型:public int Receive (b
22、yte buffer)。buffer 参数是参数是Byte 类型的数类型的数组,表示存储接收到的数据的内存位置。组,表示存储接收到的数据的内存位置。 返回值:接收到的字节数。返回值:接收到的字节数。Send:将数据发送到:将数据发送到Socket。对应。对应Receive方法。方法。Socket类常用方法类常用方法:2222 根据根据Socket通信的过程,服务器端一方面,要不间断地侦听通信的过程,服务器端一方面,要不间断地侦听新的客户端新的客户端Socket连接;另一方面,可能要接受若干个客户连接;另一方面,可能要接受若干个客户端的端的Socket连接,对每一个连接都不能遗漏数据,而客户端连
23、接,对每一个连接都不能遗漏数据,而客户端何时发送数据却是服务器端无法得知的,只能不间断地等待何时发送数据却是服务器端无法得知的,只能不间断地等待;再一方面,在侦听和接收数据的同时还不能停止用户界面;再一方面,在侦听和接收数据的同时还不能停止用户界面的响应。我们知道,程序是顺序执行的,是依次进行的,的响应。我们知道,程序是顺序执行的,是依次进行的,如如何做到既不间断地响应用户界面,又不间断地侦听客户端何做到既不间断地响应用户界面,又不间断地侦听客户端 Socket,还不间断地等待若干个,还不间断地等待若干个Socket连接的数据呢?连接的数据呢? 即使在客户端,一方面要响应用户界面(比如发送数据
24、、关即使在客户端,一方面要响应用户界面(比如发送数据、关闭连接等);另一方面要接收服务器端发送来的数据,这些闭连接等);另一方面要接收服务器端发送来的数据,这些也都要求不间断地进行。也都要求不间断地进行。 以上问题可以用多线程技术解决。以上问题可以用多线程技术解决。.NET 的套接字接口编程技术概述的套接字接口编程技术概述2323套接字通信示例套接字通信示例(TCP服务器端服务器端)/ 创建一个侦听套接字创建一个侦听套接字Socket sListen = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType
25、.Tcp);/ 侦听套接字绑定地址侦听套接字绑定地址sListen.Bind(new IPEndPoint(IPAddress.Any, 8960); / 侦听到来的连接侦听到来的连接sListen.Listen();/ 接受连接到一个新的套接字接受连接到一个新的套接字Socket sAccecpt = sListen.Accept();/ 使用新的套接字接收和发送数据使用新的套接字接收和发送数据sAccecpt.Send()2424套接字编程技术套接字编程技术 程序实例一程序实例一IPEndPoint类的使用类的使用using System;using System.Net;class Te
26、stIPEndPointpublic static void Main()IPAddress ip=IPAddress.Parse();IPEndPoint iep=new IPEndPoint(ip,8000);Console.WriteLine(The IPEndPoint is:0,iep.ToString();Console.WriteLine(The Address is:0,iep.Address);Console.WriteLine(The AddressFamily is:0,iep.AddressFamily);Console.WriteLine(The m
27、ax port number is:0,IPEndPoint.MaxPort);Console.WriteLine(The min port number is:0,IPEndPoint.MinPort); Console.Read();2525套接字编程技术套接字编程技术 程序实例二程序实例二使用套接字使用套接字using System;using System.Net;using System.Net.Sockets;class TestSocketpublic static void Main()IPAddress ip=IPAddress.Parse();IPEndP
28、oint iep=new IPEndPoint(ip,8000);Socket socket=new Socket(AddressFamily.InterNetwork, SocketType.Stream,ProtocolType.Tcp);Console.WriteLine(Blocking: 0,socket.Blocking);Console.WriteLine(Connected: 0,socket.Connected);socket.Bind(iep); C o n s o l e . W r i t e L i n e ( L o c a l E n d P o i n t :
29、0,socket.LocalEndPoint.ToString(); Console.Read();2626同步套接字编程同步套接字编程1.服务器端口绑定与监听服务器端口绑定与监听 在服务器与客户机连接传输数据前,服务器需要做以下事情:在服务器与客户机连接传输数据前,服务器需要做以下事情: 1) 创建一个套接字。创建一个套接字。 2) 创建本地创建本地IPEndPoint对象。对象。 3) 使用使用Bind()方法将所创建的套接字与本地方法将所创建的套接字与本地IPEndPoint 绑定。绑定。 4) 使用使用Listen()方法设置套接字为监听模式。方法设置套接字为监听模式。 5) 使用使用
30、Accept()方法接收客户端连接请求并为客户端创方法接收客户端连接请求并为客户端创 建一个客户端套接字。建一个客户端套接字。2727实现方法(实现方法(1)using System.Net;using System.Net.Sockets;IPAddress ip=IPAddress.Parse();IPEndPoint iep=new IPEndPoint(ip,6788);Socket socket=new Socket(AddressFamily.InterNetwork, SocketType.Stream,ProtocolType.Tcp);socket.Bind
31、(iep);socket.Listen(10); /最多允许最多允许10个客户端同时连接个客户端同时连接while(true) Socket clientSocket=socket.Accept(); 2828实现方法(实现方法(2)IPHostEntry local = Dns. GetHostEntry (Dns.GetHostName();IPEndPoint iep = new IPEndPoint(local.AddressList0, 1180);Socket localSocket = new Socket( AddressFamily.InterNetwork, SocketT
32、ype.Stream, ProtocolType.Tcp);localSocket.Bind(iep);locatSocket.Listen(10);Socket clientSocket = localSocket.Accept();29292.客户端建立与服务器的连接客户端建立与服务器的连接 客户端在传送数据前,只需要做两件事:客户端在传送数据前,只需要做两件事: 1) 创建一个套接字。创建一个套接字。 2) 使用使用Socket类的类的Connect()方法将套接字与远程服务器方法将套接字与远程服务器地址相连。地址相连。IPAddress ip=IPAddress.Parse(202.1
33、96.101.246); /服务器服务器IPIPEndPoint iep=new IPEndPoint(ip,6788);Socket socket=new Socket(AddressFamily.InterNetwork, SocketType.Stream,ProtocolType.Tcp);socket.Connect(iep);30303. 发送数据发送数据 (1)使用使用Socket类的类的Send()方法方法(2)使用使用NetworkStream类的类的Write()方法。方法。注意注意: 不论是使用不论是使用Send()方法或者使用方法或者使用Write()方法,都必须先方法
34、,都必须先将发送的数据转换为字节数组,然后使用将发送的数据转换为字节数组,然后使用Send()或或Write()将数据发送出去。实际上,这个字节数组的数据将数据发送出去。实际上,这个字节数组的数据并不是直接发送到远程机器上,而是发送到了并不是直接发送到远程机器上,而是发送到了TCP缓冲缓冲区中(该缓冲区默认大小为区中(该缓冲区默认大小为1024字节)。字节)。 3131(1)使用使用Socket类的类的Send()方法方法 对服务器端,可以使用接收客户端连接时创建的套接字发对服务器端,可以使用接收客户端连接时创建的套接字发送数据,例如:送数据,例如:byte bytes=new byte102
35、4;byte bytes=new byte1024;string message=string message=发送的数据发送的数据;bytes=System.Text.Encoding.Unicode.GetBytes(message);bytes=System.Text.Encoding.Unicode.GetBytes(message);clientSocket.Send(bytes,bytes.Length,SocketFlags.None);clientSocket.Send(bytes,bytes.Length,SocketFlags.None); 对客户端,用法相似,区别只是创建
36、的套接字不同。对客户端,用法相似,区别只是创建的套接字不同。 3232(2)使用使用NetworkStream类的类的Write()方法方法 如果创建了如果创建了NetworkStream对象,就可以直接使用该对象发对象,就可以直接使用该对象发送数据,例如服务器端代码可能类送数据,例如服务器端代码可能类似于如下形式:似于如下形式:NetworkStream netstream=new NetworkStream(clientSocket);NetworkStream netstream=new NetworkStream(clientSocket);string message=string
37、message=发送的数据发送的数据; byte bytes=System.Text.Encoding.Unicode.GetBytes(message); byte bytes=System.Text.Encoding.Unicode.GetBytes(message); netstream.Write(bytes,0,bytes.Length); netstream.Write(bytes,0,bytes.Length); 与套接字的与套接字的Send()Send()方法不同,方法不同,NetworkStream NetworkStream 对象的对象的Write()Write()方法方法
38、返回值为返回值为void void 。33334.接收数据接收数据 与发送数据相似,接收数据的方法也有两种:使用与发送数据相似,接收数据的方法也有两种:使用Socket类类的的Receive方法或者使用方法或者使用NetworkStream类的类的Read方法,其方法,其用法与发送数据类似。用法与发送数据类似。例如:例如:(1) Socket类的类的Receive方法方法 /接收客户端信息接收客户端信息byte myresult = new Byte1024;int receiveNum = clientSocket.Receive(myresult);Console.WriteLine(接收
39、客户端消息:接收客户端消息:0, Encoding.ASCII.GetString(myresult);34344.接收数据接收数据 与发送数据相似,接收数据的方法也有两种:使用与发送数据相似,接收数据的方法也有两种:使用Socket类类的的Receive方法或者使用方法或者使用NetworkStream类的类的Read方法,其方法,其用法与发送数据类似。用法与发送数据类似。例如:例如:(2) NetworkStream类的类的Read方法方法byte message=new byte1024;byte message=new byte1024;NetworkStream netstream=
40、new NetworkStream(clientSocket);NetworkStream netstream=new NetworkStream(clientSocket);int len=netstream.Read(message,0,message.Length);int len=netstream.Read(message,0,message.Length);注意,注意,Read()方法有一个整型的返回值,表明实际从方法有一个整型的返回值,表明实际从TCP缓冲区中读取了多缓冲区中读取了多少字节的数据,这是因为有可能少字节的数据,这是因为有可能TCP缓冲区还没有接收到远程设备发送过来缓
41、冲区还没有接收到远程设备发送过来的指定长度的数据。的指定长度的数据。 35354.1.1 面向连接的套接字(续)面向连接的套接字(续)3.关闭连接关闭连接通信完成后,必须先用通信完成后,必须先用Shutdown方法停止会话,然后关闭方法停止会话,然后关闭Socket实例实例 。例如:例如: sock.Shutdown(SocketShutdown.Both);sock.Close();36364.1.2 无连接的套接字 UDP使用无连接的套接字,无连接的套接字不需要在网络使用无连接的套接字,无连接的套接字不需要在网络设备之间发送连接信息。设备之间发送连接信息。 注意注意:必须使用必须使用Bin
42、d方法将套接字绑定到一个本地地址和端方法将套接字绑定到一个本地地址和端口之后才能使用口之后才能使用ReceiveFrom方法接收数据,如果只发送方法接收数据,如果只发送而不接收,则不需要使用而不接收,则不需要使用Bind方法。方法。37374.1.2 无连接的套接字Socket()Bind()ReceiveFrom()SendTo()Close()Socket()Bind()SendTo()ReceiveFrom()Close()设备1设备2无连接套接字编程3838面向非连接的套接字编程面向非连接的套接字编程 Socket1u创建套接字创建套接字 u绑定端口绑定端口u接收数据接收数据u发送数据
43、发送数据u关闭连接关闭连接 Socket2u创建套接字创建套接字 u绑定端口绑定端口u发送数据发送数据u接收数据接收数据u关闭连接关闭连接3939UDP Socket 创建创建SocketuSocket ( AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp) 绑定端点:绑定本机的端点绑定端点:绑定本机的端点uSocket.Bind(localEP)u必须使用必须使用Bind方法将套接字绑定到一个本地端点之后才能方法将套接字绑定到一个本地端点之后才能监听该端口接收数据,如果只是发送数据则无需绑定,此监听该端口接收数据,如
44、果只是发送数据则无需绑定,此时使用随机的端口。时使用随机的端口。4040UDP Socket发送数据:发送数据:uSocket.SendTo(data,remoteEP)Socket.SendTo(data,remoteEP)u由于由于UDPUDP是无连接的,每次发送数据时,都需要确是无连接的,每次发送数据时,都需要确定对方端点。定对方端点。接收数据:接收数据:uSocket.Receive(buffer) Socket.Receive(buffer) u此方法适用于无需获得发送方端点的情况下使用此方法适用于无需获得发送方端点的情况下使用,此时无法回复数据给对方。,此时无法回复数据给对方。41
45、41UDP Socket接收数据:接收数据:uSocket. ReceiveFrom(buffer, ref remoteEP)uref remoteEP:引用类型参数,用于得到发送方:引用类型参数,用于得到发送方的端点信息的端点信息 。u此方法适用于需获得发送方端点的情况下使用此方法适用于需获得发送方端点的情况下使用u由于由于UDP是无连接的,任何其它端点都可以向是无连接的,任何其它端点都可以向 socket绑定的本地端点发送数据,如想回复数据绑定的本地端点发送数据,如想回复数据,则需要知道接收到的数据报是,则需要知道接收到的数据报是“谁谁”发送的。发送的。4242UDP Socket示例示
46、例创建Socket发送端创建Socket发送端Close创建Socket发送端接受端接受端绑定本地端点控制台输入msgmsg=“exit“发送msgYN创建Socket创建SocketClose创建Socket绑定本地端点接受msgmsg=“exit“控制台打印msgYNSendToReceiveFrommsg=“exit“控制台打印msgmsg=“exit“Close控制台打印msgmsg=“exit“Close控制台打印msgmsg=“exit“创建Socket创建SocketClose创建Socket发送端接受端接受端绑定本地端点控制台输入msgmsg=“exit“发送msgY创建Soc
47、ket创建SocketClose创建Socket绑定本地端点接受msgmsg=“exit“控制台打印msgYNSendToReceiveFrommsg=“exit“控制台打印msgmsg=“exit“Close控制台打印msgmsg=“exit“Close控制台打印msgmsg=“exit“N创建Socket创建SocketClose创建Socket发送端接受端接受端绑定本地端点控制台输入msgmsg=“exit“发送msgY创建Socket创建SocketClose创建Socket绑定本地端点接受msgmsg=“exit“控制台打印msgYNSendToReceiveFrommsg=“exi
48、t“控制台打印msgmsg=“exit“Close控制台打印msgmsg=“exit“Close控制台打印msgmsg=“exit“4343第第4章章 套接字与数据流套接字与数据流4.1 套接字套接字4.1.1 面向连接的套接字面向连接的套接字 4.1.2 无连接的套接字无连接的套接字4.2 数据流数据流4.2.1 文件流文件流4.2.2 内存流内存流4.2.3 网络流网络流4.2.4 StreamWriter与与StreamReader类类4.2.5 BinaryReader与与BinaryWrite类类44444.2 数据流数据流流(流(stream)是对串行传输的数据(以字节为单位)是对
49、串行传输的数据(以字节为单位)的一种抽象表示,底层的设备可以是文件、外部设备、的一种抽象表示,底层的设备可以是文件、外部设备、主存、网络套接字等主存、网络套接字等。45454.2 数据流数据流 流提供三种基本操作:流提供三种基本操作: 写入:写入:将数据从内存缓冲区传输到外部源。将数据从内存缓冲区传输到外部源。 读取:读取:将数据从外部源传输到内存缓冲区。将数据从外部源传输到内存缓冲区。 查找:查找:重新设置流的当前位置,以便随机读写。需要注意的重新设置流的当前位置,以便随机读写。需要注意的是,并不是所有的流类型都能够支持查找,例如,网络流是,并不是所有的流类型都能够支持查找,例如,网络流没有
50、当前位置的统一概念,因此一般不支持查找。没有当前位置的统一概念,因此一般不支持查找。 说明:说明:Stream类提供有多种操作流的方法,其中类提供有多种操作流的方法,其中Read和和 Write方法是方法是Stream类及其派生类都提供的实现,可支持类及其派生类都提供的实现,可支持在字节级别上对数据进行读写。实际的程序开发中,仅支在字节级别上对数据进行读写。实际的程序开发中,仅支持字节级别的数据处理会给开发人员带来不便。持字节级别的数据处理会给开发人员带来不便。46464.2 数据流数据流 提供字符串或二进制方式读取或写入流。提供字符串或二进制方式读取或写入流。 优点:优点:u方法更灵活方法更
51、灵活u部分方法可解决部分方法可解决TCP消息通信无边界问题消息通信无边界问题47474.2.1 FileStream类类 FileStream类继承于类继承于Stream类,一个类,一个FileStream类的实例类的实例实际上代表一个磁盘文件,使用实际上代表一个磁盘文件,使用FileStream类可以对文件类可以对文件系统上的文件进行读取、写入、打开和关闭操作。系统上的文件进行读取、写入、打开和关闭操作。 1、创建、创建FileStream实例实例 (1)常用的构造函数具有三个参数,例如:常用的构造函数具有三个参数,例如: FileStream(string path,FileMode mo
52、de, FileAccess access) 48484.2.1 FileStream类类 FileMode值值用于指定当文件不存在时是否创建该文件,并用于指定当文件不存在时是否创建该文件,并确定是保留还是改写现有文件的内容确定是保留还是改写现有文件的内容 49494.2.1 FileStream类类 FileAccess值值是枚举的一个成员,它控制对文件的访问权限。表是枚举的一个成员,它控制对文件的访问权限。表4-10列出了列出了FileAccess所有的枚举形式所有的枚举形式 (2)File和和FileInfo类也提供了创建类也提供了创建FileStream对象的方法。其中,对象的方法。其
53、中,OpenRead方法返回只读文件流,方法返回只读文件流,OpenWrite方法返回只写方法返回只写文件流。文件流。 例如:例如:FileStream fs= File.OpenRead(C:File1.txt);50504.2.1 FileStream类类2. 读文件读文件 在获取在获取FileStream实例之后,可利用实例之后,可利用FileStream对象的对象的Read方法读取文件中的数据。该方法用于从流中读取字节块并将方法读取文件中的数据。该方法用于从流中读取字节块并将该数据写入给定字节数组中。其语法形式为:该数据写入给定字节数组中。其语法形式为: public override
54、 int Read(byte array,int offset, int count) array : 存储从文件流中读取的数据。存储从文件流中读取的数据。 offset : array字节数组中开始写入数据的下标,一般为字节数组中开始写入数据的下标,一般为0。 size : 要从文件流中读出字节的大小要从文件流中读出字节的大小 返回值返回值: 从从FileStream中读取的字节数。中读取的字节数。【例例3-2】利用利用FileStream的的Read方法从一个文本文件中读方法从一个文本文件中读取内容并显示在屏幕上。取内容并显示在屏幕上。51514.2.1 FileStream类类3. 写文
55、件写文件Stream类及其所有子类都提供了类及其所有子类都提供了Write方法,方法,FileStream类也不例外。该方法可将字节数组写入流。语法形式为类也不例外。该方法可将字节数组写入流。语法形式为public override void Write (byte buffer, /包含要写入流的数据包含要写入流的数据int offset, / buffer中开始写入数据的位置中开始写入数据的位置int size /要写入流的字节数要写入流的字节数)【例例3-3】利用利用FileStream的的Write方法向文本文件中方法向文本文件中追加数据。追加数据。52524.2.2 MemorySt
56、ream类类 MemoryStream类类表示的是保存在内存中的数据流。由内存表示的是保存在内存中的数据流。由内存流封装的数据可以在内存中直接访问。流封装的数据可以在内存中直接访问。 MemoryStream类的构造函数具有多种重载形式,常用的构类的构造函数具有多种重载形式,常用的构造函数有:造函数有:(1)MemoryStream () 该构造函数初始分配的容量大小为该构造函数初始分配的容量大小为0,随着数据的不断写入容,随着数据的不断写入容量可以量可以不断扩展不断扩展。(2)MemoryStream (Byte) 该构造函数获取的该构造函数获取的MemoryStream实例根据实例根据By
57、te字节数组进字节数组进行初始化,并且实例容量行初始化,并且实例容量大小固定大小固定即为字节数组的长度。由即为字节数组的长度。由于实例的容量不能扩展,该构造函数一般用于数据不发生变于实例的容量不能扩展,该构造函数一般用于数据不发生变化的场合。化的场合。53534.2.2 MemoryStream类类 String testdata = 测试数据测试数据; char chars = testdata.ToCharArray(); Byte bytes = new Byteencoder.GetByteCount(chars, 0, chars.Length, true); MemoryStrea
58、m mem = new MemoryStream(bytes);(3)MemoryStream (int capacity) 通过该构造函数创建初始容量大小为通过该构造函数创建初始容量大小为capacity的实例,并且的实例,并且实例容量大小可扩展。实例容量大小可扩展。【例例3-4】利用利用MemoryStream暂存数据。暂存数据。54544.2.3 网络流网络流 在在System.Net.Sockets名称空间中有一个名称空间中有一个NetworkStream类,用于通过网络套接字发送和接收数据。类,用于通过网络套接字发送和接收数据。 NetworkStream类支持对网络数据的同步或异步
59、访问,它类支持对网络数据的同步或异步访问,它可被视为在数据来源端和接收端之间架设了一个数据通道可被视为在数据来源端和接收端之间架设了一个数据通道. 只用于只用于面向连接的面向连接的数据传输数据传输5555 写入写入操作是指从来源端内存缓冲区到网络上的数据传输;操作是指从来源端内存缓冲区到网络上的数据传输; 读取读取操作是从网络上到接收端内存缓冲区(如字节数组)操作是从网络上到接收端内存缓冲区(如字节数组)的数据传输。的数据传输。4.2.3 网络流(续)网络流(续)56564.2.3 网络流(续)网络流(续) NetworkStream的用法的用法1、构造、构造NetworkStream:(1)
60、利用)利用TcpClient获取网络流对象,例如:获取网络流对象,例如:TcpClient tcpClient=new TcpClient();tcpClient.Connect(, 51888);NetworkStream networkStream = client.GetStream();(2)利用)利用Socket获取网络流对象,例如:获取网络流对象,例如:NetworkStream myNetworkStream = new NetworkStream(mySocket);57574.2.3 网络流(续)网络流(续)2、发送数据、发送数据 public override void W
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 前期物业服务合同规定
- 医疗器械质量监督与售后服务合作合同
- 投融资合作协议书
- 办公共享服务合同
- 陵园修缮施工人员合同
- 停车收费承包协议书范本
- 2025年度北京公关经理职位劳动合同(创新版)
- 合资设立公司合同范本
- 地下储藏室租赁协议书范本
- 广告设计公司年度设计服务合同范本
- 钢结构实习报告
- 2024年建房四邻协议范本
- FTTR-H 全光组网解决方案装维理论考试复习试题
- 民办中学班主任工作考核细则
- 2024年广东佛山市中医院三水医院招聘61人历年高频考题难、易错点模拟试题(共500题)附带答案详解
- 测绘保密协议书保密协议(2024版)
- 原发性血小板减少性紫癜患者的生活质量
- HG20202-2014 脱脂工程施工及验收规范
- 基层医疗机构公共卫生健康教育工作手册(各类表格模板)
- 2024年内蒙古中考地理生物试卷(含答案)
- LY/T 3378-2024木蜡油地板
评论
0/150
提交评论