第十六讲 Stoket编程.doc_第1页
第十六讲 Stoket编程.doc_第2页
第十六讲 Stoket编程.doc_第3页
第十六讲 Stoket编程.doc_第4页
第十六讲 Stoket编程.doc_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第十六讲 Stocket编程一、 Stocket套接字提供对网络通信的基本操作,常用的类型有两种:1. 流式套接字提供连接的、可靠的、数据无错并且无重复的数据发送服务,发送的数据按顺序接收。无长度限制线路占用率高。TCP协议使用这种接口。如网页浏览、下载文件。2. 数据报式套接字提供面向无连接的服务,以独立的数据包形式发送数据,不提供正确性检查,不保证各数据包的发送顺序,可能出现数据的重发、丢失等现象。接收的顺序由路由决定,线路占用率低,数据包长度不能大于32KB.UDP协议使用这种接口,如QQ。面向连接就像打电话,一直占线,先发先至。面向无连接就像寄信,只管收发,什么时候到由邮局定。与这个比方不同的是面向连接的方式为了保证安全可靠,速度不如无连接方式。首先我们解释一下在网络编程时候,经常遇到的几个概念:同步(synchronous)、异步(asynchronous)、阻塞(Block)和非阻塞(Unblock):所谓异步方式,就是发送方发送数据包以后,不等接受方响应,就接着发送下一个数据包。同步方式就是当发送方发送一个数据包以后,一直等到接受方响应后,才接着发送下一个数据包。阻塞套接字是指执行此套接字的网络调用时,直到调用成功才返回,否则此套节字就一直阻塞在网络调用上,比如调用StreamReader 类的Readlin ( 方法读取网络缓冲区中的数据,如果调用的时候没有数据到达,那么此Readlin ( 方法将一直挂在调用上,直到读到一些数据,此函数调用才返回;非阻塞套接字是指在执行此套接字的网络调用时,不管是否执行成功,都立即返回。同样调用StreamReader 类的Readlin ( 方法读取网络缓冲区中数据,不管是否读到数据都立即返回,而不会一直挂在此函数调用上。在Windows网络通信软件开发中,最为常用的方法就是异步非阻塞套接字。平常所说的C/S(客户端/服务器)结构的软件采用的方式就是异步非阻塞模式的。二、 网络通信地址网络通信地址用对象IPEndPoint来表示,IPEndPoint类的成员有两个:1. Address属性:IP地址,不同的主机IP地址不同。2. Port属性:端口号,同一主机的不同线程可通过不同的端口号,完成不同的通信处理。通过IPHostEntry类,将一个域名(主机名)与一组IP地址关联。它有两个属性:1. AddressList属性:以一个IPAdress数组的形式存放了与域名相关联的IP地址列表。2. HostName属性:即域名。通过Dns类,向TCP/IP协议的应用程序提供域名服务。常用的静态方法有三个:1. GetHostName:返回主机名称。2. GetHostByName:获取由参数指定的主机名的DNS信息,返回IPHostEntry类型的对象。3. Resolve:域名解析,将由参数指定的域名转换为IP地址,返回IPHostEntry类型的对象。三、 常用的属性和方法属性 说明 AddressFamily 获取Socket的地址族。 *Available 获取已经从网络接收且可供读取的数据量。 *Blocking 获取或设置一个值,该值指示Socket是否处于阻塞模式。 *Connected 获取一个值,该值指示Socket是否已连接到远程资源。 Handle 获取Socket的操作系统句柄。 *LocalEndPoint 获取本地终结点。 ProtocolType 获取Socket的协议类型。 *RemoteEndPoint 获取远程终结点。 SocketType 获取Socket的类型。方法 说明 *Accept 创建新的Socket以处理传入的连接请求。 BeginAccept 开始一个异步请求,以创建新的Socket来接受传入的连接请求。 BeginConnect 开始对网络设备连接的异步请求。 BeginReceive 开始从连接的Socket中异步接收数据。 BeginReceiveFrom 开始从指定网络设备中异步接收数据。 BeginSend 将数据异步发送到连接的 BeginSendTo 向特定远程主机异步发送数据。 *Bind 使Socket与一个本地终结点相关联。 *Close 强制Socket连接关闭。 *Connect 建立到远程设备的连接。*DisConnect 建立到远程设备的连接。EndAccept 结束异步请求以创建新的Socket来接受传入的连接请求 EndConnect 结束挂起的异步连接请求。 EndReceive 结束挂起的异步读取。 EndReceiveFrom 结束挂起的、从特定终结点进行异步读取。 EndSend 结束挂起的异步发送 EndSendTo 结束挂起的、向指定位置进行的异步发送。 GetSocketOption 返回Socket选项的值。 IOControl 为Socket设置低级别操作模式 *Listen 将Socket置于侦听状态。 *Receive 接收来自连接Socket的数据。 ReceiveFrom 接收数据文报并存储源终结点。 Select 确定一个或多个套接字的状态。 *Send 将数据发送到连接的 *SendTo 将数据发送到特定终结点。 SetSocketOption 设置Socket选项。 *Shutdown 禁用某Socket上的发送和接收。四、Socket编程对于TCP的Socket编程,主要分二部分:(一)、服务端Socket侦听:服务端Socket侦听主要分以下几个步骤,按照以下几个步骤我们可以很方便的建立起一个Socket侦听服务,来侦听尝试连接到该服务器的客户Socket,从而建立起连接进行相关通讯。1、创建IPEndPoint实例,用于Socket侦听时绑定IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 6001);2、创建套接字实例/创建一个套接字serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);这里创建的时候用ProtocolType.Tcp,表示建立一个面向连接(TCP)的Socket。3、将所创建的套接字与IPEndPoint绑定/将所创建的套接字与IPEndPoint绑定serverSocket.Bind(ipep);4、设置套接字为收听模式/设置套接字为收听模式serverSocket.Listen(10);以上这四步,我们已经建立了Socket的侦听模式,下面我们就来设置怎么样来获取客户Socket连接的实例,以及连接后的信息发送。5、在套接字上接收接入的连接while (true) try /在套接字上接收接入的连接 clientSocket = serverSocket.Accept(); clientThread = new Thread(new ThreadStart(ReceiveData); clientThread.Start(); catch (Exception ex) MessageBox.Show(listening Error: + ex.Message); 通过serverSocket.Accept()来接收客户Socket的连接请求,在这里用循环可以实现该线程实时侦听,而不是只侦听一次。当程序运行serverSocket.Accept()时,会等待,直到有客户端Socket发起连接请求时,获取该客户Socket,如上面的clientSocket。在这里我用多线程来实现与多个客户端Socket的连接和通信,一旦接收到一个连接后,就新建一个线程,执行ReceiveData功能来实现信息的发送和接收。6、在套接字上接收客户端发送的信息和发送信息private void ReceiveData() bool keepalive = true; Socket s = clientSocket; Byte buffer = new Byte1024; /根据收听到的客户端套接字向客户端发送信息 IPEndPoint clientep = (IPEndPoint)s.RemoteEndPoint; lstServer.Items.Add(Client: + clientep.Address + (+clientep.Port+); string welcome = Welcome to my test sever ; byte data = new byte1024; data = Encoding.ASCII.GetBytes(welcome); s.Send(data, data.Length, SocketFlags.None); while (keepalive) /在套接字上接收客户端发送的信息 int bufLen = 0; try bufLen = s.Available; s.Receive(buffer, 0, bufLen, SocketFlags.None); if (bufLen = 0) continue; catch (Exception ex) MessageBox.Show(Receive Error: + ex.Message); return; clientep = (IPEndPoint)s.RemoteEndPoint; string clientcommand = System.Text.Encoding.ASCII.GetString(buffer).Substring(0, bufLen); lstServer.Items.Add(clientcommand + (+clientep.Address + :+clientep.Port+); 通过IPEndPoint clientep = (IPEndPoint)s.RemoteEndPoint;我们可以获取连接上的远程主机的端口和IP地址,如果想查询该主机的其它属性如主机名等,可用于上一篇讲的Dns.GetHostByAddress(string ipAddress)来返回一个IPHostEntry对象,就可以得到。另外我们要注意的是,通过Socket发送信息,必须要先把发送的信息转化成二进字进行传输,收到信息后也要把收到的二进字信息转化成字符形式,这里可以通过Encoding.ASCII.GetBytes(welcome);和Encoding.ASCII.GetString(buffer).Substring(0, bufLen);来实现。以上就是服务端Socket侦听模式的实现,只要有远程客户端Socket连接上后,就可以轻松的发送信息和接收信息了。下面我们来看看客户端Socket是怎么连接上服务器的。(二)、客户端连接客户端Socket连接相对来说比较简单了,另外说明一下,在执行客户端连接前,服务端Socket侦听必须先启动,不然会提示服务器拒绝连接的信息。1、创建IPEndPoint实例和套接字/创建一个套接字IPEndPoint ipep = new IPEndPoint(IPAddress.Parse(), 6001);clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);这个跟服务端Socket侦听差不多,下面一步由服务端Socket的侦听模式变成连接模式。2、将套接字连接到远程服务器while (true)/接收服务器信息 int bufLen = 0; try bufLen = clientSocket.Available; clientSocket.Receive(data, 0, bufLen, SocketFlags.None); if (bufLen = 0) continue; catch (Exception ex) MessageBox.Show(Receive Error: + ex.Message); return; string clientcommand = System.Text.Encoding.ASCII.GetString(data).Substring(0, bufLen); lstClient.Items.Add(clientcommand); 前面已说明,如果在执行Socket连接时,服务器的Socket侦听没有开启的话,会产生一个SocketException异常,如果没有异常发生,那恭喜你,你已经与服务器连接上了,接下来就可以跟服务器通信了。3、接收信息while (true)/接收服务器信息 int bufLen = 0; try bufLen = clientSocket.Available; clientSocket.Receive(data, 0, bufLen, SocketFlags.None);if (bufLen = 0)continue;catch (Exception ex)MessageBox.Show(Receive Error: + ex.Message);return;string clientcomman

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论