java之网络编程.ppt
网络编程网络编程网络编程基础网络编程基础vIP地址地址u对于一个基于对于一个基于TCP/IP的网络,每个连接均由的网络,每个连接均由一个称为一个称为IP地址的地址的32位数作为唯一标识位数作为唯一标识u例如例如202.103.34.28u拥有一个以上拥有一个以上IP地址的计算机称为地址的计算机称为多宿主机多宿主机v域名域名u域名即主机名域名即主机名u每次使用域名时,系统都会自动将其转换成数每次使用域名时,系统都会自动将其转换成数字形式的字形式的IP地址地址u在网络中,在网络中,IP地址是唯一的,一个域名对应地址是唯一的,一个域名对应一个一个IP地址,而一个地址,而一个IP地址可以有多个域名对地址可以有多个域名对应应u本地回路的地址本地回路的地址u127.0.0.1ulocalhostvInetAddress类类u包含一个包含一个Internet主机地址的域名和主机地址的域名和IP地址,用如地址,用如下格式显示所包含的信息下格式显示所包含的信息 publicURLgetURL()获取链接所指向的获取链接所指向的URL资源资源publicHyperlinkEvent.EventTypegetEventType()客户与服务器编程客户与服务器编程v创建客户程序创建客户程序Server端端Client端端创建创建ServerSocket对象,对象,在某个端口提供监听服务在某个端口提供监听服务等待来自客户端的服务请求等待来自客户端的服务请求接受客户端的服务请求,接受客户端的服务请求,用返回的用返回的Socket建立连接建立连接向用向用Socket连接建连接建立的流中读写数据立的流中读写数据结束与当前客户的通信,结束与当前客户的通信,等待其他客户请求等待其他客户请求关闭关闭ServerSocket对对象,结束监听服务象,结束监听服务创建创建Socket对象,向对象,向Socket的监听端口发出请求的监听端口发出请求向用向用Socket连接建连接建立的流中读写数据立的流中读写数据关闭关闭Socket,结束与,结束与服务器端的通信服务器端的通信拆除连接拆除连接数据通信数据通信建立连接建立连接tryInetAddressaddress=InetAddress.getByName(“127.0.0.1”);Socketsocket=newSocket(address,4331);DataInputStreamin=newDataInputStream(socket.getInputStream();DataOutputStreamout=newDataOutputStream(socket.getOutputStream();in.close();out.close();socket.close();catch(UnknownHostExceptionuhe)catch(IOExceptionioe)客户端框架客户端框架1trySocketsocket=newSocket();InetAddressaddress=InetAddress.getByName(“127.0.0.1”);InetSocketAddresssocketAddress=newInetSocketAddress(address,4331);socket.connect(socketAddress);DataInputStreamin=newDataInputStream(socket.getInputStream();DataOutputStreamout=newDataOutputStream(socket.getOutputStream();in.close();out.close();socket.close();catch(UnknownHostExceptionuhe)catch(IOExceptionioe)客户端框架客户端框架2tryServerSocketsrvskt=newServerSocket(4331);Socketcltskt=srvskt.accept();DataInputStreamin=newDataInputStream(cltskt.getInputStream();DataOutputStreamout=newDataOutputStream(cltskt.getOutputStream();in.close();out.close();cltskt.close();srvskt.close();catch(IOExceptionioe)服务器端框架服务器端框架v编写服务器应用程序编写服务器应用程序u客户负责呼叫,因此服务器必须建立一个等客户负责呼叫,因此服务器必须建立一个等待接收客户的待接收客户的ServerSocket对象对象u服务器通过服务器通过accept()方法得到与客户端相连方法得到与客户端相连的的Socket对象对象(记为记为sc)后,可以通过后,可以通过sc使用使用getOutputStream()方法打开输出流。该输出方法打开输出流。该输出流指向客户端流指向客户端Socket对象(记为对象(记为mysocket)使)使用用getInputStream()方法获取的输入流。方法获取的输入流。u同样,也可通过同样,也可通过sc使用使用getInputStream()方方法打开输入流法打开输入流u从套接字连接中读取数据与从文件中读取数从套接字连接中读取数据与从文件中读取数据有很大不同。可能在另一端数据发送出来之据有很大不同。可能在另一端数据发送出来之前,就已经开始读取了,这时会前,就已经开始读取了,这时会阻塞本线程阻塞本线程直直到成功读取信息为止到成功读取信息为止u在服务器端的在服务器端的accept()方法也会方法也会阻塞阻塞线程的继续执线程的继续执行,直到接收到客户的呼叫行,直到接收到客户的呼叫u双方通信完毕后,套接字应使用双方通信完毕后,套接字应使用close()方法关闭方法关闭套接字连接套接字连接vSocket类类upublicSocket(InetAddressaddress,intport)throwsIOExceptionupublicSocket(InetAddressaddress,intport,InetAddresslocalAddr,intlocalPort)throwsIOExceptionupublicSocket(Stringhost,intport)throwsUnknownHostException,IOExceptionhost为主机名为主机名upublicSocket(Stringhost,intport,InetAddresslocalAddr,intlocalPort)throwsIOExceptionupublicInetAddressgetInetAddress()upublicInetAddressgetLocalAddress()upublicintgetPort()upublicintgetLocalPort()upublicInputStreamgetInputStream()throwsIOExceptionupublicOutputStreamgetOutputStream()throwsIOExceptionupublicvoidclose()throwsIOExceptionupublicbooleanisConnected()upublicvoidconnect(SocketAddressendpoint)throwsIOExceptionvInetSocketAddressupublicInetSocketAddress(InetAddressaddr,intport)upublicInetSocketAddress(Stringhostname,intport)java.lang.O.SocketA.InetSocketAddressvServerSocket类类upublicServerSocket(intport)throwsIOException端口号必须和客户呼叫的端口号相同。若端口已被占端口号必须和客户呼叫的端口号相同。若端口已被占用或创建用或创建Socket连接时出现错误,则引发异常连接时出现错误,则引发异常IOExceptionupublicServerSocket(intport,intbacklog)throwsIOExceptionbacklog是连接请求队列的最大长度是连接请求队列的最大长度upublicSocketaccept()throwsIOException返回与客户端相连接的返回与客户端相连接的Socket对象对象upublicInetAddressgetInetAddress()返回服务器套接口的本地地址返回服务器套接口的本地地址upublicintgetLocalPort()返回套接字正在侦听的端口返回套接字正在侦听的端口upublicvoidsetSoTimeout(inttimeout)throwsSocketException设置服务器端使用设置服务器端使用accept()侦听客户请求的时间,当侦听客户请求的时间,当ServerSocket对象调用对象调用accept()阻塞的时间超过阻塞的时间超过timeout时,时,将触发将触发SocketTimeoutException事件事件upublicvoidclose()throwsIOException例:例:echo服务器与客户端服务器与客户端vecho协议要求服务器等待到来的连接,把协议要求服务器等待到来的连接,把接收到的每行文本发回给客户端,直到连接收到的每行文本发回给客户端,直到连接终止接终止u服务器与一个客户的连接终止后能响应其他服务器与一个客户的连接终止后能响应其他客户的连接请求客户的连接请求u服务器能同时服务于多个客户服务器能同时服务于多个客户u客户向服务器发送客户向服务器发送“.QUIT”(忽略大小写忽略大小写),服务器将该串发回后即终止连接服务器将该串发回后即终止连接u客户向服务器发送客户向服务器发送“.SHUTDOWN”(忽略大小忽略大小写写),服务器发回,服务器发回”.QUIT”,不再响应后续客,不再响应后续客户请求户请求v在在echo协议中,客户端与服务器建立协议中,客户端与服务器建立Socket连接后向服务器发出串,并读出反连接后向服务器发出串,并读出反馈回来的串。如果反馈回的串为馈回来的串。如果反馈回的串为”.QUIT”,则终止连接则终止连接u如果要终止连接,则向服务器发出如果要终止连接,则向服务器发出”.QUIT”(忽略大小写)(忽略大小写)u如果要使服务器停止接收客户请求,则向服如果要使服务器停止接收客户请求,则向服务器发出务器发出”.SHUTDOWN”(忽略大小写)(忽略大小写)例:简单的浏览器开发例:简单的浏览器开发v用户可以在文本框中输入用户可以在文本框中输入URL地址,地址,Web页面的内容显示在文本区中页面的内容显示在文本区中u显示包含在显示包含在Web页面中的所有超链接页面中的所有超链接u翻译某些基本的翻译某些基本的HTML标记标记u隐藏没有翻译的隐藏没有翻译的HTML标记及内容标记及内容常见常见HTML标记标记vvvvvv加粗加粗v斜体斜体v标记一个段落标记一个段落v区隔标记区隔标记v换行换行vv使特定页面出现在新的浏览器窗体中使特定页面出现在新的浏览器窗体中v项目列表中的第一项项目列表中的第一项项目列表中的第二项项目列表中的第二项v数字列表中的第一项数字列表中的第一项数字列表中的第二项数字列表中的第二项v要求将要求将、标记翻译为标记翻译为”n”v要求将要求将标记翻译为标记翻译为”n*”v要求将要求将标记翻译为标记翻译为Ahref=v忽略其余标记忽略其余标记v翻译某些基本翻译某些基本HTML标记的算法标记的算法u整个原始串按整个原始串按”符号分解,符号分解,前部分包括前部分包括HTML标记和某些选项,后部分为无标记和某些选项,后部分为无标记的文本,也可能为空标记的文本,也可能为空u为分解后的前部分创建为分解后的前部分创建HTMLTag对象,为后部对象,为后部分创建分创建HTMLText对象,并按顺序插入链表中对象,并按顺序插入链表中u在在HTMLTag类的类的toString()中翻译基本中翻译基本HTML标记标记uHTMLTag和和HTMLText由由HTML类派生而来类派生而来v读取指定读取指定URL中的文本中的文本u创建到指定主机和端口的创建到指定主机和端口的Socket连接连接u打开该连接上的字符输入流和输出流打开该连接上的字符输入流和输出流u向服务器发出获取指定文件的命令向服务器发出获取指定文件的命令u从服务器读取指定文件的内容从服务器读取指定文件的内容u关闭流和关闭流和Socket连接连接v获取翻译后的获取翻译后的HTML文本文本u对链表中的每一个元素调用对链表中的每一个元素调用toString()方法,方法,将它们返回的串顺序连接为文本将它们返回的串顺序连接为文本基于客户基于客户/服务器模式的分布计算服务器模式的分布计算v“工作者工作者管理者管理者”分布式系统模型分布式系统模型u一个客户要求多个服务器为其提供服务一个客户要求多个服务器为其提供服务u一个客户可以将一个大型应用分成若干个小一个客户可以将一个大型应用分成若干个小问题,这些小问题可以分别由多个服务器程序问题,这些小问题可以分别由多个服务器程序同时处理,所有这些服务器程序对相应问题求同时处理,所有这些服务器程序对相应问题求得解答后再发送给客户机。客户机汇集所有从得解答后再发送给客户机。客户机汇集所有从服务器程序发来的结果,再输出给用户服务器程序发来的结果,再输出给用户u服务器配置文件服务器配置文件u多个可用服务器的多个可用服务器的IP地址或域名及端口号保存在该文地址或域名及端口号保存在该文件中件中u由客户程序存取由客户程序存取u客户配置文件客户配置文件u用户定义的应用参数用户定义的应用参数服务程序服务程序1服务程序服务程序2服务程序服务程序nLAN或或Internet客户程序客户程序服务配置文件服务配置文件客户配置文件客户配置文件管理者管理者工作者工作者v客户程序框架客户程序框架u阅读服务器配置文件,获得可用服务器信息阅读服务器配置文件,获得可用服务器信息u创建一个创建一个Socket数组管理与每个服务器的连接数组管理与每个服务器的连接u客户端对每个服务器产生一个线程,负责将计客户端对每个服务器产生一个线程,负责将计算数据发给相应服务器并从该服务器回收计算结算数据发给相应服务器并从该服务器回收计算结果果u客户端将计算结果合并,得到原问题的解客户端将计算结果合并,得到原问题的解u关闭与所有服务器的关闭与所有服务器的Socket连接连接v服务器程序框架服务器程序框架u在一个指定的未使用的端口上创建一个在一个指定的未使用的端口上创建一个ServerSocketu等待在这个端口上的连接,一旦获得客户程序的请求,等待在这个端口上的连接,一旦获得客户程序的请求,立即接受这个请求立即接受这个请求u由另一个线程负责建立该连接上的输入流和输出流,由另一个线程负责建立该连接上的输入流和输出流,接收计算数据,进行计算后将结果发送到客户端接收计算数据,进行计算后将结果发送到客户端u服务器可以继续侦听其他的客户连接服务器可以继续侦听其他的客户连接v例:客户端需要完成两个矩阵相乘的运算,例:客户端需要完成两个矩阵相乘的运算,将该运算分成若干部分交给若干台服务器将该运算分成若干部分交给若干台服务器完成并回收结果完成并回收结果u将服务器个数、各服务器地址及端口号保存将服务器个数、各服务器地址及端口号保存在服务器配置文件中在服务器配置文件中u将矩阵大小保存在客户配置文件中将矩阵大小保存在客户配置文件中u客户端读取服务器配置文件和客户配置文件,客户端读取服务器配置文件和客户配置文件,创建到各个服务器的连接,为每个服务器创建创建到各个服务器的连接,为每个服务器创建一个线程负责数据收发。线程将待计算的数据一个线程负责数据收发。线程将待计算的数据发送给相应服务器,并从服务器获得结果发送给相应服务器,并从服务器获得结果u客户端输出结果矩阵客户端输出结果矩阵u服务器在指定端口监听客户端请求,为客户服务器在指定端口监听客户端请求,为客户端分配一个线程进行数据收发,同时服务器可端分配一个线程进行数据收发,同时服务器可以监听其他请求以监听其他请求u该线程接收来自客户端的计算数据,进行计该线程接收来自客户端的计算数据,进行计算后将结果回送给客户端算后将结果回送给客户端UDP数据报数据报v发送数据包发送数据包u用用DatagramPacket类将数据打包类将数据打包upublicDatagramPacket(bytebuf,intlength,InetAddressaddress,intport)upublicDatagramPacket(bytebuf,intoffset,intlength,InetAddressaddress,intport)upublicintgetPort()upublicInetAddressgetAddress()upublicbytegetData()upublicintgetLength()u用用DatagramSocket类的不带参数的构造方法类的不带参数的构造方法创建一个对象,该对象负责发送数据包创建一个对象,该对象负责发送数据包upublicDatagramSocket()throwsSocketExceptionupublicvoidsend(DatagramPacketp)throwsIOExceptionupublicvoidclose()bytedata=“近来好吗近来好吗”.getBytes();InetAddressaddress=InetAddress.getName(“”);DatagramPacketdata_pack=newDatagramPacket(data,data.length,address,980);DatagramSocketmail_out=newDatagramSocket();mail_out.send(data_pack);v接收数据包接收数据包u使用使用DatagramSocket类的如下构造方法创建一类的如下构造方法创建一个对象,其中的参数必须和待接收的数据包的端个对象,其中的参数必须和待接收的数据包的端口号相同口号相同upublicDatagramSocket(intport)throwsSocketException若套接字不能打开或不能绑定到指定的本地端口则抛出若套接字不能打开或不能绑定到指定的本地端口则抛出SocketException异常异常u使用使用DatagramPack类的如下构造方法创建一个类的如下构造方法创建一个数据包,用于接收数据包,用于接收upublicDatagramPacket(bytebuf,intlength)u使用使用DatagramSocket类的类的receive方法接收数据包方法接收数据包upublicvoidreceive(DatagramPacketp)throwsIOExceptionreceive方法可能会方法可能会阻塞阻塞,直到收到数据包,直到收到数据包DatagramSocketmail_in=newDatagramSocket(5666);bytedata=newbyte100;intlength=90;DatagramPacketpack=newDatagramPacket(data,length);mail_in.receive(pack);/intport=pack.getPort();获取获取pack的始发端口号的始发端口号/InetAddressaddr=pack.getAddress();获取获取pack的始发地址的始发地址/intlen=pack.getLength();获取获取pack的字节长度的字节长度/bytereceiveData=pack.getData();获取获取pack的内容的内容mail_in.close();v例例:两个窗口互相发送和接收数据包,第一个窗口的两个窗口互相发送和接收数据包,第一个窗口的接收端口号为接收端口号为3100。第二个窗口的接收端口号为。第二个窗口的接收端口号为3000。广播数据报广播数据报vInternet地址的分类地址的分类a.b.c.duA类地址类地址最高位为最高位为0a128a表示网络地址,表示网络地址,b.c.d表示主机地址表示主机地址uB类地址类地址128a192最高两位为最高两位为10a.b表示网络地址,表示网络地址,c.d表示主机地址表示主机地址uC类地址类地址192a224最高三位为最高三位为110a.b.c表示网络地址,表示网络地址,d表示主机地址表示主机地址uD类地址类地址224.0.0.0239.255.255.255最高四位为最高四位为1110u局部链接组播地址局部链接组播地址224.0.0.0224.0.0.255为路由协议和其它用途保留的地址为路由协议和其它用途保留的地址u预留组播地址预留组播地址224.0.1.0238.255.255.255可用于全球范围(如可用于全球范围(如Internet)或网络协议)或网络协议u管理权限组播地址管理权限组播地址239.0.0.0239.255.255.255可供组织内部使用,不能用于可供组织内部使用,不能用于Internet,可限制组播范围,可限制组播范围vIP组播技术组播技术uIP组播技术,是一种允许一台或多台主机组播技术,是一种允许一台或多台主机(组播源)发送单一数据包到多台主机(一次(组播源)发送单一数据包到多台主机(一次的,同时的)的的,同时的)的TCP/IP网络技术网络技术,是是一点对多一点对多点点的通信。的通信。u组播能使一个或多个组播源只把数据包发送给组播能使一个或多个组播源只把数据包发送给特定的组播组,而只有加入该组播组的主机才特定的组播组,而只有加入该组播组的主机才能接收到数据包。能接收到数据包。u组播组组播组u使用同一个使用同一个IP组播地址接收组播数据包的所有主机组播地址接收组播数据包的所有主机构成了一个主机组,也称为组播组构成了一个主机组,也称为组播组u一台主机可以随时加入或离开组播组一台主机可以随时加入或离开组播组u一台主机也可以属于几个组播组一台主机也可以属于几个组播组u不属于某一个组播组的主机也可以向该组播组发送不属于某一个组播组的主机也可以向该组播组发送数据包数据包vMuticastSocket类类java.lang.O.DatagramS.MulticastSocketStringmsg=Hello;InetAddressgroup=InetAddress.getByName(228.5.6.7);MulticastSockets=newMulticastSocket(6789);s.joinGroup(group);DatagramPackethi=newDatagramPacket(msg.getBytes(),msg.length(),group,6789);s.send(hi);bytebuf=newbyte1000;DatagramPacketrecv=newDatagramPacket(buf,buf.length);s.receive(recv);s.leaveGroup(group);v构造方法构造方法upublicMulticastSocket(intport)throwsIOException创建多播套接字并将其绑定到特定端口。创建多播套接字并将其绑定到特定端口。v常用方法常用方法upublicvoidsetTimeToLive(intttl)throwsIOException设置在此设置在此MulticastSocket上发出的多播数据包上发出的多播数据包的默认生存时间,以便控制多播的范围。的默认生存时间,以便控制多播的范围。ttl必须在必须在0=ttl=255范围内,否则将抛出范围内,否则将抛出IllegalArgumentException。upublicvoidjoinGroup(InetAddressmcastaddr)throwsIOException加入多播组加入多播组upublicvoidleaveGroup(InetAddressmcastaddr)throwsIOException离开多播组离开多播组v例:组播组中一台主机循环发送天气信息(发送间隔时例:组播组中一台主机循环发送天气信息(发送间隔时间为间为2s),组播),组播IP地址为地址为239.255.8.0,即本地网络。组播,即本地网络。组播端口为端口为5858。组播组中一台主机的界面如下所示,按下。组播组中一台主机的界面如下所示,按下“开始接收开始接收”按钮,不断接收天气信息,将当前接收到的信按钮,不断接收天气信息,将当前接收到的信息显示在左边文本区中,已接收的信息显示在右边文本区息显示在左边文本区中,已接收的信息显示在右边文本区中。按下中。按下“停止接收停止接收”按钮,停止接收天气信息。按钮,停止接收天气信息。