Java程序设计项目教程模块5-网络编程课件_第1页
Java程序设计项目教程模块5-网络编程课件_第2页
Java程序设计项目教程模块5-网络编程课件_第3页
Java程序设计项目教程模块5-网络编程课件_第4页
Java程序设计项目教程模块5-网络编程课件_第5页
已阅读5页,还剩91页未读 继续免费阅读

下载本文档

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

文档简介

Java程序设计

模块5——网络编程Java程序设计

模块5——网络编程5.1获取网络信息

项目34获取网络域名或IPInetAddress类:表示互联网协议(IP)地址IP地址

IP使用32位或128位的无符号数字IP协议是一种基础协议UDP和TCP协议都是在它的基础上构建的InetAddress的实例包含IP地址,还可能包含相应的主机名(取决于它是否用主机名构造或者是否已执行反向主机名解析)5.1获取网络信息

项目34获取网络域名或IPInet5.1获取网络信息

项目34获取网络域名或IP

表5-1InetAddress类常用方法booleanequals(Object

obj)将此对象与指定对象比较。booleanisLoopbackAddress()检查InetAddress是否是回送地址的实用例行程序。booleanisReachable(int

timeout)测试是否可以达到该地址。booleanisReachable(NetworkInterface

netif,int

ttl,int

timeout)测试是否可以达到该地址。booleanisSiteLocalAddress()检查InetAddress是否是站点本地地址的实用例行程序。5.1获取网络信息

项目34获取网络域名或IP

表5-5.1获取网络信息

项目34获取网络域名或IP

表5-1InetAddress类常用方法byte[]getAddress()返回此InetAddress对象的原始IP地址。static

InetAddressgetByAddress(byte[]

addr)在给定原始IP地址的情况下,返回InetAddress对象。static

InetAddressgetByAddress(String

host,byte[]

addr)根据提供的主机名和IP地址创建InetAddress。static

InetAddress

getByName(String

host)在给定主机名的情况下确定主机的IP地址。5.1获取网络信息

项目34获取网络域名或IP

表5-5.1获取网络信息

项目34获取网络域名或IP

表5-1InetAddress类常用方法static

InetAddress

getLocalHost()返回本地主机。static

InetAddress[]getAllByName(String

host)在给定主机名的情况下,根据系统上配置的名称服务返回其IP地址所组成的数组。String

getHostAddress()返回IP地址字符串(以文本表现形式)。String

getHostName()获取此IP地址的主机名。String

toString()将此IP地址转换为String。5.1获取网络信息

项目34获取网络域名或IP

表5-5.1获取网络信息

项目34获取网络域名或IPgetLocalHost()getHostName()getHostAddress()5.1获取网络信息

项目34获取网络域名或IPgetL5.1获取网络信息

项目34获取网络域名或IP

【应用拓展】getLocalHost()getCanonicalHostName()isLoopbackAddress()getHostAddress()getHostName()5.1获取网络信息

项目34获取网络域名或IP

【应用5.1获取网络信息

项目35获取网络属性信息类URL代表一个统一资源定位符是指向互联网“资源”的指针文件或目录对对象的引用例如对数据库或搜索引擎的查询可选择指定一个“端口”,它是用于建立到远程主机TCP连接的端口号如果未指定该端口号,则使用协议默认的端口。例如,http协议的默认端口为80。应用程序可以指定一个“相对URL”它只包含到达相对于另一个URL的资源的足够信息HTML页面中经常使用相对URL5.1获取网络信息

项目35获取网络属性信息类URL5.1获取网络信息

项目35获取网络属性信息相对URL不需要指定URL的所有组成部分如果缺少协议、主机名称或端口号,这些值将从完整指定的URL中继承必须指定文件部分可选的片段部分不继承。URL类自身并不根据RFC2396中定义的转义机制编码或解码任何URL部分由调用方对任何需要在调用URL前进行转义的字段进行编码,并对从URL返回的任何经过转义的字段进行解码。5.1获取网络信息

项目35获取网络属性信息相对UR5.1获取网络信息

项目35获取网络属性信息

表5-2URL类常用方法

booleanequals(Object

obj)比较此URL是否等于另一个对象。String

getAuthority()获得此URL的授权部分。Object

getContent()获得此URL的内容。Object

getContent(Class[]

classes)获得此URL的内容。intgetDefaultPort()获得与此URL关联协议的默认端口号。String

getFile()获得此URL的文件名。String

getHost()获得此URL的主机名(如果适用)。5.1获取网络信息

项目35获取网络属性信息

表5-25.1获取网络信息

项目35获取网络属性信息

表5-2URL类常用方法

String

getPath()获得此URL的路径部分。intgetPort()获得此URL的端口号。String

getProtocol()获得此URL的协议名称。String

getQuery()获得此URL的查询部分。String

getUserInfo()获得此URL的userInfo部分。inthashCode()创建一个适合哈希表索引的整数。URLConnection

openConnection()返回一个URLConnection对象,它表示到URL所引用的远程对象的连接。5.1获取网络信息

项目35获取网络属性信息

表5-25.1获取网络信息

项目35获取网络属性信息

InputStream

openStream()打开到此URL的连接并返回一个用于从该连接读入的InputStected

voidset(String

protocol,String

host,int

port,String

file,String

ref)设置URL的字段。protected

voidset(String

protocol,String

host,int

port,String

authority,String

userInfo,String

path,String

query,String

ref)设置URL的指定的8个字段。String

toString()构造此URL的字符串表示形式。URI

toURI()返回与此URL等效的URI。5.1获取网络信息

项目35获取网络属性信息

Inpu获取一个URL文本:在不输入参数的情况下显示的结果

在命令行界面运行程序:javaGetURL“”:显示

