分享
分销 收藏 举报 申诉 / 59
播放页_导航下方通栏广告

类型CSharp 第04章 套接字与数据流.ppt

  • 上传人:pc****0
  • 文档编号:13174211
  • 上传时间:2026-01-29
  • 格式:PPT
  • 页数:59
  • 大小:659.50KB
  • 下载积分:10 金币
  • 播放页_非在线预览资源立即下载上方广告
    配套讲稿:

    如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。

    特殊限制:

    部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。

    关 键  词:
    CSharp 第04章 套接字与数据流 04 套接 数据流
    资源描述:
    主标题,12,一级标题,12,二级标题,12,*,第,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,与,BinaryWriter,类,本章教学目的,学习,套接字,编程的基本方法,以及数据流相关类的用法。,本章教学要求,(,1,)掌握套接字的概念及,Socket,类用法;,(,2,)掌握面向连接套接字编程、无连接套接字编程基本步骤,(,3,)掌握,FileStream,、,MemoryStream,、,NetworkStream,类的用法;,(,4,)掌握,StreamReader,、,StreamWriter,、,BinaryReader,、,BinaryWriter,类的基本用法。,本章重点,4.1,套接字,一个连接由它的两个端点标识,这样的端点称为套接字。,4.1,套接字(续,),套接字是支持,TCP/IP,协议的网络通信的基本操作单元。可以将套接字看作,不同主机间的进程进行双向通信的端点,。,上图连接,1,的一对套接字为:,(,192.168.2.23,,,5000,)和(,192.168.2.122,,,8888,),上图连接,2,的一对套接字为:,(,192.168.2.23,,,5001,)和(,192.168.2.122,,,8888,),对于,UDP,协议尽管两个进程之间没有建立连接,但是也同样存在发送端点和接收端点,也同样使用套接字的概念。,4.1,套接字(续,),套接字的类型有:,流式,套接字:提供了面向连接的、可靠的、数据无错并且无重复的数据发送服务,而且接收数据的顺序和发送数据的顺序是相同的。,流式套接字用来实现,TCP,通信。,数据报,套接字:提供了面向无连接的服务,它以独立的数据包形式发送数据,(,数据包长度不能大于,32KB),,不提供正确性检查,也不保证各数据包的发送顺序和接收顺序相同,因此,可能出现数据的重发、丢失等现象。,数据报套接字用来实现,UDP,通信。,原始,套接字:用于直接访问协议的较低层。常用于检验新的协议实现或访问现有服务中配置的新设备,一般不提倡直接使用原始套接字。,原始套接字用来实现,IP,数据包通信。,4.1,套接字(续,),Socket,类包含在,System.Net.Sockets,命名空间中。,一个,Socket,实例包含了一个本地或者一个远程端点的套接字信息。,使用,Socket,类编程,由于很多细节都需要自己考虑,相对来说复杂一些,易出错。一般对套接字编程比较熟悉的人,或者使用非标准协议(自定义的新协议)进行编程的时候,才使用,Socket,类。,Socket,类的构造函数为:,public Socket(AddressFamily addressFamily,/,网络类型,SocketType socketType,/,套接字类型,ProtocolType protocolType);/,使用的协议,4.1,套接字(续,),参数含义:,(,1,),addressFamily,addressFamily,表示网络类型,该参数使用,AddressFamily,枚举指定,Socket,使用的寻址方案,例如,AddressFamily.InterNetwork,表示,IP,版本,4,的地址。,4.1,套接字(续,),4.1,套接字(续,),(,2,),socketType,socketTyp,指定,Socket,的类型,该参数使用,SocketType,枚举指定使用哪种套接字。,例如,:,SocketType.Stream,表明连接是基于流套接字,SocketType.Dgram,表示连接是基于数据报套接字,SocketType.Raw,表示连接基于原始套接字;,详细见课本表,4-2,4.1,套接字(续,),(,3,),protocolType,protocolType,指定,Socket,使用的协议,该参数使用,ProtocolType,枚举指定使用哪种协议。例如,:,ProtocolType.Tcp,表明连接协议是,TCP,ProtocolType.Udp,表明连接协议是,UDP,详细见课本表,4-3,4.1,套接字(续,),Socket,构造函数的三个参数中,对于网络上的,IP,通信来说,,AddressFamily,总是使用,AddressFamily.InterNetwork,枚举值。而,SocketType,参数则与,ProtocolType,参数配合使用,不允许其他的匹配形式,也不允许混淆匹配。下表列出了可用于,IP,通信的组合。,SocketType,ProtocolType,说明,Dgram,Udp,无连接通信,Stream,Tcp,面向连接的通信,Raw,Icmp,Internet,控制报文协议,Raw,Raw,简单,IP,包通信,4.1.1,面向连接的套接字,IP,连接领域有两种通信类型:,面向连接的(,connection-oriented,),无连接的(,connectionless,)。,根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:,服务器监听,客户端请求,连接确认,4.1.1,面向连接的套接字,服务器监听:,是指服务器套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态。,客户端请求:,是指由客户端的套接字提出连接请求,要连接的目标是服务器的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器套接字的地址和端口号,然后再向服务器套接字提出连接请求。,连接确认:,是指当服务器套接字监听到客户端套接字的连接请求时,它就响应客户端套接字的请求,把服务器套接字的信息发给客户端,一旦客户端确认了此信息,连接即可建立。而服务器套接字继续监听其他客户端套接字的连接请求。,4.1.1,面向连接的套接字,1.,创建本地,Socket,2.,调用,Bind,方法绑定到本地端点,3.,在指定端口监听,Listen,1.,创建本地,Socket,2.Connect,连接请求,4.Accept(),5.,收发数据,3.,收发数据,6.Close(),4.Close(),服务器,客户端,4.1.1,面向连接的套接字,Socket(),Bind(),Listen(),Accept(),Receive(),Send(),Close(),Socket(),Connect(),Send(),Receive(),Close(),服务器端 客户端,面向连接的套接字编程,4.1.1,面向连接的套接字,同步,TCP,编写,服务器端程序,的一般步骤为:,1),创建一个包含采用的网络类型、数据传输类型和协议类型的本地套接字对象,并将其与服务器的,IP,地址和端口号绑定。,这个过程可以通过,Socket,类,。,2),在指定的端口进行监听,以便接受客户端连接请求。,3),一旦接受了客户端的连接请求,就根据客户端发送的连接信息创建与该客户端对应的,Socket,对象。,4),根据创建的,Socket,对象,分别与每个连接的客户进行数据传输。,5),根据传送信息情况确定是否关闭与对方的连接。,4.1.1,面向连接的套接字,使用同步,TCP,编写,客户端程序,的一般步骤为:,1),创建一个包含传输过程中采用的网络类型、数据传输类型和协议类型的,Socket,对象。,2),与远程服务器建立连接。,3),与服务器进行数据传输。,4),完成工作后,向服务器发送关闭信息,并关闭与服务器的连接。,4.1.1,面向连接的套接字(续),1.,建立连接(服务器),IPHostEntry local=Dns.GetHostByName(Dns.GetHostName();,IPEndPoint iep=new IPEndPoint(local.AddressList0,1180);,Socket,localSocket,=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);,localSocket.,Bind,(iep);,localSocket.,Listen,(10);,Socket clientSocket=localSocket.,Accept,();,4.1.1,面向连接的套接字(续),1.,建立连接(客户端),IPAddress remoteHost=IPAddress.Parse(192.168.0.1);,IPEndPoint iep=new IPEndPoint(remoteHost,1180);,Socket localSocket=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);,localSocket.,Connect,(iep);,4.1.1,面向连接的套接字(续),2.,发送、接收信息(服务器),Socket clientSocket=localSocket.Accept();,/,建立连接后,利用,Send,方法向客户端发送信息,clientSocket.Send(Encoding.ASCII.GetBytes(server send Hello);,/,接收客户端信息,byte myresult=new Byte1024;,int receiveNum=clientSocket.Receive(myresult);,Console.WriteLine(,接收客户端消息:,0,Encoding.ASCII.GetString(myresult);,4.1.1,面向连接的套接字(续),2.,发送、接收信息(客户端),/,建立连接成功后,向服务器发送信息,string sendMessage=client send Message Hello+DateTime.Now;,localSocket.Send(Encoding.ASCII.GetBytes(sendMessage);,Console.WriteLine(,向服务器发送消息,:0,sendMessage);,/,接收服务器信息,byte result=new Byte1024;,localSocket.Receive(result);,Console.WriteLine(,接收服务器消息:,0,Encoding.ASCII.GetString(result);,4.1.1,面向连接的套接字(续),3.,关闭连接,通信完成后,必须先用,Shutdown,方法停止会话,然后关闭,Socket,实例,。,例如:,sock.Shutdown(SocketShutdown.Both);,sock.Close();,4.1.1,面向连接的套接字(续),面向连接的套接字编程举例(控制台应用程序),一对一通信举例,课堂演示(书上代码组合),一对多通信举例,【,例题,4-1】,使用同步,Socket,实现客户端与服务器端的消息通信。其中,服务器可以与多个客户端通信,并随时接收客户端发送的消息。,使用控制台应用程序,编写代码简单;但是发送消息内容不可变,界面不美观。,4.1.1,面向连接的套接字(续),一对一通信(,Socket,实现控制台应用程序),服务器端和客户端,可以不开辟线程直接通信,,也可以开辟线程进行通信;,开辟线程实现时:,服务器端(,12,个线程),接收线程,1,个(也可以没有),收消息线程,1,个,客户端(,1,个线程),接收消息线程,1,个,注意:本章内所说的线程个数只涉及基本通信,不考虑其他情况下开辟的线程。,4.1.1,面向连接的套接字(续),一对多通信(,Socket,实现,控制台应用程序,),服务器端(开辟线程数,1+n,个),:,接收连接线程,1,:负责接收客户端的连接;,接收消息线程(,1-n,):负责接收来自客户端的消息;,n,表示与服务端相连的客户端的个数;,客户端(开辟线程数,1,个),:,接收消息线程,1,:负责接收来自服务器的消息。,4.1.1,面向连接的套接字(续),面向连接套接字通信举例(,windows Form,版),1,对,1,通信,【,补充例题,E01-SocketCommunication(1Vs1)】,1,对多通信,【,补充例题,E01-SocketCommunication(1VsN)】,创建,windows Froms,应用程序时,界面美观、消息内容可自定义;但需要考虑,跨线程操作界面控件,;这种程序是实际应用中最常用的,。,1,对,1,通信(,winForm,版)程序运行界面截图,1,对多通信(,winForm,版)程序运行界面截图,4.1.1,面向连接的套接字(续),一对一通信(,Socket,实现,WinForm,应用程序),服务器端,(开辟线程数,2,个),接收连接线程,1,:负责接收客户端的连接;,接收消息线程,1,:负责接收来自客户端的消息;,客户端,(开辟线程数,1,个),接收消息线程,1,:负责接收来自服务器的消息。,一对多通信(,Socket,实现,WinForm,应用程序,),服务器端(开辟线程数,1+n,个),:,接收连接线程,1+,接收消息线程,n,个,客户端(开辟线程数,1,个),:,接收消息线程,1,个,4.1.2,无连接的套接字,UDP,使用无连接的套接字,无连接的套接字不需要在网络设备之间发送连接信息。,注意,:,必须使用,Bind,方法将套接字绑定到一个本地地址和端口之后才能使用,ReceiveFrom,方法接收数据,如果只发送而不接收,则不需要使用,Bind,方法。,4.1.2,无连接的套接字,1.,创建本地,Socket,2.,调用,Bind,方法绑定到本地端点,3.,接收数据,ReceiveFrom,1.,创建本地,Socket,4.,发送数据,SendTo,4.,接收数据,ReceiveFrom,5.Close(),5.Close(),机器,1,机器,2,2.,调用,Bind,方法绑定到本地端点,3.,发送数据,SendTo,4.1.2,无连接的套接字,Socket(),Bind(),ReceiveFrom(),SendTo(),Close(),Socket(),Bind(),SendTo(),ReceiveFrom(),Close(),设备,1,设备,2,无连接套接字编程,4,.2 数据流,流(,stream,)是对串行传输的数据(以字节为单位)的一种抽象表示,底层的设备可以是文件、外部设备、主存、网络套接字等。,4,.2 数据流,流提供三种基本操作:,写入:,将数据从内存缓冲区传输到外部源。,读取:,将数据从外部源传输到内存缓冲区。,查找:,重新设置流的当前位置,以便随机读写。需要注意的是,并不是所有的流类型都能够支持查找,例如,网络流没有当前位置的统一概念,因此一般不支持查找。,说明:,Stream,类提供有多种操作流的方法,其中,Read,和,Write,方法是,Stream,类及其派生类都提供的实现,可支持在字节级别上对数据进行读写。实际的程序开发中,仅支持字节级别的数据处理会给开发人员带来不便。,4,.2 数据流,.NET Framework,提供一些类能够以字符串或二进制方式读取或写入流。,优点:,方法更灵活;,部分方法可解决,TCP,消息通信无边界问题;,4.2.1 FileStream,类,FileStream,类继承于,Stream,类,一个,FileStream,类的实例实际上代表一个磁盘文件,使用,FileStream,类可以对文件系统上的文件进行读取、写入、打开和关闭操作。,1,、创建,FileStream,实例,(1),常用的构造函数具有三个参数,例如:,FileStream(string path,FileMode mode,FileAccess access),4.2.1 FileStream,类,FileMode,值,用于指定当文件不存在时是否创建该文件,并确定是保留还是改写现有文件的内容,4.2.1 FileStream,类,FileAccess,值,是枚举的一个成员,它控制对文件的访问权限。表,4-10,列出了,FileAccess,所有的枚举形式,(2)File,和,FileInfo,类也提供了创建,FileStream,对象的方法。其中,,OpenRead,方法返回只读文件流,,OpenWrite,方法返回只写文件流。,例如:,FileStream fs=File.OpenRead(C:File1.txt);,4.2.1 FileStream,类,2.,读文件,在获取,FileStream,实例之后,可利用,FileStream,对象的,Read,方法读取文件中的数据。该方法用于从流中读取字节块并将该数据写入给定字节数组中。其语法形式为:,public override,int,Read(,byte,array,int,offset,int,count),array :,存储从文件流中读取的数据。,offset:array,字节数组中开始写入数据的下标,一般为,0,。,size :,要从文件流中读出字节的大小,返回值,:,从,FileStream,中读取的字节数。,【,例,4-2】,利用,FileStream,的,Read,方法从一个文本文件中读取内容并显示在屏幕上。,4.2.1 FileStream,类,3.,写文件,Stream,类及其所有子类都提供了,Write,方法,,FileStream,类也不例外。该方法可将字节数组写入流。语法形式为,public override void Write(,byte buffer,/,包含要写入流的数据,int offset,/buffer,中开始写入数据的位置,int size /,要写入流的字节数,),【,例,4-3】,利用,FileStream,的,Write,方法向文本文件中追加数据。,4.2.2 MemoryStream,类,MemoryStream,类,表示的是保存在内存中的数据流。由内存流封装的数据可以在内存中直接访问。,MemoryStream,类的构造函数具有多种重载形式,常用的构造函数有:,(,1,),MemoryStream(),该构造函数初始分配的容量大小为,0,,随着数据的不断写入容量可以,不断扩展,。,(,2,),MemoryStream(Byte),该构造函数获取的,MemoryStream,实例根据,Byte,字节数组进行初始化,并且实例容量,大小固定,即为字节数组的长度。由于实例的容量不能扩展,该构造函数一般用于数据不发生变化的场合。,4.2.2 MemoryStream,类,String testdata=,测试数据,;,char chars=testdata.ToCharArray();,Byte bytes=new Byteencoder.GetByteCount(chars,0,chars.Length,true);,MemoryStream mem=new MemoryStream(bytes);,或者:,byte bytes=Encoding.Unicode.GetBytes(aaasd);,MemoryStream mem=new MemoryStream(bytes);,(,3,),MemoryStream(int capacity),通过该构造函数创建初始容量大小为,capacity,的实例,并且实例容量大小可扩展。,【,例,4-4】,利用,MemoryStream,暂存数据。,4.2.3,网络流,在,System.Net.Sockets,名称空间中有一个,NetworkStream,类,用于通过网络套接字发送和接收数据,。,NetworkStream,类支持对网络数据的同步或异步访问,它可被视为在数据来源端和接收端之间架设了一个数据通道,.,NetWorkStream,只用于,面向连接的,数据传输,写入,操作是指从来源端内存缓冲区到网络上的数据传输;,读取,操作是从网络上到接收端内存缓冲区(如字节数组)的数据传输。,4.2.3,网络流(续),4.2.3,网络流(续),NetworkStream,的用法,1,、,构造,NetworkStream,:,(,1,),利用,TcpClient,获取网络流对象,,例如:,TcpClient tcpClient=new TcpClient();,tcpClient.Connect(,51888);,NetworkStream networkStream=client.GetStream();,(,2,),利用,Socket,获取网络流对象,,例如:,NetworkStream myNetworkStream=new NetworkStream(mySocket);,4.2.3,网络流(续),2,、发送数据,public override void,Write,(byte buffer,int offset,int size),4.2.3,网络流(续),3,、接收数据,public override int Read(,InAttribute OutAttribute byte buffer,int offset,int size),各参数的含义,:,buffer:,内存中用于存储从,NetworkStream,读取的数据的位置。,offset:buffer,中开始将数据存储到的位置。,Size:,要从,NetworkStream,中读取的字节数。,返回值,:,实际从,NetworkStream,中读取的字节数。,4.2.3,网络流(续),Write,方法:,NetworkStream,对象的,Write,方法的返回值为,void,,该对象之所以不返回实际发送的字节数,是因为能保证字节数组中的数据全部发送到,TCP,发送缓冲区中。,在使用,NetworkStream,对象的,Write,方法前最好先检测,NetworkStream,对象的,Writeable,属性是否为,True,。,如果发送的全部是单行文本信息,创建,NetworkStream,对象后,使用,StreamReader,和,StreamWriter,的,ReadLine,和,WriteLine,方法更简单。,4.2.3,网络流(续),Read,方法:,调用,NetworkStream,类的,Read,方法前应确保,NetworkStream,对象的,CanRead,属性值有效,由于有可能,TCP,接收缓冲区还没有接收到对方发送过来的指定长度的数据,所以,Read,方法有一个整型的返回值。,如果远程主机关闭了套接字连接,并且此时有效数据已经被完全接收,那么,Read,方法的返回值将会是,0,字节。,4.2.3,网络流(续),使用,NetworkStream,对象时,,需要注意:,(,1,)通过,DataAvailable,属性,,可以迅速查看在缓冲区中是否有数据等待读出。,(,2,)网络流没有当前位置的概念,因此它不支持对数据流的查找和随机访问,,NetworkStream,对象的,CanSeek,属性始终返回,false,,读取,Position,属性和调用,Seek,方法时,都会引发,NotSupportedException,异常。,(,3,)网络数据传输完成后,不要忘记用,Close,方法,关闭,NetworkStream,对象。,4.2.4 StreamWriter,与,StreamReader,类,可以看到所有的,NetworkStream,、,MemoryStream,、,FileStream,类都提供了以字节为基本单位的读写方法,但是这种方法需要首先将待写入的数据转化为字节数组后才能够进行读写,当操作的是使用字符编码的文本数据时,给开发人员带来了不便。,StreamReader,类主要完成以一种特定的编码从流中读取字符的功能,一般用于对文本数据的读取操作;,StreamWriter,类则主要以特定的编码向流中写入字符,一般用于对文本数据的写操作。,4.2.4 StreamWriter,与,StreamReader,类,1,、创建,StreamWriter,实例,(,1,),StreamWriter(,String path,),根据文件路径创建以,UTF-8,编码,StreamWriter,对象。例如:,StreamWriter sw=new StreamWriter(C:file1.txt);,(,2,),File,及,FileInfo,类提供的,CreateText,方法。例如:,StreamWriter sw=,File.CreateText,(C:file1.txt);,4.2.4 StreamWriter,与,StreamReader,类,1,、创建,StreamWriter,实例(续),(,3,),StreamWriter(Stream stream),直接使用流对象创建,StreamWriter,对象。例如:,FileStream fs=new FileStream(filePath,FileMode.Open,FileAccess.ReadWrite);,StreamWriter sw=new StreamWriter(fs);,如果已经有了网络流对象,同样可以直接对网络流对象进行封装,。,NetworkStream networkStream=client.GetStream();,StreamWriter sw=new StreamWriter(networkStream);,4.2.4 StreamWriter,与,StreamReader,类,2,、写入文本,利用,StreamWriter,类将以一种特定的编码向流中写入字符。常见方法如下所示:,Write(),:,向数据流写入数据。,Write(),方法只是把传送给它的字符串写入流,但不追加换行符,因此可以使用,Write(),语句写入完整的句子或段落。,WriteLine(),:,向数据流写入指定数据和一个换行符。,Close(),:,关闭流。,【,例,4-5】,利用,StreamWriter,类向,C,盘中的文本文件,file1.txt,中写入一行数据。,4.2.4 StreamWriter,与,StreamReader,类,3.,创建,StreamReader,实例,(,1,),SteamReader(Stream stream),利用流对象创建,SteamReader,对象。例如:,NetworkStream networkStream=client.GetStream();,SteamReader sr=new SteamReader(networkStream),(,2,),SteamReader(String path),如果需要处理的是文件流,则可以根据文件路径创建一个以,UTF8,编码的,SteamReader,对象。例如:,SteamReader sr=new SteamReader(C:file1.txt);,4.2.4 StreamWriter,与,StreamReader,类,读取文本,利用,StremReader,将以一种特定的编码从流中读取字符。常用方法有:,ReadLine(),:读取数据直到遇到换行符(,Unix,)或者回车换行(,Windows,)为止。,ReadToEnd(),:读取到文件尾的全部数据。,Peek(),:返回数据中下一个可用字符的编码值,如到达文件末尾则,Peek(),方法的值为,-1,。,Close(),:关闭流,使用,StreamReader,之后,需要调用,Close,方法关闭流。,【,例,4-6】,利用,StreamReader,类将文本文件中的内容在控制台中显示。,4.2.5 BinaryReader,和,BinaryWriter,类,BinaryReader,和,BinaryWriter,类,,用于以,二进制模式,读写流。,它们提供的一些读写方法是对称的,比如针对不同的数据结构,,BinaryReader,提供了,ReadByte,、,ReadBoolean,、,ReadInt,、,ReadInt16,、,ReadDouble,、,ReadString,等方法,与之对应,BinaryWriter,则提供了多个重载,Write,方法。例如当,Write,方法传递的参数为,Int32,类型时,,BinaryWriter,类的,Write,方法将,Int32,类型数据转化为长度为,4,的字节数组,并将字节流传递给一个,Stream,对象。,方法详细说明参看课本表,4-13,【,例,4-7】,向二进制文件中写入数据。,本章习题及实验,习题:习题,2,、习题,4,实验:本章无实验。,
    展开阅读全文
    提示  咨信网温馨提示:
    1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
    2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
    3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
    4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
    5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
    6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:0574-28810668;投诉电话:18658249818。

    开通VIP折扣优惠下载文档

    自信AI创作助手
    关于本文
    本文标题:CSharp 第04章 套接字与数据流.ppt
    链接地址:https://www.zixin.com.cn/doc/13174211.html
    页脚通栏广告

    Copyright ©2010-2026   All Rights Reserved  宁波自信网络信息技术有限公司 版权所有   |  客服电话:0574-28810668    微信客服:咨信网客服    投诉电话:18658249818   

    违法和不良信息举报邮箱:help@zixin.com.cn    文档合作和网站合作邮箱:fuwu@zixin.com.cn    意见反馈和侵权处理邮箱:1219186828@qq.com   | 证照中心

    12321jubao.png12321网络举报中心 电话:010-12321  jubao.png中国互联网举报中心 电话:12377   gongan.png浙公网安备33021202000488号  icp.png浙ICP备2021020529号-1 浙B2-20240490   


    关注我们 :微信公众号  抖音  微博  LOFTER               

    自信网络  |  ZixinNetwork