您好,欢迎访问三七文档
当前位置:首页 > 办公文档 > 招标投标 > 计算机网络(编程部分)
张建忠zhangjz@nankai.edu.cn网络应用程序与SOCKET编程传输层的主要工作追求的目标:可靠性单机用户:应用程序依赖于底层系统的可靠性,系统保证数据传送到底层后不会丢失和重复网络用户:希望互联网能够提供迅速、准确、可靠的通信功能,保证不发生丢失、重复、错序等可靠性问题传输层:保证端对端数据传输的可靠性传输控制协议TCP用户数据报协议UDP点对点通信与端对端通信互联层:点对点通信传输层:端对端通信端对端通信与虚拟通信平台TCP提供的服务TCP提供的服务:面向连接、可靠、全双工数据流TCP提供的服务特征面向连接(ConnectionOrientation)完全可靠性(CompleteReliability)全双工通信(FullDuplexCommunication)流接口(StreamInterface)连接的可靠建立与优雅关闭(ReliableConnectionStartup&GracefulConnectionShutdown)TCP通信过程建立连接(可靠地建立)发送数据(可靠、全双工、流式数据)关闭连接(优雅地关闭)TCP的可靠性实现必要性:TCP建立在IP协议提供的面向非连接、不可靠的数据报投递服务基础之上TCP需要解决的可靠性问题丢失数据的恢复问题(重传)流量控制问题(窗口)可靠建立与关闭连接问题(三次握手)TCP端口与连接TCP端口:一个TCP连接两端的端点TCP端口的表示:16位的二进制数利用TCP端口可以提供多路复用功能著名的TCP端口号用户数据报协议UDPUDP提供的服务:面向非连接、不可靠服务特点面向非连接,数据直接封装在IP数据报中投递不确认,不排序运行效率高,实现简单利用UDP的应用程序要承担可靠性方面的全部工作UDP的端口UDP利用端口对给定主机上的多个目标进行区分UDP端口使用16位二进制数表示TCP和UDP各自拥有自己的端口号网络编程界面TCP/IP协议通常在操作系统的内核中实现编程界面:由操作系统提供的功能调用,可以使应用程序方便地使用内核的功能socket(套接字):TCP/IP网络操作系统为网络程序开发提供的典型网络编程界面Socket的位置应用程序1网络编程接口Socket网络通信协议TCP/IP操作系统WindowsUnix...物理通讯介质应用程序2网络编程接口Socket网络通信协议TCP/IP操作系统WindowsUnix...套接字由加利福尼亚大学伯克利分校(UniversityofCalifornia,Berkeley)首创把网络连接看成一个流(Stream),可以向流写字节,也可以从流读取字节为程序员屏蔽了网络的底层细节(媒体类型、信息包的大小、网络地址、信息重发等)Socket通过绑定机制与驱动程序建立关系(通知自己所对应的IP和Port)发送数据:由Socket交给驱动程序向网络发送接收数据:驱动程序收到与Socket绑定的数据后,由驱动程序交给Socket,应用进程从Sokcet中读取SOCKET常用的操作连接远程机器绑定端口接收远程连接请求监听到达的数据发送数据接收数据关闭连接TCP和UDP工作过程SOCKET套接字数据报套接字(datagramsockets):使用UDP协议,支持主机之间面向非连接、不可靠的信息传输流式套接字(streamsockets):使用TCP协议,支持主机之间面向连接的、顺序的、可靠的、全双工字节流传输Windows、UNIX、Linux都支持socketJava提供的socketMicrosoft提供的socketWindowsSocketsAPI、CAsyncSocket类、WinSock控件CASYNCSOCKET编程--创建SOCKET构造CAsyncSocket对象利用Create创建和初始化socket(1)//在堆栈上构造CAsyncSocket对象CAsyncSocketsock;(2)//在堆上构造CAsyncSocket对象CAsyncSocket*pSocket=newCAsyncSocket;BOOLCreate(UINTnSocketPort=0,intnSocketType=SOCK_STREAM,longlEvent=FD_READ|FD_WRITE|FD_OOB|FD_ACCEPT|FD_CONNECT|FD_CLOSE,LPCTSTRlpszSocketAddress=NULL);创建SOCKET举例(1)//以流方式创建socketCAsyncSocketMySock;BOOLbFlag=MySock.Create(2000,SOCK_STREAM,FD_ACCEPT);if(!bFlag){……//创建套接口错误处理}……(1)//以数据报方式创建socketCAsyncSocketMySock;BOOLbFlag=MySock.Create(2000,SOCK_DGRAM,FD_READ);if(!bFlag){……//创建套接口错误处理}……发送和接收数据报intSendTo(constvoid*lpBuf,intnBufLen,UINTnHostPort,LPCTSTRlpszHostAddress=NULL,intnFlags=0);intReceiveFrom(void*lpBuf,intnBufLen,CString&rSocketAddress,UINT&rSocketPort,intnFlags=0);客户程序的建连请求BOOLConnect(LPCTSTRlpszHostAddress,UINTnHostPort);服务器程序的连接接受侦听连接请求接受连接请求连接到来后触发FD_ACCEPT事件并调用OnAccept虚函数BOOLListen(intnConnectionBacklog=5);virtualBOOLAccept(CAsyncSocket&rConnectedSocket,SOCKADDR*lpSockAddr=NULL,int*lpSockAddrLen=NULL);发送和接收流式数据virtualintSend(constvoid*lpBuf,intnBufLen,intnFlags=0);virtualintReceive(void*lpBuf,intnBufLen,intnFlags=0);关闭SOCKETvirtualvoidClose();编程过程中需要注意的问题(1/3)选中Windows套接字选项编程过程中需要注意的问题(2/3)添加和定制新socket类:重载OnConnect、OnAccept、OnReceive、OnSend等虚函数编程过程中需要注意的问题(3/3)创建套接口:实例化、初始化和关闭关闭套接口JAVA多线程实现:继承THREAD类(1)编写一个Java类,该类需要继承标准类库提供的Thread类在编写的类中重写父类中的run()方法,该方法中需要包含线程执行的代码在需要创建线程时,new一个编写线程类的实例,调用start()方法进行启动调用start()方法后并不立即执行多线程代码,而是使得该线程变为可运行状态(runnable)JAVA多线程实现:继承THREAD类(2)JAVA多线程实现:继承THREAD类(3)JAVA多线程实现:实现RUNNABLE接口(1)编写一个Java类,该类需要实现runnable接口在编写的类中实现run()方法,该方法中需要包含线程执行的代码在需要创建线程时,首先new一个编写类的实例和一个Thread类实例,并将编写类的实例作为参数传递给Thread类实例调用Thread类的start()方法启动线程调用start()方法后并不立即执行多线程代码,而是使得该线程变为可运行状态(runnable)由于Java没有多重继承机制,因此很多情况下需要采用Runnable接口方式实现多线程能够在一个类中包容所有的代码,有利于封装JAVA多线程实现:实现RUNNABLE接口(2)JAVA多线程实现:实现RUNNABLE接口(3)publicclassMyThreadimplementsRunnable{intcount=1,number;publicMyThread(intnum){number=num;System.out.println(创建线程+number);}publicvoidrun(){while(true){System.out.println(线程+number+:计数+count);if(++count==6)return;}}publicstaticvoidmain(String[]args){for(inti=0;i5;i++)newThread(newMyThread(i+1)).start();}}JAVA中的流式SOCKETJavasocket的基础类:java.net.Socket类封装TCP操作流式Socket服务器套接字(ServerSocket):在服务器端创建创建ServerScoket绑定IP地址与端口监听连接请求接收连接请求创建普通Socket(用于发送和接收数据)关闭ServerSocket客户端套接字(Socket):在客户端被创建创建Socket绑定IP地址与端口发送连接请求发送和接收数据关闭Socket常用的SOCKET的构造函数Socket():Createsanunconnectedsocket,withthesystem-defaulttypeofSocketImpl.Socket(InetAddressaddress,intport):CreatesastreamsocketandconnectsittothespecifiedportnumberatthespecifiedIPaddress.Socket(InetAddressaddress,intport,InetAddresslocalAddr,intlocalPort):Createsasocketandconnectsittothespecifiedremoteaddressonthespecifiedremoteport.Socket(Stringhost,intport):Createsastreamsocketandconnectsittothespecifiedportnumberonthenamedhost.Socket(Stringhost,intport,InetAddresslocalAddr,intlocalPort):Createsasocketandconnectsittothespecifiedremotehostonthespecifiedremoteport.SOCKET类的常用方法voidclose():Closesthissocket.voidconnect(SocketAddressendpoint):Connectsthissockettotheserver.InetAddressgetInetAddress():Returnstheaddresstowhichthesocketisconnected.InetAddressgetLocalAddress():Getsthelocaladdresstowhichthesocketisbound.intgetPort():Returnstheremoteportnumbertowhichthissocketisconnected.intgetLocalPort():Returnsthelocalportnumbertowhichthissocketisbound.SocketAddressgetLocalSocketAddress():Returnstheaddre
本文标题:计算机网络(编程部分)
链接地址:https://www.777doc.com/doc-2044570 .html