的相关URL信息获取一个URL文本:在不输入参数的情况下显示的结果在命令行5.1获取网络信息

项目35获取网络属性信息

【应用拓展】获取的基础信息5.1获取网络信息

项目35获取网络属性信息

【应用拓5.2基于TCP/IP的服务器与客户机通信

项目36TCP服务器端程序

技术要点创建ServerSocket和Socket类的对象,定义输入、输出流,用于从Socket中获取输入输出流对象;调用ServerSocket实例对象的accept()方法,启动监听,随时获取客户端的请求;建立输入/输出流运用流对象获取从客户端发送的消息,并向客户端发送消息;注意数据的读取与发送可采用不同类型的流对象关闭客户端流和对应的Socket转2或关闭ServerSocket5.2基于TCP/IP的服务器与客户机通信

项目365.2基于TCP/IP的服务器与客户机通信

项目36TCP服务器端程序套接字

套接字是通信的基石,是支持TCP/IP协议的通信的基本操作单元可以将套接字看作不同主机间的进程进行双向通信的端点构成了单个主机内及整个网络间的编程界面套接字存在于通信域中,通信域是为了处理一般的线程通过套接字通信而引进的一种抽象概念。套接字通常和同一个域中的套接字交换数据(数据交换也可能穿越域的界限,但这时一定要执行某种解释程序)。各种进程使用这个相同的域互相之间用Internet协议簇来进行通信。

5.2基于TCP/IP的服务器与客户机通信

项目36

套接字工作要通过互联网进行通信,至少需要一对套接字运行于客户端ClientSocket运行于服务器端ServerSocket套接字之间的连接过程可以分为三个步骤:服务器监听:是服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态。客户端请求:是指由客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求连接确认:是指当服务器端套接字监听到或者说接收到客户端套接字的连接请求,它就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,连接就建立好了。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。

套接字工作5.2基于TCP/IP的服务器与客户机通信

项目36TCP服务器端程序ServerSocket类实现服务器套接字服务器套接字等待请求通过网络传入基于该请求执行某些操作然后可能向请求者返回结果服务器套接字的实际工作由SocketImpl类的实例执行应用程序可以更改创建套接字实现的套接字工厂来配置它自身,从而创建适合本地防火墙的套接字在客户/服务器通信模式中,服务器端需要创建监听特定端口的ServerSocketServerSocket负责接收客户连接请求5.2基于TCP/IP的服务器与客户机通信

项目365.2基于TCP/IP的服务器与客户机通信

项目36TCP服务器端程序构造ServerSocketServerSocket()throwsIOException

ServerSocket(intport)throwsIOException

ServerSocket(intport,intbacklog)throwsIOExceptionServerSocket(intport,intbacklog,InetAddressbindAddr)throwsIOException

port指定服务器要绑定的端口(服务器要监听的端口)backlog指定客户连接请求队列的长度bindAddr指定服务器要绑定的IP地址。5.2基于TCP/IP的服务器与客户机通信

项目36(1)绑定端口绑定端口由参数port指定,如:创建了一个与80端口绑定的服务器

ServerSocketserverSocket=newServerSocket(80);如果运行时无法绑定到80端口,以上代码会抛出IOException,更确切地说,是抛出BindException,它是IOException的子类端口已经被其他服务器进程占用;在某些操作系统中,如果没有以超级用户的身份来运行服务器程序,那么操作系统不允许服务器绑定到1~1023之间的端口如果把参数port设为0,表示由操作系统来为服务器分配一个任意可用的端口由操作系统分配的端口也称为匿名端口对于多数服务器,会使用明确的端口,而不会使用匿名端口客户程序需要事先知道服务器的端口,才能方便地访问服务器

(1)绑定端口(2)设定客户连接请求队列的长度当服务器进程运行时,可能会同时监听到多个客户的连接请求。例如,每当一个客户进程执行以下代码:

Socketsocket=newSocket(,80);在远程主机的80端口上,监听到了一个客户的连接请求管理客户连接请求的任务是由操作系统来完成的操作系统把这些连接请求存储在一个先进先出的队列中许多操作系统限定了队列的最大长度,一般为50当队列中的连接请求达到了队列的最大容量时,服务器进程所在的主机会拒绝新的连接请求只有当服务器进程通过ServerSocket的accept()方法从队列中取出连接请求,使队列腾出空位时,队列才能继续加入新的连接请求(2)设定客户连接请求队列的长度(2)设定客户连接请求队列的长度对于客户进程,如果它发出的连接请求被加入到服务器的队列中,就意味着客户与服务器的连接建立成功客户进程从Socket构造方法中正常返回如果客户进程发出的连接请求被服务器拒绝,Socket构造方法就会抛出ConnectionExceptionServerSocket构造方法的backlog参数用来显式设置连接请求队列的长度它将覆盖操作系统限定的队列的最大长度在以下几种情况中,仍然会采用操作系统限定的队列的最大长度:backlog参数的值大于操作系统限定的队列的最大长度;backlog参数的值大于或等于0;在ServerSocket构造方法中没有设置backlog参数。(2)设定客户连接请求队列的长度(3)设定绑定的IP地址如果主机只有一个IP地址,那么默认情况下,服务器程序就与该IP地址绑定ServerSocket(intport,intbacklog,InetAddressbindAddr)bindAddr显式指定服务器要绑定的IP地址该构造方法适用于具有多个IP地址的主机假定一个主机有两个网卡,一个网卡用于连接到Internet,IP地址为12,还有一个网卡用于连接到本地局域网,IP地址为。如果服务器仅仅被本地局域网中的客户访问,那么可以按如下方式创建ServerSocket:

