欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > PPT文档下载  

    网络编程书籍讲义(第八讲).ppt

    • 资源ID:5301408       资源大小:361KB        全文页数:22页
    • 资源格式: PPT        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    网络编程书籍讲义(第八讲).ppt

    1,人民邮电出版社,第8章 TCP程序设计,2,8.1 TCP网络程序设计模型,8.1.1服务器端工作流程基于C/S结构的程序在工作时,服务器端的应用程序应该首先启动,以等待客户的服务请求。其具体工作流程可以分为以下八个步骤:第一步:使用WSAStartup()函数检查系统协议栈的安装情况。只有在协议栈正确安装的情况下,才可以执行以下的各步骤。常用的调用格式有如下两种:WSAStartup(0 x0202,&wsaData);WSAStartup(MAKEWORD(2,2),&wsaData);注意:这里所使用的Winsock为2.2版,也可以使用其它版本的Winsock。第二步:使用socket()或WSASocket()函数创建服务器端通信的套接口。如果套接口创建不成功,也不能执行以下的各操作,并且要调用WSACleanup()函数,结束Windows Sockets API的使用。这一步调用过程确定了相关五元组的协议。常用的调用格式有如下几种:,3,8.1 TCP网络程序设计模型,8.1.1服务器端工作流程SOCKET serverSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);SOCKET serverSocket=socket(AF_INET,SOCK_STREAM,0);SOCKET serverSocket=WSASocket(AF_INET,SOCK_STREAM,IPPROTO_TCP,NULL,0,WSA_FLAG_OVERLAPPED);SOCKET serverSocket=WSASocket(AF_INET,SOCK_STREAM,0,NULL,0,WSA_FLAG_OVERLAPPED);注意:调用不成功时返回INVALID_SOCKET。,4,8.1 TCP网络程序设计模型,8.1.1服务器端工作流程第三步:使用bind()函数将创建的套接口与服务器地址绑定。它确定了相关五元组中的本地IP地址和端口号。常用调用格式:bind(serverSocket,(const struct sockaddr*)&localaddr,sizeof(sockaddr);bind(serverSocket,(SOCKADDR*)&localaddr,sizeof(sockaddr);bind(serverSocket,(sockaddr*)&localaddr,sizeof(sockaddr);bind(serverSocket,(LPSOCKADDR)&localaddr,sizeof(sockaddr);注意:本机地址有多种表示方法,它们是等价的。第四步:使用listen()函数使服务器套接口做好接收连接请求的准备。该函数的调用格式如下:listen(serverSocket,queuelen);注意:第二个参数是请求队列的长度,用以限制排队请求的客户数,它与协议的实现有关,一般给queuelen赋值为5。,5,8.1 TCP网络程序设计模型,8.1.1服务器端工作流程第五步:使用accept()或WSAAccept()函数接收来自客户端由connect()发出的连接请求。常用格式:SOCKET Newsock=accept(serverSocket,(struct sockaddr*)&clientaddr,&clientaddr_len);该函数的参数中,由参数clientaddr返回客户端协议、IP地址和端口信息,至此一个通信所需的五元组已建立。第六步:连接建立连接后,使用send()或WSASend()函数发送数据,或使用recv()或WSARecv()函数接收数据。具体使用实例见下节的实例程序。第七步:使用closesocket()函数关闭套接口。它的使用方法很简单:closesocket(serverSocket);,6,8.1 TCP网络程序设计模型,8.1.1服务器端工作流程第八步:最后调用WSACleanup()函数,结束Windows Sockets API的使用。它是一个无参函数,在程序中直接调用即可:WSACleanup();至此,服务器的工作过程结束。当然实际的服务器程序是比较复杂的,这里只是对它的基本流程进行了说明。,7,8.1 TCP网络程序设计模型,8.1.2客户端工作流程客户端相对服务器端来说,其工作过程较为简单。客户端应用程序的工作流程如下:第一步:使用WSAStartup()函数检查系统协议栈的安装情况。其调用格式与服务器端调用格式类似:WSAStartup(0 x0202,&wsaData);WSAStartup(MAKEWORD(2,2),&wsaData);第二步:使用socket()或WSASocket()函数创建客户端套接口。其调用格式同服务器端调用格式类似:SOCKET clientSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);,8,8.1 TCP网络程序设计模型,8.1.2客户端工作流程第三步:使用connect()或WSAConnect()函数发出与服务器建立连接的请求。常用格式如下:connect(clientSocket,(struct sockaddr*)&serveraddr,sizeof(serveraddr);如果客户想连接的计算机没有监听指定端口的进程,则请求连接的connect()调用就会失败,并发生代码为WSAECONNREFUSED的错误。另一种常见的错误代码是WSAETIMEDOUT,这种情况一般发生在试图连接的计算机不能使用时,如客户与要连接的服务器之间路由不通、服务器主机硬件故障或者服务器不在网络上等。,9,8.1 TCP网络程序设计模型,8.1.2客户端工作流程注意:serveraddr参数是指向远程服务器地址的一个指针,因此在调用此函数前一定要知道远程服务器的地址和端口号,并把其值赋给serveraddr结构量,否则无法使用该函数。第四步:连接建立后,使用send()或WSASend()函数发送数据,或使用recv()或WSARecv()函数接收数据。第五步:使用closesocket()函数关闭套接口。第六步:最后调用WSACleanup()函数,结束Windows Sockets API的使用。至此,一次客户向服务器请求服务的过程结束。,10,8.1 TCP网络程序设计模型,8.1.3服务器与客户机通信过程第7章我们讨论过服务器与客户通信的过程要用一个五元组来标识。这个五元组是:(协议,本地IP地址,本地端口号,远程IP地址,远程端口号)。对于面向连接的(TCP协议)通信来说,服务器与客户机之间的连接建立完成后,这个五元组就建立了,如表8-1所示。,11,8.1 TCP网络程序设计模型,8.1.4基于TCP协议的网络程序框架服务器与客户机进行的上述通信过程可以用图8-1表示。,关闭TCP连接,用三次握手过程建立TCP连接,交换数据,交换数据,WSAStartup(),socket(),listen(),accept(),等待客户连接请求的到来,recv(),send(),closesocket(),WSACleanup(),socket(),connect(),WSAStartup(),send(),recv(),closesocket(),WSACleanup(),图8-1面向连接的客户机-服务器程序工作模型,bind(),12,8.2TCP实例程序1,实例程序说明在Internet协议中,有一个名叫Daytime的非常简单的协议,这个协议由RFC 867定义,它用于返回服务器当前时间和日期。Daytime服务器应用程序忽略客户机发送的任何数据,只是检查本地时钟,并用字符串的形式返回当前日期与时间,客户机可以对取得的这个字符串进行处理,取得有关日期和时间。Daytime协议虽然很简单,但它也很有用,如可用于一个企业服务器与某个时间标准同步,也可用于查检网络的连通性和调试网络程序等工作。基于程序TCP的daytime服务,服务器在TCP端口13侦听,一旦有连接建立,就返回ASCII形式的日期和时间,在传送完成后关闭连接。从客户机接收到的数据则被忽略。本节和实例程序中,我们设计一个Daytime服务器程序,该程序监听客户机的连接请求。如果有客户机与服务器建立连接,服务器就将当前的时间与日期发送给客户机。客户机在收到服务器发送的时间与日期后,以字符串的形式将其显示出来。在图8-2为服务器启动后的窗口,如果有客户端进行了请求并连接成功,则显示访问者的个数。图中表示客户端进行了3次请求。,13,8.2TCP实例程序1,客户端程序运行后的窗口,14,8.3TCP实例程序2,8.3.1 程序要求该程序的要求与中介绍的程序要求相同,只是使用Java工具来实现。服务器端程序运行的窗口如图8-4所示,图中有3个客户端进行了请求。,daytime客户端程序运行结果如图8-5所示,图中客户端程序运行了3次,15,8.3TCP实例程序2,8.3.2服务器程序在Java语言中,设计网络程序的有关类被放在包中。Java语言的网络程序设计其基本原理与VC+中的类似,因为Java语言本身也使用了前面介绍的伯克利套接口来编写网络程序。本节要设计的基于TCP协议的、面向连接的网络程序要使用该包中的ServerSocket类,该类包含了设计一个服务器程序所要求的所有功能。利用ServerSocket类创建一个服务器程序的典型工作流程如下:(1)在指定的监听端口上创建一个ServerSocket对象。(2)调用ServerSocket类型对象的accept()方法在指定的端口监听客户的连接请求。accept()方法在调用时会阻塞当前Java线程,直到收到客户端的请求,accpet()方法返回连接客户端与服务器的Socket对象。(3)调用getInputStream()方法和getOutputStream()方法获得Socket对象的输入流和输出流。(4)服务器与客户端根据要求进行数据的发送与接收,直到有一端请求关闭连接。,16,8.3TCP实例程序2,8.3.2服务器程序(5)服务器和客户端关闭连接。(6)服务器回到第2步,继续监听下一次连接请求,而客户端则运行结束。下面讨论如何创建一个ServerSocket类的对象。ServerSocket类有如下4个构造方法:public ServerSocket()throws IOException:创建一个非绑定任何信息的服务器套接口。public ServerSocket(int port)throws IOException:创建一个绑定到特定端口的服务器套接口。端口为0时,表示在所有空闲端口上创建套接字。public ServerSocket(int port,int queuelength)throws IOException:创建一个绑定到特定端口的服务器套接口。如果连接请求的最大队列长度被设置为50。如果队列满时收到连接请求,则拒绝该连接。public ServerSocket(int port,int queuelength,InetAddress bindaddress)throws IOException:在这种格式中由第3个参数bindaddress指出绑定到套接口的本地地址。,17,8.3TCP实例程序2,8.3.2服务器程序如果创建套接口时发生 I/O 错误,则以上构造方法会抛出IOException异常。所以一般在创建一个套接口时要进行异常处理。ServerSocket类的对象有一个重要的方法accept(),其声明如下:public Socket accept()throws IOException该方法返回一个Socket对象,这个Socket对象表示当前服务器和某个客户端的连接,通过这个Socket对象服务器和客户端可以进行数据交互。Socket和ServerSocket都有一个close()方法,其声明为:public void close()throws IOException该方法用来关闭一个Socket对象,当一个Socket对象被关闭后,将不能再使用。必要的话可以再创建一个新的Socket对象。,18,8.3TCP实例程序2,8.3.3客户端程序Java提供的套接字对伯克利套接口进行了封装,大大的简化了程序员用套接字开发网络应用程序的步骤。利用.Socket类我们可以轻松地开发一个客户端程序,它可以主动创建和目标服务器的连接。Socket类有两个构造方法:public Socket(String host,int port)throws UnknownHostException IOExceptionpublic Socket(InetAddress host,int port)throws IOException上面第一个构造方法的两个参数中,第1个参数host以字符串的形式给出服务器的主机名或IP地址,第2个参数port表示服务器的端口号,如果目标主机未知或有其他错误时抛出UnknownHostException或IOException异常。第二个构造方法其第1个参数是一个用InetAddress类表示的主机IP地址。InetAddress类是Java网络程序设计中最常用的一个类,它是Java语言对IP地址的一种高级表示方法。下面我们对InetAddress类的使用方法作一个简单的介绍。,19,8.3TCP实例程序2,8.3.3客户端程序InetAddress类没有提供公用的构造方法,但我们可以通过下面的方法来创建一个InetAddress对象或InetAddress数组:getLocalHost()方法:获得本机的InetAddress对象。getByName(String host)方法:获得一个指定计算机的InetAddress对象。参数host既可以是主机名也可以是表示IP地址的十进制数字字符串。getAllByName(String host)方法:返回一个InetAddress对象数组,表示指定计算机的所有IP地址。在Internet上存在一些机器具有多个IP地址,这时可以使用该方法取所有地址。getByAddress(byte addr)方法:从IP地址创建一个InetAddress对象,并返回其引用。参数addr可以是4字节的IPv4地址,也可以是16字节的IPv6地址,addr格式要求为网络顺序。,20,8.3TCP实例程序2,8.3.3客户端程序getByAddress(String host,byte addr)方法:从提供的主机host和IP地址创建一个InetAddress对象,并返回其引用。参数host和addr同上。在实际编程时,创建一个InetAddress对象最常用的是getLocalHost()方法和getByName(String host)方法。要注意的是调用上述方法获取InetAddress对象时,如果指定的主机名或IP地址不能被解析,将抛出UnknownHostException异常。例如:try InetAddress address=);catch(UnknownHostException e)System.out.println(Could not find);,21,8.3TCP实例程序2,8.3.3客户端程序为了创建InetAddress对象,Java需要执行主机名和IP地址之间的相互解析工作,这对系统来说可能是一个耗时的过程,为了避免一些重复的解析工作,Java虚拟机内部采取了缓存机制。Socket对象具有下列常用方法:public InetAddress getInetAddress():返回该Socket连接的目标主机的地址。public int getPort():返回该Socket连接的目标主机的端口。public int getLocalPort():返回该Socket绑定的本地端口。public InetAddress getLocalAddress():返回该Socket绑定的本地地址,如尚未绑定则返回null。常在本地主机有多个IP址机时才使用。,22,8.3TCP实例程序2,8.3.3客户端程序public InputStream getInputStream()throws IOException:返回该Socket输入流。public OutputStream getOutputStream()throws IOException:返回该Socket输出流。public synchronized void close()throws IOException:关闭当前Socket。,

    注意事项

    本文(网络编程书籍讲义(第八讲).ppt)为本站会员(牧羊曲112)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开