ServerSocketserverSocket=newServerSocket(8000,10,InetAddress.getByName(""));(3)设定绑定的IP地址(4)默认构造方法的作用通过不带参数的构造方法创建的ServerSocket不与任何端口绑定,接下来还需要通过bind()方法与特定端口绑定。这个默认构造方法的用途是,允许服务器在绑定到特定端口之前,先设置ServerSocket的一些选项一旦服务器与特定端口绑定,有些选项就不能再改变了。如:在以下代码中,先把ServerSocket的SO_REUSEADDR选项设为true,然后再把它与8000端口绑定:ServerSocketserverSocket=newServerSocket();ServerSocket.setReuseAddress(true);

//设置ServerSocket的选项ServerSocket.bind(newInetSocketAddress(8000));//与8000端口绑定如果把以上程序代码改为:ServerSocketserverSocket=newServerSocket(8000);ServerSocket.setReuseAddress(true);

//设置ServerSocket的选项ServerSocket.setReuseAddress(true)方法就不起任何作用了,SO_REUSEADDR选项必须在服务器绑定端口之前设置才有效(4)默认构造方法的作用5.2基于TCP/IP的服务器与客户机通信

项目36TCP服务器端程序2.接收和关闭与客户的连接ServerSocket的accept()方法从连接请求队列中取出一个客户的连接请求创建与客户连接的Socket对象,并将它返回如果队列中没有连接请求,accept()方法就会一直等待,直到接收到了连接请求才返回。服务器从Socket对象中获得输入流和输出流,就能与客户交换数据。当服务器正在进行发送数据的操作时,如果客户端断开了连接,那么服务器端会抛出一个IOException的子类SocketException异常:.SocketException:Connectionresetbypeer

这只是服务器与单个客户通信中出现的异常,这种异常应该被捕获,使得服务器能继续与其他客户通信5.2基于TCP/IP的服务器与客户机通信

项目365.2基于TCP/IP的服务器与客户机通信

项目36TCP服务器端程序3.关闭ServerSocketServerSocket的close()方法使服务器释放占用的端口,并且断开与所有客户的连接当一个服务器程序运行结束时,即使没有执行ServerSocket的close()方法,操作系统也会释放这个服务器占用的端口服务器程序并不一定要在结束之前执行ServerSocket的close()方法。如果希望及时释放服务器的端口,以便让其他程序能占用该端口,则可以显式调用ServerSocket的close()方法5.2基于TCP/IP的服务器与客户机通信

项目365.2基于TCP/IP的服务器与客户机通信

项目36TCP服务器端程序ServerSocket类常用方法主要功能Socket

accept()侦听并接受到此套接字的连接voidbind(SocketAddress

endpoint)将ServerSocket绑定到特定地址(IP地址和端口号)voidbind(SocketAddress

endpoint,int

backlog)将ServerSocket绑定到特定地址(IP地址和端口号)voidclose()关闭此套接字InetAddress

getInetAddress()返回此服务器套接字的本地地址5.2基于TCP/IP的服务器与客户机通信

项目36ServerSocket类常用方法intgetLocalPort()返回此套接字在其上侦听的端口SocketAddress

getLocalSocketAddress()返回此套接字绑定的端点的地址,如果尚未绑定则返回nullbooleanisBound()返回ServerSocket的绑定状态booleanisClosed()返回ServerSocket的关闭状态String

toString()作为String返回此套接字的实现地址和实现端口ServerSocket类常用方法intgetLocalP5.2基于TCP/IP的服务器与客户机通信

项目37TCP的客户端程序【技术要点】创建Socket类的对象,连接到指定服务器的监听端口定义输入、输出流从Socket对象中获取输入、输出流对象运用流对象获取从服务器端返回的消息,并向服务器发送消息关闭流和套接字5.2基于TCP/IP的服务器与客户机通信

项目375.2基于TCP/IP的服务器与客户机通信

项目37TCP的客户端程序【相关知识】Socket类实现客户端套接字(也可以就叫“套接字”)套接字是两台机器之间的通信端点套接字的实际工作由SocketImpl类的实例执行应用程序通过更改创建套接字实现的套接字工厂可以配置它自身,以创建适合本地防火墙的套接字构造方法publicSocket(Stringhost,intport)publicSocket(InetAddressaddress,intport)publicSocket(InetAddressaddress,intport,InetAddresslocalAddress,intLocalPort)5.2基于TCP/IP的服务器与客户机通信

项目37Socket类常用方法主要功能voidbind(SocketAddress

bindpoint)将套接字绑定到本地地址。voidclose()关闭此套接字。voidconnect(SocketAddress

endpoint)将此套接字连接到服务器。voidconnect(SocketAddress

endpoint,int

timeout)将此套接字连接到具有指定超时值的服务器。InetAddress

getInetAddress()返回套接字连接的地址。InputStream

getInputStream()返回此套接字的输入流。InetAddress

getLocalAddress()获取套接字绑定的本地地址。Socket类常用方法主要功能voidbind(SockeintgetLocalPort()返回此套接字绑定到的本地端口。SocketAddress

getLocalSocketAddress()返回此套接字绑定的端点的地址,如果尚未绑定则返回null。OutputStream

getOutputStream()返回此套接字的输出流。intgetPort()返回此套接字连接到的远程端口。SocketAddress

getRemoteSocketAddress()返回此套接字连接的端点的地址,如果未连接则返回getSendBufferSize()获取此Socket的SO_SNDBUF选项的值,该值是平台在Socket上输出时使用的缓冲区大小。intgetSoLinger()返回SO_LINGER的设置。intgetLocalPort()返回此套接字绑定到的本地5.2基于TCP/IP的服务器与客户机通信

项目37TCP的客户端程序booleanisBound()返回套接字的绑定状态。booleanisClosed()返回套接字的关闭状态。booleanisConnected()返回套接字的连接状态。booleanisInputShutdown()返回是否关闭套接字连接的半读状态(read-half)。booleanisOutputShutdown()返回是否关闭套接字连接的半写状态(write-half)。String

toString()将此套接字转换为String。5.2基于TCP/IP的服务器与客户机通信

项目375.3基于UDP的服务器与客户机通信

项目38基于UDP的聊天程序【技术要点】使用默认构造器,创建使用本机任何可用端口的数据包Socket的实例对象;创建BufferedReader类对象,用于从键盘获取用户输入的信息;创建DatagramPacket类对象,打包要发送的数据,调用DatagramSocket类的send()和receive()方法获取和发送数据报;使用UDP进行通信时,服务器与客户端基本相同,运行时,要先启动服务器端,然后启动客户端,服务器端与客户端之间建立连接就可以通信了,结束通过客户端向服务器端发送”bye”消息结束5.3基于UDP的服务器与客户机通信

项目38基于UDP的【相关知识】DatagramSocket类表示用来发送和接收数据报包的套接字数据报套接字是包投递服务的发送或接收点每个在数据报套接字上发送或接收的包都是单独编址和路由的从一台机器发送到另一台机器的多个包可能选择不同的路由,也可能按不同的顺序到达在DatagramSocket上总是启用UDP广播发送将DatagramSocket绑定到通配符地址。在某些实现中,将DatagramSocket绑定到一个更加具体的地址时广播包也可以被接收数据报包用来实现无连接包投递服务每条报文仅根据该包中包含的信息从一台机器路由到另一台机器从一台机器发送到另一台机器的多个包可能选择不同的路由,也可能按不同的顺序到达不对包投递做出保证【相关知识】5.3基于UDP的服务器与客户机通信

项目38基于UDP的聊天程序1.UDP协议概论UserDatagramProtocol的缩写,即用户数据报协议用来支持那些需要在计算机之间传输数据的网络应用包括网络视频会议系统在内的众多的客户/服务器模式的网络应用与TCP(传输控制协议)协议一样,UDP协议直接位于IP(网际协议)协议的顶层。根据OSI(开放系统互连)参考模型,UDP和TCP都属于传输层协议。主要作用:将网络数据流量压缩成数据报的形式一个典型的数据报就是一个二进制数据的传输单位每一个数据报的前8个字节用来包含报头信息剩余字节则用来包含具体的传输数据

5.3基于UDP的服务器与客户机通信

项目38基于UDP的1.UDP协议概论UDP报头由4个域组成,其中每个域各占用2个字节,具体如下:源端口号目标端口号数据报长度校验值UDP协议使用端口号为不同的应用保留其各自的数据传输通道数据发送方(可以是客户端或服务器端)将UDP数据报通过源端口发送出去数据接收方通过目标端口接收数据有的网络应用只能使用预先为其预留或注册的静态端口;而另外一些网络应用则可以使用未被注册的动态端口端口号的有效范围是从0到65535一般来说,大于49151的端口号都代表动态端口。1.UDP协议概论5.3基于UDP的服务器与客户机通信

项目38基于UDP的聊天程序1.UDP协议概论数据报的长度是指包括报头和数据部分在内的总的字节数报头的长度是固定的该域主要被用来计算可变长度的数据部分(又称为数据负载)数据报的最大长度根据操作环境的不同而各异从理论上说,包含报头在内的数据报的最大长度为65535字节。一些实际应用往往会限制数据报的大小,有时会降低到8192字节5.3基于UDP的服务器与客户机通信

项目38基于UDP的5.3基于UDP的服务器与客户机通信

项目38基于UDP的聊天程序1.UDP协议概论UDP协议使用报头中的校验值来保证数据的安全校验值首先在数据发送方通过特殊的算法计算得出在传递到接收方之后,还需要再重新计算如果某个数据报在传输过程中被第三方篡改或者由于线路噪音等原因受到损坏,发送和接收方的校验计算值将不会相符,由此UDP协议可以检测是否出错5.3基于UDP的服务器与客户机通信

项目38基于UDP的5.3基于UDP的服务器与客户机通信

项目38基于UDP的聊天程序2.UDP与TCP的对照如何实现信息的可靠传递方面TCP协议中包含了专门的传递保证机制当数据接收方收到发送方传来的信息时,会自动向发送方发出确认消息;发送方只有在接收到该确认消息之后才继续传送其它信息,否则将一直等待直到收到确认信息为止。UDP协议并不提供数据传送的保证机制如果在从发送方到接收方的传递过程中出现数据报的丢失,协议本身并不能做出任何检测或提示UDP协议称为不可靠的传输协议。如何接收突发性的多个数据报不同于TCP,UDP并不能确保数据的发送和接收顺序。5.3基于UDP的服务器与客户机通信

项目38基于UDP的3.UDP协议的应用UDP具有TCP所望尘莫及的速度优势TCP协议中植入了各种安全保障功能,在实际执行的过程中会占用大量的系统开销,无疑使速度受到严重的影响UDP由于排除了信息可靠传递机制,将安全和排序等功能移交给上层应用来完成,极大降低了执行时间,使速度得到了保证与TCP不同,UDP并不提供对IP协议的可靠机制、流控制以及错误恢复功能等。由于UDP比较简单,UDP头包含很少的字节,比TCP负载消耗少由于大多数网络应用程序都在同一台机器上运行,计算机上必须能够确保目的地机器上的软件程序能从源地址机器处获得数据包,以及源计算机能收到正确的回复。这是通过使用UDP的“端口号”完成的UDP适用于不需要TCP可靠机制的情形当高层协议或应用程序提供错误和流控制功能的时候。UDP是传输层协议,服务于很多知名应用层协议,包括网络文件系统(NFS)、简单网络管理协议(SNMP)、域名系统(DNS)以及简单文件传输系统(TFTP)

3.UDP协议的应用5.3基于UDP的服务器与客户机通信

项目38基于UDP的聊天程序

协议结构SourcePort—16位。源端口是可选字段。当使用时,它表示发送程序的端口,同时它还被认为是没有其它信息的情况下需要被寻址的答复端口。如果不使用,设置值为0。DestinationPort—16位。目标端口在特殊因特网目标地址的情况下具有意义。Length—16位。该用户数据报的八位长度,包括协议头和数据。长度最小值为8。Checksum—16位。IP协议头、UDP协议头和数据位,最后用0填补的信息假协议头总和。如果必要的话,可以由两个八位复合而成。Data—包含上层数据信息5.3基于UDP的服务器与客户机通信

项目38基于UDP的5.3基于UDP的服务器与客户机通信

项目38基于UDP的聊天程序DatagramSocket类常用方法主要功能voidbind(SocketAddress

addr)将此DatagramSocket绑定到特定的地址和端口。voidclose()关闭此数据报套接字。voidconnect(InetAddress

address,int

port)将套接字连接到此套接字的远程地址。voidconnect(SocketAddress

addr)将此套接字连接到远程套接字地址(IP地址+端口号)。voiddisconnect()断开套接字的连接。InetAddress

getInetAddress()返回此套接字连接的地址。5.3基于UDP的服务器与客户机通信

项目38基于UDP的5.3基于UDP的服务器与客户机通信

项目38基于UDP的聊天程序InetAddress

getLocalAddress()获取套接字绑定的本地地址。intgetLocalPort()返回此套接字绑定的本地主机上的端口号。SocketAddress

getLocalSocketAddress()返回此套接字绑定的端点的地址,如果尚未绑定则返回getPort()返回此套接字的端口。intgetSendBufferSize()获取此DatagramSocket的SO_SNDBUF选项的值,该值是平台在DatagramSocket上输出时使用的缓冲区大小。5.3基于UDP的服务器与客户机通信

项目38基于UDP的5.3基于UDP的服务器与客户机通信

项目38基于UDP的聊天程序booleanisBound()返回套接字的绑定状态。booleanisClosed()返回是否关闭了套接字。booleanisConnected()返回套接字的连接状态。voidreceive(DatagramPacket

p)从此套接字接收数据报包。voidsend(DatagramPacket

p)从此套接字发送数据报包。5.3基于UDP的服务器与客户机通信

项目38基于UDP的5.3基于UDP的服务器与客户机通信

项目38基于UDP的聊天程序DatagramPacket类常用方法主要功能InetAddress

getAddress()返回某台机器的IP地址,此数据报将要发往该机器或者是从该机器接收到的。byte[]getData()返回数据缓冲区。intgetLength()返回将要发送或接收到的数据的长度。intgetOffset()返回将要发送或接收到的数据的偏移量。intgetPort()返回某台远程主机的端口号,此数据报将要发往该主机或者是从该主机接收到的。5.3基于UDP的服务器与客户机通信

项目38基于UDP的SocketAddress

getSocketAddress()获取要将此包发送到的或发出此数据报的远程主机的SocketAddress(通常为IP地址+端口号)。voidsetAddress(InetAddress

iaddr)设置要将此数据报发往的那台机器的IP地址。voidsetData(byte[]

buf)为此包设置数据缓冲区。voidsetLength(int

length)为此包设置长度。voidsetPort(int

iport)设置要将此数据报发往的远程主机上的端口号。voidsetSocketAddress(SocketAddress

address)设置要将此数据报发往的远程主机的SocketAddress(通常为IP地址+端口号)。SocketAddressgetSocketAddressJava程序设计项目教程模块5——网络编程课件Java程序设计

模块5——网络编程Java程序设计

模块5——网络编程5.1获取网络信息

项目34获取网络域名或IPInetAddress类:表示互联网协议(IP)地址IP地址

IP使用32位或128位的无符号数字IP协议是一种基础协议UDP和TCP协议都是在它的基础上构建的InetAddress的实例包含IP地址,还可能包含相应的主机名(取决于它是否用主机名构造或者是否已执行反向主机名解析)5.1获取网络信息

项目34获取网络域名或IPInet5.1获取网络信息

项目34获取网络域名或IP

表5-1InetAddress类常用方法booleanequals(Object

obj)将此对象与指定对象比较。booleanisLoopbackAddress()检查InetAddress是否是回送地址的实用例行程序。booleanisReachable(int

timeout)测试是否可以达到该地址。booleanisReachable(NetworkInterface

netif,int

ttl,int

timeout)测试是否可以达到该地址。booleanisSiteLocalAddress()检查InetAddress是否是站点本地地址的实用例行程序。5.1获取网络信息

项目34获取网络域名或IP

表5-5.1获取网络信息

项目34获取网络域名或IP

表5-1InetAddress类常用方法byte[]getAddress()返回此InetAddress对象的原始IP地址。static

InetAddressgetByAddress(byte[]

addr)在给定原始IP地址的情况下,返回InetAddress对象。static

InetAddressgetByAddress(String

host,byte[]

addr)根据提供的主机名和IP地址创建InetAddress。static

InetAddress

getByName(String

host)在给定主机名的情况下确定主机的IP地址。5.1获取网络信息

项目34获取网络域名或IP

表5-5.1获取网络信息

项目34获取网络域名或IP

表5-1InetAddress类常用方法static

InetAddress

getLocalHost()返回本地主机。static

InetAddress[]getAllByName(String

host)在给定主机名的情况下,根据系统上配置的名称服务返回其IP地址所组成的数组。String

getHostAddress()返回IP地址字符串(以文本表现形式)。String

getHostName()获取此IP地址的主机名。String

toString()将此IP地址转换为String。5.1获取网络信息

项目34获取网络域名或IP

表5-5.1获取网络信息

项目34获取网络域名或IPgetLocalHost()getHostName()getHostAddress()5.1获取网络信息

项目34获取网络域名或IPgetL5.1获取网络信息

项目34获取网络域名或IP

【应用拓展】getLocalHost()getCanonicalHostName()isLoopbackAddress()getHostAddress()getHostName()5.1获取网络信息

项目34获取网络域名或IP

【应用5.1获取网络信息

项目35获取网络属性信息类URL代表一个统一资源定位符是指向互联网“资源”的指针文件或目录对对象的引用例如对数据库或搜索引擎的查询可选择指定一个“端口”,它是用于建立到远程主机TCP连接的端口号如果未指定该端口号,则使用协议默认的端口。例如,http协议的默认端口为80。应用程序可以指定一个“相对URL”它只包含到达相对于另一个URL的资源的足够信息HTML页面中经常使用相对URL5.1获取网络信息

项目35获取网络属性信息类URL5.1获取网络信息

项目35获取网络属性信息相对URL不需要指定URL的所有组成部分如果缺少协议、主机名称或端口号,这些值将从完整指定的URL中继承必须指定文件部分可选的片段部分不继承。URL类自身并不根据RFC2396中定义的转义机制编码或解码任何URL部分由调用方对任何需要在调用URL前进行转义的字段进行编码,并对从URL返回的任何经过转义的字段进行解码。5.1获取网络信息

项目35获取网络属性信息相对UR5.1获取网络信息

项目35获取网络属性信息

表5-2URL类常用方法

booleanequals(Object

obj)比较此URL是否等于另一个对象。String

getAuthority()获得此URL的授权部分。Object

getContent()获得此URL的内容。Object

getContent(Class[]

classes)获得此URL的内容。intgetDefaultPort()获得与此URL关联协议的默认端口号。String

getFile()获得此URL的文件名。String

getHost()获得此URL的主机名(如果适用)。5.1获取网络信息

项目35获取网络属性信息

表5-25.1获取网络信息

项目35获取网络属性信息

表5-2URL类常用方法

String

getPath()获得此URL的路径部分。intgetPort()获得此URL的端口号。String

getProtocol()获得此URL的协议名称。String

getQuery()获得此URL的查询部分。String

getUserInfo()获得此URL的userInfo部分。inthashCode()创建一个适合哈希表索引的整数。URLConnection

openConnection()返回一个URLConnection对象,它表示到URL所引用的远程对象的连接。5.1获取网络信息

项目35获取网络属性信息

表5-25.1获取网络信息

项目35获取网络属性信息

InputStream

openStream()打开到此URL的连接并返回一个用于从该连接读入的InputStected

voidset(String

protocol,String

host,int

port,String

file,String

ref)设置URL的字段。protected

voidset(String

protocol,String

host,int

port,String

authority,String

userInfo,String

path,String

query,String

ref)设置URL的指定的8个字段。String

toString()构造此URL的字符串表示形式。URI

toURI()返回与此URL等效的URI。5.1获取网络信息

项目35获取网络属性信息

Inpu获取一个URL文本:在不输入参数的情况下显示的结果

在命令行界面运行程序:javaGetURL“”:显示

的相关URL信息获取一个URL文本:在不输入参数的情况下显示的结果在命令行5.1获取网络信息

项目35获取网络属性信息

【应用拓展】获取的基础信息5.1获取网络信息

项目35获取网络属性信息

【应用拓5.2基于TCP/IP的服务器与客户机通信

项目36TCP服务器端程序

技术要点创建ServerSocket和Socket类的对象,定义输入、输出流,用于从Socket中获取输入输出流对象;调用ServerSocket实例对象的accept()方法,启动监听,随时获取客户端的请求;建立输入/输出流运用流对象获取从客户端发送的消息,并向客户端发送消息;注意数据的读取与发送可采用不同类型的流对象关闭客户端流和对应的Socket转2或关闭ServerSocket5.2基于TCP/IP的服务器与客户机通信

项目365.2基于TCP/IP的服务器与客户机通信

项目36TCP服务器端程序套接字

套接字是通信的基石,是支持TCP/IP协议的通信的基本操作单元可以将套接字看作不同主机间的进程进行双向通信的端点构成了单个主机内及整个网络间的编程界面套接字存在于通信域中,通信域是为了处理一般的线程通过套接字通信而引进的一种抽象概念。套接字通常和同一个域中的套接字交换数据(数据交换也可能穿越域的界限,但这时一定要执行某种解释程序)。各种进程使用这个相同的域互相之间用Internet协议簇来进行通信。

5.2基于TCP/IP的服务器与客户机通信

项目36

套接字工作要通过互联网进行通信,至少需要一对套接字运行于客户端ClientSocket运行于服务器端ServerSocket套接字之间的连接过程可以分为三个步骤:服务器监听:是服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态。客户端请求:是指由客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求连接确认:是指当服务器端套接字监听到或者说接收到客户端套接字的连接请求,它就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,连接就建立好了。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。

套接字工作5.2基于TCP/IP的服务器与客户机通信

项目36TCP服务器端程序ServerSocket类实现服务器套接字服务器套接字等待请求通过网络传入基于该请求执行某些操作然后可能向请求者返回结果服务器套接字的实际工作由SocketImpl类的实例执行应用程序可以更改创建套接字实现的套接字工厂来配置它自身,从而创建适合本地防火墙的套接字在客户/服务器通信模式中,服务器端需要创建监听特定端口的ServerSocketServerSocket负责接收客户连接请求5.2基于TCP/IP的服务器与客户机通信

项目365.2基于TCP/IP的服务器与客户机通信

项目36TCP服务器端程序构造ServerSocketServerSocket()throwsIOException

ServerSocket(intport)throwsIOException

ServerSocket(intport,intbacklog)throwsIOExceptionServerSocket(intport,intbacklog,InetAddressbindAddr)throwsIOException

port指定服务器要绑定的端口(服务器要监听的端口)backlog指定客户连接请求队列的长度bindAddr指定服务器要绑定的IP地址。5.2基于TCP/IP的服务器与客户机通信

项目36(1)绑定端口绑定端口由参数port指定,如:创建了一个与80端口绑定的服务器

ServerSocketserverSocket=newServerSocket(80);如果运行时无法绑定到80端口,以上代码会抛出IOException,更确切地说,是抛出BindException,它是IOException的子类端口已经被其他服务器进程占用;在某些操作系统中,如果没有以超级用户的身份来运行服务器程序,那么操作系统不允许服务器绑定到1~1023之间的端口如果把参数port设为0,表示由操作系统来为服务器分配一个任意可用的端口由操作系统分配的端口也称为匿名端口对于多数服务器,会使用明确的端口,而不会使用匿名端口客户程序需要事先知道服务器的端口,才能方便地访问服务器

(1)绑定端口(2)设定客户连接请求队列的长度当服务器进程运行时,可能会同时监听到多个客户的连接请求。例如,每当一个客户进程执行以下代码:

Socketsocket=newSocket(,80);在远程主机的80端口上,监听到了一个客户的连接请求管理客户连接请求的任务是由操作系统来完成的操作系统把这些连接请求存储在一个先进先出的队列中许多操作系统限定了队列的最大长度,一般为50当队列中的连接请求达到了队列的最大容量时,服务器进程所在的主机会拒绝新的连接请求只有当服务器进程通过ServerSocket的accept()方法从队列中取出连接请求,使队列腾出空位时,队列才能继续加入新的连接请求(2)设定客户连接请求队列的长度(2)设定客户连接请求队列的长度对于客户进程,如果它发出的连接请求被加入到服务器的队列中,就意味着客户与服务器的连接建立成功客户进程从Socket构造方法中正常返回如果客户进程发出的连接请求被服务器拒绝,Socket构造方法就会抛出ConnectionExceptionServerSocket构造方法的backlog参数用来显式设置连接请求队列的长度它将覆盖操作系统限定的队列的最大长度在以下几种情况中,仍然会采用操作系统限定的队列的最大长度:backlog参数的值大于操作系统限定的队列的最大长度;backlog参数的值大于或等于0;在ServerSocket构造方法中没有设置backlog参数。(2)设定客户连接请求队列的长度(3)设定绑定的IP地址如果主机只有一个IP地址,那么默认情况下,服务器程序就与该IP地址绑定ServerSocket(intport,intbacklog,InetAddressbindAddr)bindAddr显式指定服务器要绑定的IP地址该构造方法适用于具有多个IP地址的主机假定一个主机有两个网卡,一个网卡用于连接到Internet,IP地址为12,还有一个网卡用于连接到本地局域网,IP地址为。如果服务器仅仅被本地局域网中的客户访问,那么可以按如下方式创建ServerSocket:

ServerSocketserverSocket=newServerSocket(8000,10,InetAddress.getByName(""));(3)设定绑定的IP地址(4)默认构造方法的作用通过不带参数的构造方法创建的ServerSocket不与任何端口绑定,接下来还需要通过bind()方法与特定端口绑定。这个默认构造方法的用途是,允许服务器在绑定到特定端口之前,先设置ServerSocket的一些选项一旦服务器与特定端口绑定,有些选项就不能再改变了。如:在以下代码中,先把ServerSocket的SO_REUSEADDR选项设为true,然后再把它与8000端口绑定:ServerSocketserverSocket=newServerSocket();ServerSocket.setReuseAddress(true);

//设置ServerSocket的选项ServerSocket.bind(newInetSocketAddress(8000));//与8000端口绑定如果把以上程序代码改为:ServerSocketserverSocket=newServerSocket(8000);ServerSocket.setReuseAddress(true);

//设置ServerSocket的选项ServerSocket.setReuseAddress(true)方法就不起任何作用了,SO_REUSEADDR选项必须在服务器绑定端口之前设置才有效(4)默认构造方法的作用5.2基于TCP/IP的服务器与客户机通信

项目36TCP服务器端程序2.接收和关闭与客户的连接ServerSocket的accept()方法从连接请求队列中取出一个客户的连接请求创建与客户连接的Socket对象,并将它返回如果队列中没有连接请求,accept()方法就会一直等待,直到接收到了连接请求才返回。服务器从Socket对象中获得输入流和输出流,就能与客户交换数据。当服务器正在进行发送数据的操作时,如果客户端断开了连接,那么服务器端会抛出一个IOException的子类SocketException异常:.SocketException:Connectionresetbypeer

这只是服务器与单个客户通信中出现的异常,这种异常应该被捕获,使得服务器能继续与其他客户通信5.2基于TCP/IP的服务器与客户机通信

项目365.2基于TCP/IP的服务器与客户机通信

项目36TCP服务器端程序3.关闭ServerSocketServerSocket的close()方法使服务器释放占用的端口,并且断开与所有客户的连接当一个服务器程序运行结束时,即使没有执行ServerSocket的close()方法,操作系统也会释放这个服务器占用的端口服务器程序并不一定要在结束之前执行ServerSocket的close()方法。如果希望及时释放服务器的端口,以便让其他程序能占用该端口,则可以显式调用ServerSocket的close()方法5.2基于TCP/IP的服务器与客户机通信

项目365.2基于TCP/IP的服务器与客户机通信

项目36TCP服务器端程序ServerSocket类常用方法主要功能Socket

accept()侦听并接受到此套接字的连接voidbind(SocketAddress

endpoint)将ServerSocket绑定到特定地址(IP地址和端口号)voidbind(SocketAddress

endpoint,int

backlog)将ServerSocket绑定到特定地址(IP地址和端口号)voidclose()关闭此套接字InetAddress

getInetAddress()返回此服务器套接字的本地地址5.2基于TCP/IP的服务器与客户机通信

项目36ServerSocket类常用方法intgetLocalPort()返回此套接字在其上侦听的端口SocketAddress

getLocalSocketAddress()返回此套接字绑定的端点的地址,如果尚未绑定则返回nullbooleanisBound()返回ServerSocket的绑定状态booleanisClosed()返回ServerSocket的关闭状态String

toString()作为String返回此套接字的实现地址和实现端口ServerSocket类常用方法intgetLocalP5.2基于TCP/IP的服务器与客户机通信

项目37TCP的客户端程序【技术要点】创建Socket类的对象,连接到指定服务器的监听端口定义输入、输出流从Socket对象中获取输入、输出流对象运用流对象获取从服务器端返回的消息,并向服务器发送消息关闭流和套接字5.2基于TCP/IP的服务器与客户机通信

项目375.2基于TCP/IP的服务器与客户机通信

项目37TCP的客户端程序【相关知识】Socket类实现客户端套接字(也可以就叫“套接字”)套接字是两台机器之间的通信端点套接字的实际工作由SocketImpl类的实例执行应用程序通过更改创建套接字实现的套接字工厂可以配置它自身,以创建适合本地防火墙的套接字构造方法publicSocket(Stringhost,intport)publicSocket(InetAddressaddress,intport)publicSocket(InetAddressaddress,intport,InetAddresslocalAddress,intLocalPort)5.2基于TCP/IP的服务器与客户机通信

项目37Socket类常用方法主要功能voidbind(SocketAddress

bindpoint)将套接字绑定到本地地址。voidclose()关闭此套接字。voidconnect(SocketAddress

endpoint)将此套接字连接到服务器。voidconnect(SocketAddress

endpoint,int

timeout)将此套接字连接到具有指定超时值的服务器。InetAddress

getInetAddress()返回套接字连接的地址。InputStream

getInputStream()返回此套接字的输入流。InetAddress

getLocalAddress()获取套接字绑定的本地地址。Socket类常用方法主要功能voidbind(SockeintgetLocalPort()返回此套接字绑定到的本地端口。SocketAddress

getLocalSocketAddress()返回此套接字绑定的端点的地址,如果尚未绑定则返回null。OutputStream

getOutputStream()返回此套接字的输出流。intgetPort()返回此套接字连接到的远程端口。SocketAddress

getRemoteSocketAddress()返回此套接字连接的端点的地址,如果未连接则返回getSendBufferSize()获取此Socket的SO_SNDBUF选项的值,该值是平台在Socket上输出时使用的缓冲区大小。intgetSoLinger()返回SO_LINGER的设置。intgetLocalPort()返回此套接字绑定到的本地5.2基于TCP/IP的服务器与客户机通信

项目37TCP的客户端程序booleanisBound()返回套接字的绑定状态。booleanisClosed()返回套接字的关闭状态。booleanisConnected()返回套接字的连接状态。booleanisInputShutdown()返回是否关闭套接字连接的半读状态(read-half)。booleanisOutputShutdown()返回是否关闭套接字连接的半写状态(write-half)。String

toString()将此套接字转换为String。5.2基于TCP/IP的服务器与客户机通信

项目375.3基于UDP的服务器与客户机通信

项目38基于UDP的聊天程序【技术要点】使用默认构造器,创建使用本机任何可用端口的数据包Socket的实例对象;创建BufferedReader类对象,用于从键盘获取用户输入的信息;创建DatagramPacket类对象,打包要发送的数据,调用DatagramSocket类的send()和receive()方法获取和发送数据报;使用UDP进行通信时,服务器与客户端基本相同,运行时,要先启动服务器端,然后启动客户端,服务器端与客户端之间建立连接就可以通信了,结束通过客户端向服务器端发送”bye”消息结束5.3基于UDP的服务器与客户机通信

项目38基于UDP的【相关知识】DatagramSocket类表示用来发送和接收数据报包的套接字数据报套接字是包投递服务的发送或接收点每个在数据报套接字上发送或接收的包都是单独编址和路由的从一台机器发送到另一台机器的多个包可能选择不同的路由,也可能按不同的顺序到达在DatagramSocket上总是启用UDP广播发送将DatagramSocket绑定到通配符地址。在某些实现中,将DatagramSocket绑定到一个更加具体的地址时广播包也可以被接收数据报包用来实现无连接包投递服务每条报文仅根据该包中包含的信息从一台机器路由到另一台机器从一台机器发送到另一台机器的多个包可能选择不同的路由,也可能按不同的顺序到达不对包投递做出保证【相关知识】5.3基于UDP的服务器与客户机通信

项目38基于UDP的聊天程序1.UDP协议概论UserDatagramProtocol的缩写,即用户数据报协议用来支持那些需要在计算机之间传输数据的网络应用包括网络视频会议系统在内的众多的客户/服务器模式的网络应用与TCP(传输控制协议)协议一样,UDP协议直接位于IP(网际协议)协议的顶层。根据OSI(开放系统互连)参考模型,UDP和TCP都属于传输层协议

温馨提示

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

评论

0/150

提交评论